aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/ImageFilterTest.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-07-06 12:48:15 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-06 17:20:06 +0000
commit08252eca36dd438444e2a00acf5c895015668756 (patch)
tree6f8b9bf2435e969e1c68e75b824160e43e67d73d /tests/ImageFilterTest.cpp
parent6d9f42984d94a2e9116dd951d47cd65cd8f4d401 (diff)
Image filter DAG test for makeColorSpace()
Change-Id: I8aa3a8c701fdfe215cae639bc9c7082340c756d4 Reviewed-on: https://skia-review.googlesource.com/21721 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'tests/ImageFilterTest.cpp')
-rw-r--r--tests/ImageFilterTest.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index f8435868c4..c6d184dfea 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -10,6 +10,7 @@
#include "SkCanvas.h"
#include "SkColorFilterImageFilter.h"
#include "SkColorMatrixFilter.h"
+#include "SkColorSpaceXformer.h"
#include "SkComposeImageFilter.h"
#include "SkDisplacementMapEffect.h"
#include "SkDropShadowImageFilter.h"
@@ -1877,3 +1878,48 @@ DEF_TEST(ImageFilterComplexCTM, reporter) {
REPORTER_ASSERT(reporter, canHandle == rec.fExpectCanHandle);
}
}
+
+// Test that transforming the filter DAG doesn't clone shared nodes multiple times.
+DEF_TEST(ImageFilterColorSpaceDAG, reporter) {
+
+ // Helper for counting makeColorSpace() clones.
+ class TestFilter final : public SkImageFilter {
+ public:
+ TestFilter() : INHERITED(nullptr, 0, nullptr) {}
+
+#ifndef SK_IGNORE_TO_STRING
+ void toString(SkString*) const override {}
+#endif
+ Factory getFactory() const override { return nullptr; }
+
+ size_t cloneCount() const { return fCloneCount; }
+
+ protected:
+ sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* src, const Context&,
+ SkIPoint* offset) const override {
+ return nullptr;
+ }
+ sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override {
+ fCloneCount++;
+ return sk_ref_sp(const_cast<TestFilter*>(this));
+ }
+
+ private:
+ typedef SkImageFilter INHERITED;
+
+ mutable size_t fCloneCount = 0;
+ };
+
+ auto filter = sk_make_sp<TestFilter>();
+ REPORTER_ASSERT(reporter, filter->cloneCount() == 0u);
+
+ // Build a DAG referencing the filter twice.
+ auto complexFilter = SkMergeImageFilter::Make(filter, SkOffsetImageFilter::Make(1, 1, filter));
+ REPORTER_ASSERT(reporter, filter->cloneCount() == 0u);
+
+ auto xformer = SkColorSpaceXformer::Make(SkColorSpace::MakeSRGB());
+ auto xformedFilter = xformer->apply(complexFilter.get());
+
+ // FIXME: clone count should be 1 at this point.
+ REPORTER_ASSERT(reporter, filter->cloneCount() == 2u);
+}