modify nothingToDraw to notice filters

BUG=skia:

Review URL: https://codereview.chromium.org/717753002
This commit is contained in:
reed 2014-11-11 11:00:55 -08:00 committed by Commit bot
parent bf5dd4170f
commit d5688c5092
2 changed files with 43 additions and 1 deletions

View File

@ -2377,6 +2377,18 @@ bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) {
///////////////////////////////////////////////////////////////////////////////
// return true if the filter exists, and may affect alpha
static bool affects_alpha(const SkColorFilter* cf) {
return cf && !(cf->getFlags() & SkColorFilter::kAlphaUnchanged_Flag);
}
// return true if the filter exists, and may affect alpha
static bool affects_alpha(const SkImageFilter* imf) {
// TODO: check if we should allow imagefilters to broadcast that they don't affect alpha
// ala colorfilters
return imf != NULL;
}
bool SkPaint::nothingToDraw() const {
if (fLooper) {
return false;
@ -2389,7 +2401,10 @@ bool SkPaint::nothingToDraw() const {
case SkXfermode::kDstOut_Mode:
case SkXfermode::kDstOver_Mode:
case SkXfermode::kPlus_Mode:
return 0 == this->getAlpha();
if (0 == this->getAlpha()) {
return !affects_alpha(fColorFilter) && !affects_alpha(fImageFilter);
}
break;
case SkXfermode::kDst_Mode:
return true;
default:

View File

@ -344,3 +344,30 @@ DEF_TEST(Paint_getHash, r) {
paint.setHinting(SkPaint::kNormal_Hinting);
REPORTER_ASSERT(r, paint.getHash() == defaultHash);
}
#include "SkColorMatrixFilter.h"
DEF_TEST(Paint_nothingToDraw, r) {
SkPaint paint;
REPORTER_ASSERT(r, !paint.nothingToDraw());
paint.setAlpha(0);
REPORTER_ASSERT(r, paint.nothingToDraw());
paint.setAlpha(0xFF);
paint.setXfermodeMode(SkXfermode::kDst_Mode);
REPORTER_ASSERT(r, paint.nothingToDraw());
paint.setAlpha(0);
paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
SkColorMatrix cm;
cm.setIdentity(); // does not change alpha
paint.setColorFilter(SkColorMatrixFilter::Create(cm))->unref();
REPORTER_ASSERT(r, paint.nothingToDraw());
cm.postTranslate(0, 0, 0, 1); // wacks alpha
paint.setColorFilter(SkColorMatrixFilter::Create(cm))->unref();
REPORTER_ASSERT(r, !paint.nothingToDraw());
}