aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/SkShadowUtils.cpp
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2017-06-09 11:09:03 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-09 17:18:58 +0000
commit34d6e4b09f81a7fa6a4fe3c667d4663e55af97bc (patch)
tree0c2c9c199ed19d2e401739020abb6c0fbcf99848 /src/utils/SkShadowUtils.cpp
parentfebbffad1c24136f041d7fc2d5ffcd50e47a047f (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.cpp31
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);
}
}