diff options
-rw-r--r-- | src/core/SkColorFilterShader.cpp | 15 | ||||
-rw-r--r-- | src/core/SkColorFilterShader.h | 3 | ||||
-rw-r--r-- | tests/SkColor4fTest.cpp | 59 |
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)(); |