diff options
author | Brian Osman <brianosman@google.com> | 2017-05-11 10:57:37 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-11 18:14:32 +0000 |
commit | ec8f8b064340b030fc4ce10f6cbbc3d6f63b946f (patch) | |
tree | 77f75eafbe3a353c52e008ef71704f468166be8e /src/gpu/text/GrTextUtils.h | |
parent | 07072944af9fac196efeb78d6791537221cd1d4c (diff) |
Fix GPU text colors when color spaces are involved
1) Only store GrColors in GrTextUtils::Paint. We still store
premul and unpremul versions, but this is slightly clearer.
2) GrTextUtils::Paint also needs info from the render target
context to linearize and transform the color to dst space.
Bug: skia:6605
Change-Id: I6e12c55eafaecd2a090c82b4f56827401305bf3a
Reviewed-on: https://skia-review.googlesource.com/16486
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/gpu/text/GrTextUtils.h')
-rw-r--r-- | src/gpu/text/GrTextUtils.h | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/gpu/text/GrTextUtils.h b/src/gpu/text/GrTextUtils.h index c5daa42a15..9f38699010 100644 --- a/src/gpu/text/GrTextUtils.h +++ b/src/gpu/text/GrTextUtils.h @@ -19,10 +19,12 @@ class GrAtlasGlyphCache; class GrAtlasTextBlob; class GrAtlasTextStrike; class GrClip; +class GrColorSpaceXform; class GrContext; class GrPaint; class GrRenderTargetContext; class GrShaderCaps; +class SkColorSpace; class SkDrawFilter; class SkGlyph; class SkMatrix; @@ -45,12 +47,19 @@ public: */ class Paint { public: - explicit Paint(const SkPaint* paint) : fPaint(paint) { this->initFilteredColor(); } + explicit Paint(const SkPaint* paint, + SkColorSpace* dstColorSpace, + GrColorSpaceXform* colorXformFromSRGB) + : fPaint(paint) + , fDstColorSpace(dstColorSpace) + , fColorXformFromSRGB(colorXformFromSRGB) { + this->initFilteredColor(); + } // These expose the paint's color run through its color filter (if any). This is only valid // when drawing grayscale/lcd glyph masks and not when drawing color glyphs. - SkColor filteredSkColor() const { return fFilteredSkColor; } - GrColor filteredPremulGrColor() const { return fFilteredGrColor; } + GrColor filteredPremulColor() const { return fFilteredPremulColor; } + GrColor filteredUnpremulColor() const { return fFilteredUnpremulColor; } const SkPaint& skPaint() const { return *fPaint; } operator const SkPaint&() const { return this->skPaint(); } @@ -58,21 +67,21 @@ public: bool toGrPaint(GrMaskFormat, GrRenderTargetContext*, const SkMatrix& viewMatrix, GrPaint*) const; + // Just for RunPaint's constructor + SkColorSpace* dstColorSpace() const { return fDstColorSpace; } + GrColorSpaceXform* colorXformFromSRGB() const { return fColorXformFromSRGB; } + protected: - void initFilteredColor() { - fFilteredSkColor = fPaint->getColor(); - if (fPaint->getColorFilter()) { - fFilteredSkColor = fPaint->getColorFilter()->filterColor(fFilteredSkColor); - } - fFilteredGrColor = SkColorToPremulGrColor(fFilteredSkColor); - } + void initFilteredColor(); Paint() = default; const SkPaint* fPaint; + SkColorSpace* fDstColorSpace; + GrColorSpaceXform* fColorXformFromSRGB; // This is the paint's color run through its color filter, if present. This color should // be used except when rendering bitmap text, in which case the bitmap must be filtered in // the fragment shader. - SkColor fFilteredSkColor; - SkColor fFilteredGrColor; + GrColor fFilteredUnpremulColor; + GrColor fFilteredPremulColor; }; /** @@ -86,8 +95,10 @@ public: : fOriginalPaint(paint), fFilter(filter), fProps(props) { // Initially we represent the original paint. fPaint = &fOriginalPaint->skPaint(); - fFilteredSkColor = fOriginalPaint->filteredSkColor(); - fFilteredGrColor = fOriginalPaint->filteredPremulGrColor(); + fDstColorSpace = fOriginalPaint->dstColorSpace(); + fColorXformFromSRGB = fOriginalPaint->colorXformFromSRGB(); + fFilteredPremulColor = fOriginalPaint->filteredPremulColor(); + fFilteredUnpremulColor = fOriginalPaint->filteredUnpremulColor(); } bool modifyForRun(const SkTextBlobRunIterator&); |