More SkCSXformCanvas work.
- handle color arrays in drawPatch(), drawVertices(), drawAtlas() - color filters Color filter support is a one-off for SkModeColorFilter. I don't know any other color filters that are parameterized by a color. If there are any/many, we may want to wire up something more comprehensive here. Change-Id: Ibc89574e3a32d38af3bc2443a7d4bac0bb52d493 Reviewed-on: https://skia-review.googlesource.com/9601 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
This commit is contained in:
parent
7a5e0f3847
commit
49f33b8c84
@ -5,6 +5,7 @@
|
|||||||
* found in the LICENSE file.
|
* found in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "SkColorFilter.h"
|
||||||
#include "SkColorSpaceXform.h"
|
#include "SkColorSpaceXform.h"
|
||||||
#include "SkColorSpaceXformCanvas.h"
|
#include "SkColorSpaceXformCanvas.h"
|
||||||
#include "SkMakeUnique.h"
|
#include "SkMakeUnique.h"
|
||||||
@ -23,11 +24,15 @@ public:
|
|||||||
fFromSRGB = SkColorSpaceXform::New(SkColorSpace::MakeSRGB().get(), fTargetCS.get());
|
fFromSRGB = SkColorSpaceXform::New(SkColorSpace::MakeSRGB().get(), fTargetCS.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xform(SkColor* xformed, const SkColor* srgb, int n) const {
|
||||||
|
SkAssertResult(fFromSRGB->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, xformed,
|
||||||
|
SkColorSpaceXform::kBGRA_8888_ColorFormat, srgb,
|
||||||
|
n, kUnpremul_SkAlphaType));
|
||||||
|
}
|
||||||
|
|
||||||
SkColor xform(SkColor srgb) const {
|
SkColor xform(SkColor srgb) const {
|
||||||
SkColor xformed;
|
SkColor xformed;
|
||||||
SkAssertResult(fFromSRGB->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &xformed,
|
this->xform(&xformed, &srgb, 1);
|
||||||
SkColorSpaceXform::kBGRA_8888_ColorFormat, &srgb,
|
|
||||||
1, kUnpremul_SkAlphaType));
|
|
||||||
return xformed;
|
return xformed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,23 +51,31 @@ public:
|
|||||||
get_lazy()->setColor(this->xform(paint.getColor()));
|
get_lazy()->setColor(this->xform(paint.getColor()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// As far as I know, SkModeColorFilter is the only color filter that holds a color.
|
||||||
|
if (auto cf = paint.getColorFilter()) {
|
||||||
|
SkColor color;
|
||||||
|
SkBlendMode mode;
|
||||||
|
if (cf->asColorMode(&color, &mode)) {
|
||||||
|
get_lazy()->setColorFilter(SkColorFilter::MakeModeFilter(this->xform(color), mode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - shaders
|
// - shaders
|
||||||
// - color filters
|
|
||||||
// - image filters?
|
// - image filters?
|
||||||
|
|
||||||
return *result;
|
return *result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SkPaint* xform(const SkPaint* paint, SkTLazy<SkPaint>* lazy) const {
|
||||||
|
return paint ? &this->xform(*paint, lazy) : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
sk_sp<const SkImage> xform(const SkImage* img) const {
|
sk_sp<const SkImage> xform(const SkImage* img) const {
|
||||||
// TODO: for real
|
// TODO: for real
|
||||||
return sk_ref_sp(img);
|
return sk_ref_sp(img);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SkPaint* xform(const SkPaint* paint, SkTLazy<SkPaint>* lazy) const {
|
|
||||||
return paint ? &this->xform(*paint, lazy) : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void onDrawPaint(const SkPaint& paint) override {
|
void onDrawPaint(const SkPaint& paint) override {
|
||||||
SkTLazy<SkPaint> lazy;
|
SkTLazy<SkPaint> lazy;
|
||||||
fTarget->drawPaint(this->xform(paint, &lazy));
|
fTarget->drawPaint(this->xform(paint, &lazy));
|
||||||
@ -99,7 +112,12 @@ public:
|
|||||||
}
|
}
|
||||||
void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texs[4],
|
void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texs[4],
|
||||||
SkBlendMode mode, const SkPaint& paint) override {
|
SkBlendMode mode, const SkPaint& paint) override {
|
||||||
// TODO: colors
|
SkColor xformed[4];
|
||||||
|
if (colors) {
|
||||||
|
this->xform(xformed, colors, 4);
|
||||||
|
colors = xformed;
|
||||||
|
}
|
||||||
|
|
||||||
SkTLazy<SkPaint> lazy;
|
SkTLazy<SkPaint> lazy;
|
||||||
fTarget->drawPatch(cubics, colors, texs, mode, this->xform(paint, &lazy));
|
fTarget->drawPatch(cubics, colors, texs, mode, this->xform(paint, &lazy));
|
||||||
}
|
}
|
||||||
@ -112,7 +130,13 @@ public:
|
|||||||
const SkPoint* verts, const SkPoint* texs, const SkColor* colors,
|
const SkPoint* verts, const SkPoint* texs, const SkColor* colors,
|
||||||
SkBlendMode mode,
|
SkBlendMode mode,
|
||||||
const uint16_t* indices, int indexCount, const SkPaint& paint) override {
|
const uint16_t* indices, int indexCount, const SkPaint& paint) override {
|
||||||
// TODO: colors
|
SkTArray<SkColor> xformed;
|
||||||
|
if (colors) {
|
||||||
|
xformed.reset(count);
|
||||||
|
this->xform(xformed.begin(), colors, count);
|
||||||
|
colors = xformed.begin();
|
||||||
|
}
|
||||||
|
|
||||||
SkTLazy<SkPaint> lazy;
|
SkTLazy<SkPaint> lazy;
|
||||||
fTarget->drawVertices(vmode, count, verts, texs, colors, mode, indices, indexCount,
|
fTarget->drawVertices(vmode, count, verts, texs, colors, mode, indices, indexCount,
|
||||||
this->xform(paint, &lazy));
|
this->xform(paint, &lazy));
|
||||||
@ -190,7 +214,13 @@ public:
|
|||||||
void onDrawAtlas(const SkImage* atlas, const SkRSXform* xforms, const SkRect* tex,
|
void onDrawAtlas(const SkImage* atlas, const SkRSXform* xforms, const SkRect* tex,
|
||||||
const SkColor* colors, int count, SkBlendMode mode,
|
const SkColor* colors, int count, SkBlendMode mode,
|
||||||
const SkRect* cull, const SkPaint* paint) override {
|
const SkRect* cull, const SkPaint* paint) override {
|
||||||
// TODO: colors
|
SkTArray<SkColor> xformed;
|
||||||
|
if (colors) {
|
||||||
|
xformed.reset(count);
|
||||||
|
this->xform(xformed.begin(), colors, count);
|
||||||
|
colors = xformed.begin();
|
||||||
|
}
|
||||||
|
|
||||||
SkTLazy<SkPaint> lazy;
|
SkTLazy<SkPaint> lazy;
|
||||||
fTarget->drawAtlas(this->xform(atlas).get(), xforms, tex, colors, count, mode, cull,
|
fTarget->drawAtlas(this->xform(atlas).get(), xforms, tex, colors, count, mode, cull,
|
||||||
this->xform(paint, &lazy));
|
this->xform(paint, &lazy));
|
||||||
|
Loading…
Reference in New Issue
Block a user