aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/text/GrTextUtils.h
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-05-11 10:57:37 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-11 18:14:32 +0000
commitec8f8b064340b030fc4ce10f6cbbc3d6f63b946f (patch)
tree77f75eafbe3a353c52e008ef71704f468166be8e /src/gpu/text/GrTextUtils.h
parent07072944af9fac196efeb78d6791537221cd1d4c (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.h39
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&);