Make SkColorSpaceXformer::apply(SkPaint) safe to call recursively
Before, we would stomp on the original paint in the recursive call.
This fixes 4 gbr-8888 gms. Currently, this only affects loopers
and SkPaintImageFilter.
Bug: skia:6516
Change-Id: Ic47d637a912370c0a1ae8ef3282ad7d15d9902e3
Reviewed-on: https://skia-review.googlesource.com/14182
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp
index 0db303b..ce6fff6 100644
--- a/src/core/SkColorSpaceXformer.cpp
+++ b/src/core/SkColorSpaceXformer.cpp
@@ -79,52 +79,29 @@
return xformed;
}
-const SkPaint& SkColorSpaceXformer::apply(const SkPaint& src) {
- const SkPaint* result = &src;
- auto get_dst = [&] {
- if (result == &src) {
- fDstPaint = src;
- result = &fDstPaint;
- }
- return &fDstPaint;
- };
+SkPaint SkColorSpaceXformer::apply(const SkPaint& src) {
+ SkPaint dst = src;
// All SkColorSpaces have the same black point.
if (src.getColor() & 0xffffff) {
- get_dst()->setColor(this->apply(src.getColor()));
+ dst.setColor(this->apply(src.getColor()));
}
if (auto shader = src.getShader()) {
- auto replacement = shader->makeColorSpace(this);
- if (replacement.get() != shader) {
- get_dst()->setShader(std::move(replacement));
- }
+ dst.setShader(shader->makeColorSpace(this));
}
if (auto cf = src.getColorFilter()) {
- auto replacement = this->apply(cf);
- if (replacement.get() != cf) {
- get_dst()->setColorFilter(std::move(replacement));
- }
+ dst.setColorFilter(this->apply(cf));
}
if (auto looper = src.getDrawLooper()) {
- auto replacement = looper->makeColorSpace(this);
- if (replacement.get() != looper) {
- get_dst()->setDrawLooper(std::move(replacement));
- }
+ dst.setDrawLooper(looper->makeColorSpace(this));
}
if (auto imageFilter = src.getImageFilter()) {
- auto replacement = this->apply(imageFilter);
- if (replacement.get() != imageFilter) {
- get_dst()->setImageFilter(std::move(replacement));
- }
+ dst.setImageFilter(this->apply(imageFilter));
}
- return *result;
-}
-
-const SkPaint* SkColorSpaceXformer::apply(const SkPaint* src) {
- return src ? &this->apply(*src) : nullptr;
+ return dst;
}