diff options
-rw-r--r-- | bench/ImageFilterDAGBench.cpp | 8 | ||||
-rw-r--r-- | bench/MergeBench.cpp | 2 | ||||
-rw-r--r-- | fuzz/FilterFuzz.cpp | 3 | ||||
-rw-r--r-- | fuzz/FuzzCanvas.cpp | 10 | ||||
-rw-r--r-- | gm/imagefilterscropped.cpp | 1 | ||||
-rw-r--r-- | gm/imagefiltersgraph.cpp | 3 | ||||
-rw-r--r-- | include/core/SkPicture.h | 3 | ||||
-rw-r--r-- | include/effects/SkMergeImageFilter.h | 32 | ||||
-rw-r--r-- | samplecode/SampleFilterFuzz.cpp | 3 | ||||
-rw-r--r-- | src/core/SkReadBuffer.h | 1 | ||||
-rw-r--r-- | src/effects/SkMergeImageFilter.cpp | 96 | ||||
-rw-r--r-- | tests/ImageFilterTest.cpp | 13 |
12 files changed, 52 insertions, 123 deletions
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp index 350510bf9d..aa65a1e0fd 100644 --- a/bench/ImageFilterDAGBench.cpp +++ b/bench/ImageFilterDAGBench.cpp @@ -32,13 +32,11 @@ protected: for (int j = 0; j < loops; j++) { sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr)); sk_sp<SkImageFilter> inputs[kNumInputs]; - SkBlendMode modes[kNumInputs]; for (int i = 0; i < kNumInputs; ++i) { inputs[i] = blur; - modes[i] = SkBlendMode::kSrcOver; } SkPaint paint; - paint.setImageFilter(SkMergeImageFilter::MakeN(inputs, kNumInputs, modes)); + paint.setImageFilter(SkMergeImageFilter::Make(inputs, kNumInputs)); canvas->drawRect(rect, paint); } } @@ -71,12 +69,10 @@ protected: for (int j = 0; j < loops; j++) { sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr)); sk_sp<SkImageFilter> inputs[kNumInputs]; - SkBlendMode modes[kNumInputs]; for (int i = 0; i < kNumInputs; ++i) { inputs[i] = blur; - modes[i] = SkBlendMode::kSrcOver; } - sk_sp<SkImageFilter> mergeFilter = SkMergeImageFilter::MakeN(inputs, kNumInputs, modes); + sk_sp<SkImageFilter> mergeFilter = SkMergeImageFilter::Make(inputs, kNumInputs); image = image->makeWithFilter(mergeFilter.get(), subset, subset, &discardSubset, &offset); SkASSERT(image && image->dimensions() == fImage->dimensions()); diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp index c37d198f7b..10aa8b8e03 100644 --- a/bench/MergeBench.cpp +++ b/bench/MergeBench.cpp @@ -81,7 +81,7 @@ protected: private: sk_sp<SkImageFilter> mergeBitmaps() { return SkMergeImageFilter::Make(SkImageSource::Make(fCheckerboard), - SkImageSource::Make(fImage), SkBlendMode::kSrcOver); + SkImageSource::Make(fImage)); } bool fIsSmall; diff --git a/fuzz/FilterFuzz.cpp b/fuzz/FilterFuzz.cpp index b2d99b771b..d15370707c 100644 --- a/fuzz/FilterFuzz.cpp +++ b/fuzz/FilterFuzz.cpp @@ -595,8 +595,7 @@ static sk_sp<SkImageFilter> make_image_filter(bool canBeNull) { case MERGE: { sk_sp<SkImageFilter> filA = make_image_filter(); sk_sp<SkImageFilter> filB = make_image_filter(); - SkBlendMode blend = make_blendmode(); - filter = SkMergeImageFilter::Make(filA, filB, blend); + filter = SkMergeImageFilter::Make(filA, filB); break; } case COLOR: { diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp index fb90c06305..cdca73118b 100644 --- a/fuzz/FuzzCanvas.cpp +++ b/fuzz/FuzzCanvas.cpp @@ -838,34 +838,30 @@ static sk_sp<SkImageFilter> make_fuzz_imageFilter(Fuzz* fuzz, int depth) { case 14: { sk_sp<SkImageFilter> first = make_fuzz_imageFilter(fuzz, depth - 1); sk_sp<SkImageFilter> second = make_fuzz_imageFilter(fuzz, depth - 1); - SkBlendMode blendMode; bool useCropRect; - fuzz->next(&useCropRect, &blendMode); + fuzz->next(&useCropRect); SkImageFilter::CropRect cropRect; if (useCropRect) { fuzz->next(&cropRect); } - return SkMergeImageFilter::Make(std::move(first), std::move(second), blendMode, + return SkMergeImageFilter::Make(std::move(first), std::move(second), useCropRect ? &cropRect : nullptr); } case 15: { constexpr int kMaxCount = 4; sk_sp<SkImageFilter> ifs[kMaxCount]; - SkBlendMode blendModes[kMaxCount]; int count; fuzz->nextRange(&count, 1, kMaxCount); for (int i = 0; i < count; ++i) { ifs[i] = make_fuzz_imageFilter(fuzz, depth - 1); } - fuzz->nextN(blendModes, count); bool useCropRect; fuzz->next(&useCropRect); SkImageFilter::CropRect cropRect; if (useCropRect) { fuzz->next(&cropRect); } - return SkMergeImageFilter::MakeN(ifs, count, blendModes, - useCropRect ? &cropRect : nullptr); + return SkMergeImageFilter::Make(ifs, count, useCropRect ? &cropRect : nullptr); } case 16: { int rx, ry; diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp index 5af6492007..92b5fe0743 100644 --- a/gm/imagefilterscropped.cpp +++ b/gm/imagefilterscropped.cpp @@ -145,7 +145,6 @@ protected: SkErodeImageFilter::Make(8, 8, nullptr, &cropRect), SkMergeImageFilter::Make(nullptr, std::move(cfOffset), - SkBlendMode::kSrcOver, &cropRect), SkBlurImageFilter::Make(8.0f, 8.0f, nullptr, &bogusRect), SkColorFilterImageFilter::Make(cf, nullptr, &bogusRect), diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp index 3436d6953f..a369dc0c59 100644 --- a/gm/imagefiltersgraph.cpp +++ b/gm/imagefiltersgraph.cpp @@ -52,8 +52,7 @@ protected: sk_sp<SkImageFilter> erode(SkErodeImageFilter::Make(4, 4, blur)); sk_sp<SkImageFilter> color(SkColorFilterImageFilter::Make(std::move(cf), std::move(erode))); - sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color, - SkBlendMode::kSrcOver)); + sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color)); SkPaint paint; paint.setImageFilter(std::move(merge)); diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h index f90e17af3e..e1d8bbab2c 100644 --- a/include/core/SkPicture.h +++ b/include/core/SkPicture.h @@ -202,10 +202,11 @@ private: // V52: Remove SkTextBlob::fRunCount // V53: SaveLayerRec clip mask // V54: ComposeShader can use a Mode or a Lerp + // V55: Drop blendmode[] from MergeImageFilter // Only SKPs within the min/current picture version range (inclusive) can be read. static const uint32_t MIN_PICTURE_VERSION = 51; // Produced by Chrome ~M56. - static const uint32_t CURRENT_PICTURE_VERSION = 54; + static const uint32_t CURRENT_PICTURE_VERSION = 55; static bool IsValidPictInfo(const SkPictInfo& info); static sk_sp<SkPicture> Forwardport(const SkPictInfo&, diff --git a/include/effects/SkMergeImageFilter.h b/include/effects/SkMergeImageFilter.h index 03f0cea4e0..679336103f 100644 --- a/include/effects/SkMergeImageFilter.h +++ b/include/effects/SkMergeImageFilter.h @@ -8,17 +8,27 @@ #ifndef SkMergeImageFilter_DEFINED #define SkMergeImageFilter_DEFINED -#include "SkBlendMode.h" #include "SkImageFilter.h" class SK_API SkMergeImageFilter : public SkImageFilter { public: - ~SkMergeImageFilter() override; + static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter>* const filters, int count, + const CropRect* cropRect = nullptr); static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second, - SkBlendMode, const CropRect* cropRect = nullptr); - static sk_sp<SkImageFilter> MakeN(sk_sp<SkImageFilter>[], int count, const SkBlendMode[], - const CropRect* cropRect = nullptr); + const CropRect* cropRect = nullptr) { + sk_sp<SkImageFilter> array[] = { + std::move(first), + std::move(second), + }; + return Make(array, 2, cropRect); + } + + // Change caller in chrome to use Make(...) instead + static sk_sp<SkImageFilter> MakeN(sk_sp<SkImageFilter> array[], int count, std::nullptr_t, + const CropRect* cropRect = nullptr) { + return Make(array, count, cropRect); + } SK_TO_STRING_OVERRIDE() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter) @@ -31,17 +41,7 @@ protected: bool onCanHandleComplexCTM() const override { return true; } private: - SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkBlendMode modes[], - const CropRect* cropRect); - - uint8_t* fModes; // SkBlendMode - - // private storage, to avoid dynamically allocating storage for our copy - // of the modes (unless the count is so large we can't fit). - intptr_t fStorage[16]; - - void initAllocModes(); - void initModes(const SkBlendMode[]); + SkMergeImageFilter(sk_sp<SkImageFilter>* const filters, int count, const CropRect* cropRect); typedef SkImageFilter INHERITED; }; diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index 7254192fe5..dcb740d4d8 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -555,8 +555,7 @@ static sk_sp<SkImageFilter> make_image_filter(bool canBeNull) { break; case MERGE: filter = SkMergeImageFilter::Make(make_image_filter(), - make_image_filter(), - make_xfermode()); + make_image_filter()); break; case COLOR: { sk_sp<SkColorFilter> cf(make_color_filter()); diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h index 6a2c5252c7..d14558f7f3 100644 --- a/src/core/SkReadBuffer.h +++ b/src/core/SkReadBuffer.h @@ -72,6 +72,7 @@ public: */ kTextBlobImplicitRunCount_Version = 52, kComposeShaderCanLerp_Version = 54, + kNoModesInMergeImageFilter_Verison = 55, }; /** diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp index e7c3f51df7..e1098800ef 100644 --- a/src/effects/SkMergeImageFilter.cpp +++ b/src/effects/SkMergeImageFilter.cpp @@ -14,62 +14,17 @@ #include "SkWriteBuffer.h" #include "SkValidationUtils.h" -sk_sp<SkImageFilter> SkMergeImageFilter::Make(sk_sp<SkImageFilter> first, - sk_sp<SkImageFilter> second, - SkBlendMode mode, - const CropRect* cropRect) { - sk_sp<SkImageFilter> inputs[2] = { first, second }; - SkBlendMode modes[2] = { mode, mode }; - return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cropRect)); -} - -sk_sp<SkImageFilter> SkMergeImageFilter::MakeN(sk_sp<SkImageFilter> filters[], int count, - const SkBlendMode modes[], +sk_sp<SkImageFilter> SkMergeImageFilter::Make(sk_sp<SkImageFilter>* const filters, int count, const CropRect* cropRect) { - return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes, cropRect)); + return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, cropRect)); } /////////////////////////////////////////////////////////////////////////////// -void SkMergeImageFilter::initAllocModes() { - int inputCount = this->countInputs(); - if (inputCount) { - size_t size = sizeof(uint8_t) * inputCount; - if (size <= sizeof(fStorage)) { - fModes = SkTCast<uint8_t*>(fStorage); - } else { - fModes = SkTCast<uint8_t*>(sk_malloc_throw(size)); - } - } else { - fModes = nullptr; - } -} - -void SkMergeImageFilter::initModes(const SkBlendMode modes[]) { - if (modes) { - this->initAllocModes(); - int inputCount = this->countInputs(); - for (int i = 0; i < inputCount; ++i) { - fModes[i] = SkToU8((unsigned)modes[i]); - } - } else { - fModes = nullptr; - } -} - -SkMergeImageFilter::SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, - const SkBlendMode modes[], +SkMergeImageFilter::SkMergeImageFilter(sk_sp<SkImageFilter>* const filters, int count, const CropRect* cropRect) : INHERITED(filters, count, cropRect) { SkASSERT(count >= 0); - this->initModes(modes); -} - -SkMergeImageFilter::~SkMergeImageFilter() { - - if (fModes != SkTCast<uint8_t*>(fStorage)) { - sk_free(fModes); - } } sk_sp<SkSpecialImage> SkMergeImageFilter::onFilterImage(SkSpecialImage* source, const Context& ctx, @@ -128,14 +83,9 @@ sk_sp<SkSpecialImage> SkMergeImageFilter::onFilterImage(SkSpecialImage* source, continue; } - SkPaint paint; - if (fModes) { - paint.setBlendMode((SkBlendMode)fModes[i]); - } - inputs[i]->draw(canvas, SkIntToScalar(offsets[i].x() - x0), SkIntToScalar(offsets[i].y() - y0), - &paint); + nullptr); } offset->fX = bounds.left(); @@ -145,14 +95,12 @@ sk_sp<SkSpecialImage> SkMergeImageFilter::onFilterImage(SkSpecialImage* source, sk_sp<SkImageFilter> SkMergeImageFilter::onMakeColorSpace(SkColorSpaceXformer* xformer) const { SkSTArray<5, sk_sp<SkImageFilter>> inputs(this->countInputs()); - SkSTArray<5, SkBlendMode> modes(this->countInputs()); for (int i = 0; i < this->countInputs(); i++) { inputs.push_back(this->getInput(i) ? this->getInput(i)->makeColorSpace(xformer) : nullptr); - modes.push_back(fModes ? (SkBlendMode) fModes[i] : SkBlendMode::kSrcOver); } - return SkMergeImageFilter::MakeN(inputs.begin(), this->countInputs(), modes.begin(), - this->getCropRectIfSet()); + return SkMergeImageFilter::Make(inputs.begin(), this->countInputs(), + this->getCropRectIfSet()); } sk_sp<SkFlattenable> SkMergeImageFilter::CreateProc(SkReadBuffer& buffer) { @@ -162,31 +110,25 @@ sk_sp<SkFlattenable> SkMergeImageFilter::CreateProc(SkReadBuffer& buffer) { } const int count = common.inputCount(); - bool hasModes = buffer.readBool(); - if (hasModes) { - SkAutoSTArray<4, SkBlendMode> modes(count); - SkAutoSTArray<4, uint8_t> modes8(count); - if (!buffer.readByteArray(modes8.get(), count)) { - return nullptr; - } - for (int i = 0; i < count; ++i) { - modes[i] = (SkBlendMode)modes8[i]; - buffer.validate(SkIsValidMode(modes[i])); + if (buffer.isVersionLT(SkReadBuffer::kNoModesInMergeImageFilter_Verison)) { + bool hasModes = buffer.readBool(); + if (hasModes) { + // Older pictures may have stored blendmodes, but by inspection we think these were + // all src-over, so we have removed support for storing these. + SkAutoSTArray<4, uint8_t> modes8(count); + if (!buffer.readByteArray(modes8.get(), count)) { + return nullptr; + } + if (!buffer.isValid()) { + return nullptr; + } } - if (!buffer.isValid()) { - return nullptr; - } - return MakeN(common.inputs(), count, modes.get(), &common.cropRect()); } - return MakeN(common.inputs(), count, nullptr, &common.cropRect()); + return Make(common.inputs(), count, &common.cropRect()); } void SkMergeImageFilter::flatten(SkWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); - buffer.writeBool(fModes != nullptr); - if (fModes) { - buffer.writeByteArray(fModes, this->countInputs() * sizeof(fModes[0])); - } } #ifndef SK_IGNORE_TO_STRING diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp index d884644893..95a1333042 100644 --- a/tests/ImageFilterTest.cpp +++ b/tests/ImageFilterTest.cpp @@ -196,9 +196,7 @@ public: input, cropRect)); } - this->addFilter("merge", SkMergeImageFilter::Make(input, input, - SkBlendMode::kSrcOver, - cropRect)); + this->addFilter("merge", SkMergeImageFilter::Make(input, input, cropRect)); { SkPaint greenColorShaderPaint; @@ -213,8 +211,7 @@ public: this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Make( - std::move(paintFilterLeft), std::move(paintFilterRight), - SkBlendMode::kSrcOver, cropRect)); + std::move(paintFilterLeft), std::move(paintFilterRight), cropRect)); } this->addFilter("offset", @@ -959,7 +956,7 @@ static void test_imagefilter_merge_result_size(skiatest::Reporter* reporter, GrC greenBM.eraseColor(SK_ColorGREEN); sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM)); sk_sp<SkImageFilter> source(SkImageSource::Make(std::move(greenImage))); - sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source, SkBlendMode::kSrcOver)); + sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source)); sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 1)); @@ -1865,13 +1862,13 @@ DEF_TEST(ImageFilterComplexCTM, reporter) { } recs[] = { { cfif, true }, { SkColorFilterImageFilter::Make(cf, cfif), true }, - { SkMergeImageFilter::Make(cfif, cfif, SkBlendMode::kSrcOver), true }, + { SkMergeImageFilter::Make(cfif, cfif), true }, { SkComposeImageFilter::Make(cfif, cfif), true }, { blif, false }, { SkBlurImageFilter::Make(3, 3, cfif), false }, { SkColorFilterImageFilter::Make(cf, blif), false }, - { SkMergeImageFilter::Make(cfif, blif, SkBlendMode::kSrcOver), false }, + { SkMergeImageFilter::Make(cfif, blif), false }, { SkComposeImageFilter::Make(blif, cfif), false }, }; |