aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2014-11-11 12:51:33 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-11-11 12:51:33 -0800
commitf539b8cdee0204985edca028eec826ee94a0c472 (patch)
treecfea9a3650bcbcbebf91844faa75532b0d858b36
parent842ab70966a344e8e9bdcb43ae41548c8e0f924b (diff)
modify nothingToDraw to notice filters
-rw-r--r--expectations/gm/ignored-tests.txt3
-rw-r--r--src/core/SkPaint.cpp17
-rw-r--r--tests/PaintTest.cpp27
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());
+}
+