diff options
author | Stan Iliev <stani@google.com> | 2017-12-18 14:46:30 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-18 20:10:12 +0000 |
commit | 45fd995b9652a8ba2e0b0cad480ca08763bda7e3 (patch) | |
tree | 07a1d1aefd6d0ec378f30b765f3d68d26f82ae85 /src | |
parent | ff5000830544f23a2af7a861068b1a8deebef7ba (diff) |
Apply color transform for Lattice fixed colors
This is fixing an issue with nine patch not drawing correctly
if there is a color transformaton.
Bug: b/69796044
Test: Ran lattice2 test for gbr-8888
Change-Id: Idadc2938222222750f0f8bfb12650569191b7ad9
Reviewed-on: https://skia-review.googlesource.com/83680
Commit-Queue: Stan Iliev <stani@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColorSpaceXformCanvas.cpp | 17 | ||||
-rw-r--r-- | src/core/SkColorSpaceXformer.cpp | 11 | ||||
-rw-r--r-- | src/core/SkColorSpaceXformer.h | 3 |
3 files changed, 27 insertions, 4 deletions
diff --git a/src/core/SkColorSpaceXformCanvas.cpp b/src/core/SkColorSpaceXformCanvas.cpp index b6d6c87aa1..db5642df00 100644 --- a/src/core/SkColorSpaceXformCanvas.cpp +++ b/src/core/SkColorSpaceXformCanvas.cpp @@ -164,8 +164,13 @@ public: const Lattice& lattice, const SkRect& dst, const SkPaint* paint) override { if (!fTarget->quickReject(dst)) { - fTarget->drawImageLattice(prepareImage(img).get(), lattice, dst, - MaybePaint(paint, fXformer.get())); + SkSTArray<16, SkColor> colorBuffer; + int count = lattice.fRectTypes && lattice.fColors ? + (lattice.fXCount + 1) * (lattice.fYCount + 1) : 0; + colorBuffer.reset(count); + fTarget->drawImageLattice(prepareImage(img).get(), + fXformer->apply(lattice, colorBuffer.begin(), count), + dst, MaybePaint(paint, fXformer.get())); } } void onDrawAtlas(const SkImage* atlas, const SkRSXform* xforms, const SkRect* tex, @@ -223,8 +228,12 @@ public: MaybePaint(paint, fXformer.get())); } - - fTarget->drawImageLattice(fXformer->apply(bitmap).get(), lattice, dst, + SkSTArray<16, SkColor> colorBuffer; + int count = lattice.fRectTypes && lattice.fColors? + (lattice.fXCount + 1) * (lattice.fYCount + 1) : 0; + colorBuffer.reset(count); + fTarget->drawImageLattice(fXformer->apply(bitmap).get(), + fXformer->apply(lattice, colorBuffer.begin(), count), dst, MaybePaint(paint, fXformer.get())); } void onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) override { diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp index 58b3f4958a..14be53482f 100644 --- a/src/core/SkColorSpaceXformer.cpp +++ b/src/core/SkColorSpaceXformer.cpp @@ -176,3 +176,14 @@ SkPaint SkColorSpaceXformer::apply(const SkPaint& src) { return dst; } + +SkCanvas::Lattice SkColorSpaceXformer::apply(const SkCanvas::Lattice& lattice, + SkColor* colorBuffer, int count) { + if (count) { + this->apply(colorBuffer, lattice.fColors, count); + return {lattice.fXDivs, lattice.fYDivs, lattice.fRectTypes, + lattice.fXCount, lattice.fYCount, lattice.fBounds, colorBuffer}; + } + + return lattice; +} diff --git a/src/core/SkColorSpaceXformer.h b/src/core/SkColorSpaceXformer.h index 5fa4d836b7..0286143f52 100644 --- a/src/core/SkColorSpaceXformer.h +++ b/src/core/SkColorSpaceXformer.h @@ -8,6 +8,7 @@ #ifndef SkColorSpaceXformer_DEFINED #define SkColorSpaceXformer_DEFINED +#include "SkCanvas.h" #include "SkColor.h" #include "SkRefCnt.h" #include "SkTHash.h" @@ -38,6 +39,8 @@ public: sk_sp<SkColorSpace> dst() const { return fDst; } + SkCanvas::Lattice apply(const SkCanvas::Lattice&, SkColor*, int); + private: SkColorSpaceXformer(sk_sp<SkColorSpace> dst, std::unique_ptr<SkColorSpaceXform> fromSRGB); |