diff options
author | Florin Malita <fmalita@chromium.org> | 2017-07-06 12:48:15 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-06 17:20:06 +0000 |
commit | 08252eca36dd438444e2a00acf5c895015668756 (patch) | |
tree | 6f8b9bf2435e969e1c68e75b824160e43e67d73d /tests/ImageFilterTest.cpp | |
parent | 6d9f42984d94a2e9116dd951d47cd65cd8f4d401 (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.cpp | 46 |
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); +} |