diff options
author | Jim Van Verth <jvanverth@google.com> | 2017-06-09 11:09:03 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-06-09 17:18:58 +0000 |
commit | 34d6e4b09f81a7fa6a4fe3c667d4663e55af97bc (patch) | |
tree | 0c2c9c199ed19d2e401739020abb6c0fbcf99848 /src/utils/SkShadowUtils.cpp | |
parent | febbffad1c24136f041d7fc2d5ffcd50e47a047f (diff) |
Add tonal color support for shadows.
Bug: skia:
Change-Id: Ib9bd9083da1d8a9fa90ae7c710386e6903541fd5
Reviewed-on: https://skia-review.googlesource.com/18148
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src/utils/SkShadowUtils.cpp')
-rw-r--r-- | src/utils/SkShadowUtils.cpp | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp index 4b5ed5f168..c5b04f311b 100644 --- a/src/utils/SkShadowUtils.cpp +++ b/src/utils/SkShadowUtils.cpp @@ -528,7 +528,24 @@ static SkPoint3 map(const SkMatrix& m, const SkPoint3& pt) { return result; } -static SkColor compute_render_color(SkColor color, float alpha) { +static SkColor compute_render_color(SkColor color, float alpha, bool useTonalColor) { + if (useTonalColor) { + SkScalar colorScale; + SkScalar tonalAlpha; + SkColor4f color4f = SkColor4f::FromColor(color); + SkShadowUtils::ComputeTonalColorParams(color4f.fR, + color4f.fG, + color4f.fB, + alpha, + &colorScale, &tonalAlpha); + // After pre-multiplying, we want the alpha to be scaled by tonalAlpha, and + // the color scaled by colorScale. This scale factor gives that. + SkScalar unPremulScale = colorScale / tonalAlpha; + + return SkColorSetARGB(tonalAlpha*255.999f, unPremulScale*SkColorGetR(color), + unPremulScale*SkColorGetG(color), unPremulScale*SkColorGetB(color)); + } + return SkColorSetARGB(alpha*SkColorGetA(color), SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); } @@ -572,6 +589,7 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { bool tiltZPlane = tilted(rec.fZPlaneParams); bool transparent = SkToBool(rec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag); bool uncached = tiltZPlane || path.isVolatile(); + bool useTonalColor = SkToBool(rec.fFlags & kTonalColor_ShadowFlag); SkColor color = rec.fColor; SkPoint3 zPlaneParams = rec.fZPlaneParams; @@ -581,11 +599,16 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { float ambientAlpha = rec.fAmbientAlpha; if (ambientAlpha > 0) { ambientAlpha = SkTMin(ambientAlpha, 1.f); + SkColor renderColor; + if (useTonalColor) { + renderColor = compute_render_color(SK_ColorBLACK, ambientAlpha, false); + } else { + renderColor = compute_render_color(color, ambientAlpha, false); + } if (uncached) { sk_sp<SkVertices> vertices = SkShadowTessellator::MakeAmbient(path, viewMatrix, zPlaneParams, transparent); - SkColor renderColor = compute_render_color(color, ambientAlpha); SkPaint paint; // Run the vertex color through a GaussianColorFilter and then modulate the grayscale // result of that against our 'color' param. @@ -604,7 +627,6 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { factory.fOffset.fY = viewMatrix.getTranslateY(); } - SkColor renderColor = compute_render_color(color, ambientAlpha); draw_shadow(factory, drawVertsProc, shadowedPath, renderColor); } } @@ -612,12 +634,12 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { float spotAlpha = rec.fSpotAlpha; if (spotAlpha > 0) { spotAlpha = SkTMin(spotAlpha, 1.f); + SkColor renderColor = compute_render_color(color, spotAlpha, useTonalColor); if (uncached) { sk_sp<SkVertices> vertices = SkShadowTessellator::MakeSpot(path, viewMatrix, zPlaneParams, devLightPos, lightRadius, transparent); - SkColor renderColor = compute_render_color(color, spotAlpha); SkPaint paint; // Run the vertex color through a GaussianColorFilter and then modulate the grayscale // result of that against our 'color' param. @@ -671,7 +693,6 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { break; } #endif - SkColor renderColor = compute_render_color(color, spotAlpha); draw_shadow(factory, drawVertsProc, shadowedPath, renderColor); } } |