aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkMergeImageFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/SkMergeImageFilter.cpp')
-rw-r--r--src/effects/SkMergeImageFilter.cpp96
1 files changed, 19 insertions, 77 deletions
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