aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/shadowutils.cpp19
-rw-r--r--gm/tonalshadows.cpp15
-rw-r--r--include/private/SkShadowFlags.h4
-rw-r--r--include/utils/SkShadowUtils.h78
-rw-r--r--samplecode/SampleAndroidShadows.cpp7
-rwxr-xr-xsamplecode/SampleShadowColor.cpp22
-rwxr-xr-xsamplecode/SampleShadowReference.cpp5
-rwxr-xr-xsamplecode/SampleShadowUtils.cpp9
8 files changed, 59 insertions, 100 deletions
diff --git a/gm/shadowutils.cpp b/gm/shadowutils.cpp
index d9cdfd5768..0751174795 100644
--- a/gm/shadowutils.cpp
+++ b/gm/shadowutils.cpp
@@ -11,12 +11,16 @@
#include "SkResourceCache.h"
#include "SkShadowUtils.h"
-void draw_shadow(SkCanvas* canvas, const SkPath& path, int height, SkColor color, SkPoint3 lightPos,
- SkScalar lightR, bool isAmbient, uint32_t flags) {
+void draw_shadow(SkCanvas* canvas, const SkPath& path, SkScalar height, SkColor color,
+ SkPoint3 lightPos, SkScalar lightR, bool isAmbient, uint32_t flags) {
SkScalar ambientAlpha = isAmbient ? .5f : 0.f;
SkScalar spotAlpha = isAmbient ? 0.f : .5f;
- SkShadowUtils::DrawShadow(canvas, path, height, lightPos, lightR, ambientAlpha, spotAlpha,
- color, flags);
+ SkColor ambientColor = SkColorSetARGB(ambientAlpha*SkColorGetA(color), SkColorGetR(color),
+ SkColorGetG(color), SkColorGetB(color));
+ SkColor spotColor = SkColorSetARGB(spotAlpha*SkColorGetA(color), SkColorGetR(color),
+ SkColorGetG(color), SkColorGetB(color));
+ SkShadowUtils::DrawShadow(canvas, path, SkPoint3{ 0, 0, height}, lightPos, lightR,
+ ambientColor, spotColor, flags);
}
static constexpr int kW = 800;
@@ -75,14 +79,15 @@ void draw_paths(SkCanvas* canvas, ShadowMode mode) {
canvas->concat(m);
if (kDebugColorNoOccluders == mode || kDebugColorOccluders == mode) {
- flags |= SkShadowFlags::kDisableTonalColor_ShadowFlag;
draw_shadow(canvas, path, kHeight, SK_ColorRED, lightPos, kLightR,
true, flags);
draw_shadow(canvas, path, kHeight, SK_ColorBLUE, lightPos, kLightR,
false, flags);
} else if (kGrayscale == mode) {
- SkShadowUtils::DrawShadow(canvas, path, kHeight, lightPos, kLightR,
- 0.1f, 0.25f, SK_ColorBLACK, flags);
+ SkColor ambientColor = SkColorSetARGB(0.1f * 255, 0, 0, 0);
+ SkColor spotColor = SkColorSetARGB(0.25f * 255, 0, 0, 0);
+ SkShadowUtils::DrawShadow(canvas, path, SkPoint3{0, 0, kHeight}, lightPos,
+ kLightR, ambientColor, spotColor, flags);
}
SkPaint paint;
diff --git a/gm/tonalshadows.cpp b/gm/tonalshadows.cpp
index 83c1b748e4..9fdcfee683 100644
--- a/gm/tonalshadows.cpp
+++ b/gm/tonalshadows.cpp
@@ -54,13 +54,22 @@ void draw_content(SkCanvas* canvas, BackgroundMode mode) {
lightPos.fX = 75;
SkScalar xPos = 75;
for (int col = 0; col < 10; ++col) {
- paint.setColor(kColors[10 * row + col]);
+ SkColor color = kColors[10 * row + col];
+ paint.setColor(color);
canvas->save();
canvas->translate(xPos, yPos);
+
+ SkColor baseAmbient = SkColorSetARGB(kAmbientAlpha*SkColorGetA(color),
+ SkColorGetR(color), SkColorGetG(color),
+ SkColorGetB(color));
+ SkColor baseSpot = SkColorSetARGB(kSpotAlpha*SkColorGetA(color),
+ SkColorGetR(color), SkColorGetG(color),
+ SkColorGetB(color));
+ SkColor tonalAmbient, tonalSpot;
+ SkShadowUtils::ComputeTonalColors(baseAmbient, baseSpot, &tonalAmbient, &tonalSpot);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
- lightPos, kLightWidth,
- kAmbientAlpha, kSpotAlpha, paint.getColor(), 0);
+ lightPos, kLightWidth, tonalAmbient, tonalSpot);
canvas->drawPath(path, paint);
canvas->restore();
diff --git a/include/private/SkShadowFlags.h b/include/private/SkShadowFlags.h
index de035531e6..8caf632988 100644
--- a/include/private/SkShadowFlags.h
+++ b/include/private/SkShadowFlags.h
@@ -16,10 +16,8 @@ enum SkShadowFlags {
kTransparentOccluder_ShadowFlag = 0x01,
/** Don't try to use analytic shadows. */
kGeometricOnly_ShadowFlag = 0x02,
- /** Disable use of tonal values when applying color (deprecated) */
- kDisableTonalColor_ShadowFlag = 0x04,
/** mask for all shadow flags */
- kAll_ShadowFlag = 0x07
+ kAll_ShadowFlag = 0x03
};
#endif
diff --git a/include/utils/SkShadowUtils.h b/include/utils/SkShadowUtils.h
index 3eca398fb1..7beee855e1 100644
--- a/include/utils/SkShadowUtils.h
+++ b/include/utils/SkShadowUtils.h
@@ -42,81 +42,13 @@ public:
uint32_t flags = SkShadowFlags::kNone_ShadowFlag);
/**
- * Deprecated version that uses one color and two alphas, and supports tonal color.
+ * Helper routine to compute color values for one-pass tonal alpha.
*
- * Draw an offset spot shadow and outlining ambient shadow for the given path using a disc
- * light. The shadow may be cached, depending on the path type and canvas matrix. If the
- * matrix is perspective or the path is volatile, it will not be cached.
- *
- * @param canvas The canvas on which to draw the shadows.
- * @param path The occluder used to generate the shadows.
- * @param zPlaneParams Values for the plane function which returns the Z offset of the
- * occluder from the canvas based on local x and y values (the current matrix is not applied).
- * @param lightPos The 3D position of the light relative to the canvas plane. This is
- * independent of the canvas's current matrix.
- * @param lightRadius The radius of the disc light.
- * @param ambientAlpha The maximum alpha of the ambient shadow.
- * @param spotAlpha The maxium alpha of the spot shadow.
- * @param color The shadow color.
- * @param flags Options controlling opaque occluder optimizations and shadow appearance. See
- * SkShadowFlags.
+ * @param inAmbientColor Original ambient color
+ * @param inSpotColor Original spot color
+ * @param outAmbientColor Modified ambient color
+ * @param outSpotColor Modified spot color
*/
- static void DrawShadow(SkCanvas* canvas, const SkPath& path, const SkPoint3& zPlane,
- const SkPoint3& lightPos, SkScalar lightRadius, SkScalar ambientAlpha,
- SkScalar spotAlpha, SkColor color,
- uint32_t flags = SkShadowFlags::kNone_ShadowFlag) {
- SkColor ambientColor;
- SkColor spotColor;
- if (flags & SkShadowFlags::kDisableTonalColor_ShadowFlag) {
- ambientColor = SkColorSetARGB(ambientAlpha*SkColorGetA(color), SkColorGetR(color),
- SkColorGetG(color), SkColorGetB(color));
- spotColor = SkColorSetARGB(spotAlpha*SkColorGetA(color), SkColorGetR(color),
- SkColorGetG(color), SkColorGetB(color));
- } else {
- SkColor inAmbient = SkColorSetA(color, ambientAlpha*SkColorGetA(color));
- SkColor inSpot = SkColorSetA(color, spotAlpha*SkColorGetA(color));
- ComputeTonalColors(inAmbient, inSpot, &ambientColor, &spotColor);
- }
-
- DrawShadow(canvas, path, zPlane, lightPos, lightRadius, ambientColor, spotColor, flags);
- }
-
- /**
- * Deprecated version with height value (to be removed when Flutter is updated).
- *
- * Draw an offset spot shadow and outlining ambient shadow for the given path using a disc
- * light.
- *
- * @param canvas The canvas on which to draw the shadows.
- * @param path The occluder used to generate the shadows.
- * @param occluderHeight The vertical offset of the occluder from the canvas. This is
- * independent of the canvas's current matrix.
- * @param lightPos The 3D position of the light relative to the canvas plane. This is
- * independent of the canvas's current matrix.
- * @param lightRadius The radius of the disc light.
- * @param ambientAlpha The maximum alpha of the ambient shadow.
- * @param spotAlpha The maxium alpha of the spot shadow.
- * @param color The shadow color.
- * @param flags Options controlling opaque occluder optimizations and shadow appearance. See
- * SkShadowFlags.
- */
- static void DrawShadow(SkCanvas* canvas, const SkPath& path, SkScalar occluderHeight,
- const SkPoint3& lightPos, SkScalar lightRadius, SkScalar ambientAlpha,
- SkScalar spotAlpha, SkColor color,
- uint32_t flags = SkShadowFlags::kNone_ShadowFlag) {
- SkPoint3 zPlane = SkPoint3::Make(0, 0, occluderHeight);
- DrawShadow(canvas, path, zPlane, lightPos, lightRadius, ambientAlpha, spotAlpha,
- color, flags);
- }
-
- /**
- * Helper routine to compute color values for one-pass tonal alpha.
- *
- * @param inAmbientColor Original ambient color
- * @param inSpotColor Original spot color
- * @param outAmbientColor Modified ambient color
- * @param outSpotColor Modified spot color
- */
static void ComputeTonalColors(SkColor inAmbientColor, SkColor inSpotColor,
SkColor* outAmbientColor, SkColor* outSpotColor);
};
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp
index 2621cec073..8f076f4c66 100644
--- a/samplecode/SampleAndroidShadows.cpp
+++ b/samplecode/SampleAndroidShadows.cpp
@@ -155,9 +155,10 @@ protected:
flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
}
- SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
- lightPos, lightWidth,
- ambientAlpha, spotAlpha, SK_ColorBLACK, flags);
+ SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 0, 0, 0);
+ SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 0);
+ SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, lightPos, lightWidth,
+ ambientColor, spotColor, flags);
if (fShowObject) {
canvas->drawPath(path, paint);
diff --git a/samplecode/SampleShadowColor.cpp b/samplecode/SampleShadowColor.cpp
index 07720ae0a5..337bb28650 100755
--- a/samplecode/SampleShadowColor.cpp
+++ b/samplecode/SampleShadowColor.cpp
@@ -111,10 +111,10 @@ protected:
}
if (fTwoPassColor) {
- flags |= SkShadowFlags::kDisableTonalColor_ShadowFlag;
+ SkColor ambientColor = SkColorSetARGB(ambientAlpha*255, 0, 0, 0);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- ambientAlpha, 0, SK_ColorBLACK, flags);
+ ambientColor, SK_ColorTRANSPARENT, flags);
if (paint.getColor() != SK_ColorBLACK) {
SkColor color = paint.getColor();
@@ -126,19 +126,31 @@ protected:
SkScalar luminance = 0.5f*(max + min) / 255.f;
SkScalar alpha = (.6 - .4*luminance)*luminance*luminance + 0.3f;
spotAlpha -= (alpha - 0.3f)*.5f;
+ SkColor spotColor = SkColorSetARGB(alpha*SkColorGetA(color), SkColorGetR(color),
+ SkColorGetG(color), SkColorGetB(color));
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- 0, alpha, paint.getColor(), flags);
+ SK_ColorTRANSPARENT, spotColor, flags);
}
+ SkColor spotGreyscale = SkColorSetARGB(spotAlpha * 255, 0, 0, 0);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- 0, spotAlpha, SK_ColorBLACK, flags);
+ SK_ColorTRANSPARENT, spotGreyscale, flags);
} else {
+ SkColor color = paint.getColor();
+ SkColor baseAmbient = SkColorSetARGB(ambientAlpha*SkColorGetA(color),
+ SkColorGetR(color), SkColorGetG(color),
+ SkColorGetB(color));
+ SkColor baseSpot = SkColorSetARGB(spotAlpha*SkColorGetA(color),
+ SkColorGetR(color), SkColorGetG(color),
+ SkColorGetB(color));
+ SkColor tonalAmbient, tonalSpot;
+ SkShadowUtils::ComputeTonalColors(baseAmbient, baseSpot, &tonalAmbient, &tonalSpot);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- ambientAlpha, spotAlpha, paint.getColor(), flags);
+ tonalAmbient, tonalSpot, flags);
}
if (fShowObject) {
canvas->drawPath(path, paint);
diff --git a/samplecode/SampleShadowReference.cpp b/samplecode/SampleShadowReference.cpp
index b3d462df62..6cd63798b5 100755
--- a/samplecode/SampleShadowReference.cpp
+++ b/samplecode/SampleShadowReference.cpp
@@ -94,9 +94,12 @@ protected:
if (fUseAlt) {
flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
}
+
+ SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 0, 0, 0);
+ SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 0);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- ambientAlpha, spotAlpha, SK_ColorBLACK, flags);
+ ambientColor, spotColor, flags);
if (fShowObject) {
canvas->drawPath(path, paint);
diff --git a/samplecode/SampleShadowUtils.cpp b/samplecode/SampleShadowUtils.cpp
index 7d30a10d0b..19e5aae71c 100755
--- a/samplecode/SampleShadowUtils.cpp
+++ b/samplecode/SampleShadowUtils.cpp
@@ -121,16 +121,15 @@ protected:
if (!fShowSpot) {
spotAlpha = 0;
}
- flags |= SkShadowFlags::kDisableTonalColor_ShadowFlag;
if (fUseAlt) {
flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
}
+
+ SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 255, 0, 0);
+ SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 255);
SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
lightPos, lightWidth,
- ambientAlpha, 0, SK_ColorRED, flags);
- SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
- lightPos, lightWidth,
- 0, spotAlpha, SK_ColorBLUE, flags);
+ ambientColor, spotColor, flags);
if (fShowObject) {
canvas->drawPath(path, paint);