diff options
author | Brian Osman <brianosman@google.com> | 2018-07-30 14:36:53 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-30 19:06:48 +0000 |
commit | 3ebd354730ea9590bf233deccfc24982ffe48a98 (patch) | |
tree | f9cef509dc7ccb769332cbbf740bfdbcead6dac8 /src/gpu/SkGpuDevice_drawTexture.cpp | |
parent | a78b6dcb82d2f6c940e9c0a6bc14853f846344d0 (diff) |
For TextureOp + Alpha texture, xform paint color to dest color space
This is an unfortunate amount of plumbing for this, but benchmarks
confirm that we're better off doing this work in the vertex shader
(with a ubyte attribute) than using a float4 attribute.
Change-Id: I358d330ee452ea0a89cdd725019c8df2686036a0
Reviewed-on: https://skia-review.googlesource.com/144351
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/gpu/SkGpuDevice_drawTexture.cpp')
-rw-r--r-- | src/gpu/SkGpuDevice_drawTexture.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/gpu/SkGpuDevice_drawTexture.cpp b/src/gpu/SkGpuDevice_drawTexture.cpp index af397cd431..9b2641ea83 100644 --- a/src/gpu/SkGpuDevice_drawTexture.cpp +++ b/src/gpu/SkGpuDevice_drawTexture.cpp @@ -99,7 +99,6 @@ static bool can_use_draw_texture(const SkPaint& paint) { static void draw_texture(const SkPaint& paint, const SkMatrix& ctm, const SkRect* src, const SkRect* dst, GrAA aa, SkCanvas::SrcRectConstraint constraint, sk_sp<GrTextureProxy> proxy, - SkColorSpace* colorSpace, const GrClip& clip, GrRenderTargetContext* rtc) { SkASSERT(!(SkToBool(src) && !SkToBool(dst))); SkRect srcRect = src ? *src : SkRect::MakeWH(proxy->width(), proxy->height()); @@ -111,7 +110,7 @@ static void draw_texture(const SkPaint& paint, const SkMatrix& ctm, const SkRect SkAssertResult(srcRect.intersect(SkRect::MakeIWH(proxy->width(), proxy->height()))); srcToDst.mapRect(&dstRect, srcRect); } - auto csxf = GrColorSpaceXform::Make(colorSpace, rtc->colorSpaceInfo().colorSpace()); + auto textureXform = GrColorSpaceXform::Make(colorSpace, rtc->colorSpaceInfo().colorSpace()); GrSamplerState::Filter filter; switch (paint.getFilterQuality()) { case kNone_SkFilterQuality: @@ -124,11 +123,18 @@ static void draw_texture(const SkPaint& paint, const SkMatrix& ctm, const SkRect case kHigh_SkFilterQuality: SK_ABORT("Quality level not allowed."); } - GrColor color = GrPixelConfigIsAlphaOnly(proxy->config()) - ? SkColorToPremulGrColor(paint.getColor()) - : SkColorAlphaToGrColor(paint.getColor()); + GrColor color; + sk_sp<GrColorSpaceXform> paintColorXform = nullptr; + if (GrPixelConfigIsAlphaOnly(proxy->config())) { + // Leave the color unpremul if we're going to transform it in the vertex shader + paintColorXform = rtc->colorSpaceInfo().refColorSpaceXformFromSRGB(); + color = paintColorXform ? SkColorToUnpremulGrColor(paint.getColor()) + : SkColorToPremulGrColor(paint.getColor()); + } else { + color = SkColorAlphaToGrColor(paint.getColor()); + } rtc->drawTexture(clip, std::move(proxy), filter, color, srcRect, dstRect, aa, constraint, ctm, - std::move(csxf)); + std::move(textureXform), std::move(paintColorXform)); } ////////////////////////////////////////////////////////////////////////////// |