aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkColorFilterShader.cpp15
-rw-r--r--src/core/SkColorFilterShader.h3
-rw-r--r--tests/SkColor4fTest.cpp59
3 files changed, 49 insertions, 28 deletions
diff --git a/src/core/SkColorFilterShader.cpp b/src/core/SkColorFilterShader.cpp
index dc90f95762..81123f6dff 100644
--- a/src/core/SkColorFilterShader.cpp
+++ b/src/core/SkColorFilterShader.cpp
@@ -43,10 +43,15 @@ uint32_t SkColorFilterShader::FilterShaderContext::getFlags() const {
uint32_t shaderF = fShaderContext->getFlags();
uint32_t filterF = filterShader.fFilter->getFlags();
- // if the filter might change alpha, clear the opaque flag in the shader
+ // If the filter does not support a given feature, but sure to clear the corresponding flag
+ // in the shader flags.
+ //
if (!(filterF & SkColorFilter::kAlphaUnchanged_Flag)) {
shaderF &= ~SkShader::kOpaqueAlpha_Flag;
}
+ if (!(filterF & SkColorFilter::kSupports4f_Flag)) {
+ shaderF &= ~SkShader::kSupports4f_Flag;
+ }
return shaderF;
}
@@ -84,6 +89,14 @@ void SkColorFilterShader::FilterShaderContext::shadeSpan(int x, int y, SkPMColor
filterShader.fFilter->filterSpan(result, count, result);
}
+void SkColorFilterShader::FilterShaderContext::shadeSpan4f(int x, int y, SkPM4f result[],
+ int count) {
+ const SkColorFilterShader& filterShader = static_cast<const SkColorFilterShader&>(fShader);
+
+ fShaderContext->shadeSpan4f(x, y, result, count);
+ filterShader.fFilter->filterSpan4f(result, count, result);
+}
+
#if SK_SUPPORT_GPU
/////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkColorFilterShader.h b/src/core/SkColorFilterShader.h
index e92908ee83..55625b6991 100644
--- a/src/core/SkColorFilterShader.h
+++ b/src/core/SkColorFilterShader.h
@@ -33,7 +33,8 @@ public:
uint32_t getFlags() const override;
void shadeSpan(int x, int y, SkPMColor[], int count) override;
-
+ void shadeSpan4f(int x, int y, SkPM4f[], int count) override;
+
void set3DMask(const SkMask* mask) override {
// forward to our proxy
fShaderContext->set3DMask(mask);
diff --git a/tests/SkColor4fTest.cpp b/tests/SkColor4fTest.cpp
index 737200c76e..48a0c38286 100644
--- a/tests/SkColor4fTest.cpp
+++ b/tests/SkColor4fTest.cpp
@@ -77,9 +77,29 @@ DEF_TEST(Color4f_premul, reporter) {
//////////////////////////////////////////////////////////////////////////////////////////////////
-static SkShader* make_color() { return SkShader::CreateColorShader(0xFFBB8855); }
+static SkColorFilter* make_mode_cf() {
+ return SkColorFilter::CreateModeFilter(0xFFBB8855, SkXfermode::kPlus_Mode);
+}
-static SkShader* make_image() {
+static SkColorFilter* make_mx_cf() {
+ const float mx[] = {
+ 0.5f, 0, 0, 0, 0.1f,
+ 0, 0.5f, 0, 0, 0.2f,
+ 0, 0, 1, 0, -0.1f,
+ 0, 0, 0, 1, 0,
+ };
+ return SkColorMatrixFilter::Create(mx);
+}
+
+static SkColorFilter* make_compose_cf() {
+ SkAutoTUnref<SkColorFilter> cf0(make_mode_cf());
+ SkAutoTUnref<SkColorFilter> cf1(make_mx_cf());
+ return SkColorFilter::CreateComposeFilter(cf0, cf1);
+}
+
+static SkShader* make_color_sh() { return SkShader::CreateColorShader(0xFFBB8855); }
+
+static SkShader* make_image_sh() {
const SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
const SkPMColor pixels[] {
SkPackARGB32(0xFF, 0xBB, 0x88, 0x55),
@@ -91,12 +111,18 @@ static SkShader* make_image() {
return image->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
}
-static SkShader* make_grad() {
+static SkShader* make_grad_sh() {
const SkPoint pts[] {{ 0, 0 }, { 100, 100 }};
const SkColor colors[] { SK_ColorRED, SK_ColorBLUE };
return SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
}
+static SkShader* make_cf_sh() {
+ SkAutoTUnref<SkColorFilter> filter(make_mx_cf());
+ SkAutoTUnref<SkShader> shader(make_color_sh());
+ return shader->newWithColorFilter(filter);
+}
+
static void compare_spans(const SkPM4f span4f[], const SkPMColor span4b[], int count,
skiatest::Reporter* reporter) {
for (int i = 0; i < count; ++i) {
@@ -111,9 +137,10 @@ DEF_TEST(Color4f_shader, reporter) {
SkShader* (*fFact)();
bool fSupports4f;
} recs[] = {
- { make_color, true },
- { make_grad, false },
- { make_image, false },
+ { make_color_sh, true },
+ { make_grad_sh, false },
+ { make_image_sh, false },
+ { make_cf_sh, true },
};
SkPaint paint;
@@ -136,26 +163,6 @@ DEF_TEST(Color4f_shader, reporter) {
}
}
-static SkColorFilter* make_mode_cf() {
- return SkColorFilter::CreateModeFilter(0xFFBB8855, SkXfermode::kPlus_Mode);
-}
-
-static SkColorFilter* make_mx_cf() {
- const float mx[] = {
- 0.5f, 0, 0, 0, 0.1f,
- 0, 0.5f, 0, 0, 0.2f,
- 0, 0, 1, 0, -0.1f,
- 0, 0, 0, 1, 0,
- };
- return SkColorMatrixFilter::Create(mx);
-}
-
-static SkColorFilter* make_compose_cf() {
- SkAutoTUnref<SkColorFilter> cf0(make_mode_cf());
- SkAutoTUnref<SkColorFilter> cf1(make_mx_cf());
- return SkColorFilter::CreateComposeFilter(cf0, cf1);
-}
-
DEF_TEST(Color4f_colorfilter, reporter) {
struct {
SkColorFilter* (*fFact)();