diff options
author | reed <reed@google.com> | 2014-11-11 12:51:33 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-11 12:51:33 -0800 |
commit | f539b8cdee0204985edca028eec826ee94a0c472 (patch) | |
tree | cfea9a3650bcbcbebf91844faa75532b0d858b36 | |
parent | 842ab70966a344e8e9bdcb43ae41548c8e0f924b (diff) |
modify nothingToDraw to notice filters
This reverts commit c71ffd4e76d1abcd28ac74463349970f60a3350f.
TBR=
Review URL: https://codereview.chromium.org/683003003
-rw-r--r-- | expectations/gm/ignored-tests.txt | 3 | ||||
-rw-r--r-- | src/core/SkPaint.cpp | 17 | ||||
-rw-r--r-- | tests/PaintTest.cpp | 27 |
3 files changed, 46 insertions, 1 deletions
diff --git a/expectations/gm/ignored-tests.txt b/expectations/gm/ignored-tests.txt index 1ab0f5774c..6a2587d10d 100644 --- a/expectations/gm/ignored-tests.txt +++ b/expectations/gm/ignored-tests.txt @@ -55,3 +55,6 @@ complexclip2_rect_aa complexclip2_rrect_aa convex_poly_clip verttext + +#reed +modecolorfilters diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index ebdc866d65..4ccfce235a 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -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: diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp index 4c45eed761..c307aa94bc 100644 --- a/tests/PaintTest.cpp +++ b/tests/PaintTest.cpp @@ -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()); +} + |