diff options
author | 2016-10-25 10:51:28 -0400 | |
---|---|---|
committer | 2016-10-26 00:48:33 +0000 | |
commit | 618d304eb394d64779be0ecdc5eff898242faa8f (patch) | |
tree | c4773dd205ae0a34b903333238c6daafc4852ba7 /src/effects | |
parent | 18b61f9cb9d0bea03dc4f69f63f53ad44f171526 (diff) |
GrConstColorProcessor uses 4f colors in the destination space
Many places that construct one are explicitly specifying opaque white or
transparent black, which we can assume (based on the semantics of the
operation) should remain (0,0,0,0) or (1,1,1,1), so that's simple.
In other cases, we convert our source color to destination space.
One wrinkle is tht SkColorFilter now needs to know the destination color
space, due to SkModeColorFilter.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3903
Change-Id: I4969c0260588f4021300733f601b47dc606adf79
Reviewed-on: https://skia-review.googlesource.com/3903
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkColorCubeFilter.cpp | 3 | ||||
-rw-r--r-- | src/effects/SkGammaColorFilter.cpp | 3 | ||||
-rw-r--r-- | src/effects/SkLumaColorFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkPerlinNoiseShader.cpp | 8 | ||||
-rw-r--r-- | src/effects/SkTableColorFilter.cpp | 9 | ||||
-rw-r--r-- | src/effects/SkXfermodeImageFilter.cpp | 4 |
6 files changed, 18 insertions, 11 deletions
diff --git a/src/effects/SkColorCubeFilter.cpp b/src/effects/SkColorCubeFilter.cpp index 3eb70d32d0..2a921d8e50 100644 --- a/src/effects/SkColorCubeFilter.cpp +++ b/src/effects/SkColorCubeFilter.cpp @@ -298,7 +298,8 @@ void GrColorCubeEffect::GLSLProcessor::GenKey(const GrProcessor& proc, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { } -sk_sp<GrFragmentProcessor> SkColorCubeFilter::asFragmentProcessor(GrContext* context) const { +sk_sp<GrFragmentProcessor> SkColorCubeFilter::asFragmentProcessor(GrContext* context, + SkColorSpace*) const { static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); GrUniqueKey key; GrUniqueKey::Builder builder(&key, kDomain, 2); diff --git a/src/effects/SkGammaColorFilter.cpp b/src/effects/SkGammaColorFilter.cpp index eba8e320d8..181ab770f4 100644 --- a/src/effects/SkGammaColorFilter.cpp +++ b/src/effects/SkGammaColorFilter.cpp @@ -50,7 +50,8 @@ void SkGammaColorFilter::toString(SkString* str) const { #endif #if SK_SUPPORT_GPU -sk_sp<GrFragmentProcessor> SkGammaColorFilter::asFragmentProcessor(GrContext*) const { +sk_sp<GrFragmentProcessor> SkGammaColorFilter::asFragmentProcessor(GrContext*, + SkColorSpace*) const { return GrGammaEffect::Make(fGamma); } #endif diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp index ec94eca76d..19b2c72956 100644 --- a/src/effects/SkLumaColorFilter.cpp +++ b/src/effects/SkLumaColorFilter.cpp @@ -111,7 +111,7 @@ private: } }; -sk_sp<GrFragmentProcessor> SkLumaColorFilter::asFragmentProcessor(GrContext*) const { +sk_sp<GrFragmentProcessor> SkLumaColorFilter::asFragmentProcessor(GrContext*, SkColorSpace*) const { return LumaColorFilterEffect::Make(); } #endif diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp index 5dbdab1f32..06bf8135ca 100644 --- a/src/effects/SkPerlinNoiseShader.cpp +++ b/src/effects/SkPerlinNoiseShader.cpp @@ -906,13 +906,17 @@ sk_sp<GrFragmentProcessor> SkPerlinNoiseShader::asFragmentProcessor(const AsFPAr if (0 == fNumOctaves) { if (kFractalNoise_Type == fType) { // Extract the incoming alpha and emit rgba = (a/4, a/4, a/4, a/2) + // TODO: Either treat the output of this shader as sRGB or allow client to specify a + // color space of the noise. Either way, this case (and the GLSL) need to convert to + // the destination. sk_sp<GrFragmentProcessor> inner( - GrConstColorProcessor::Make(0x80404040, + GrConstColorProcessor::Make(GrColor4f::FromGrColor(0x80404040), GrConstColorProcessor::kModulateRGBA_InputMode)); return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); } // Emit zero. - return GrConstColorProcessor::Make(0x0, GrConstColorProcessor::kIgnore_InputMode); + return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), + GrConstColorProcessor::kIgnore_InputMode); } // Either we don't stitch tiles, either we have a valid tile size diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp index ebf646b999..75910882c4 100644 --- a/src/effects/SkTableColorFilter.cpp +++ b/src/effects/SkTableColorFilter.cpp @@ -49,7 +49,7 @@ public: sk_sp<SkColorFilter> makeComposed(sk_sp<SkColorFilter> inner) const override; #if SK_SUPPORT_GPU - sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*) const override; + sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*, SkColorSpace*) const override; #endif void filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const override; @@ -561,13 +561,14 @@ sk_sp<GrFragmentProcessor> ColorTableEffect::TestCreate(GrProcessorTestData* d) (flags & (1 << 2)) ? luts[2] : nullptr, (flags & (1 << 3)) ? luts[3] : nullptr )); - - sk_sp<GrFragmentProcessor> fp = filter->asFragmentProcessor(d->fContext); + sk_sp<SkColorSpace> colorSpace = GrTest::TestColorSpace(d->fRandom); + sk_sp<GrFragmentProcessor> fp = filter->asFragmentProcessor(d->fContext, colorSpace.get()); SkASSERT(fp); return fp; } -sk_sp<GrFragmentProcessor> SkTable_ColorFilter::asFragmentProcessor(GrContext* context) const { +sk_sp<GrFragmentProcessor> SkTable_ColorFilter::asFragmentProcessor(GrContext* context, + SkColorSpace*) const { SkBitmap bitmap; this->asComponentTable(&bitmap); diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index b0735168b5..2ceba4b385 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -268,8 +268,8 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( GrTextureDomain::kDecal_Mode, GrTextureParams::kNone_FilterMode); } else { - bgFP = GrConstColorProcessor::Make(GrColor_TRANSPARENT_BLACK, - GrConstColorProcessor::kIgnore_InputMode); + bgFP = GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), + GrConstColorProcessor::kIgnore_InputMode); } if (foregroundTex) { |