34 bool fIgnoreShadowAlpha;
43 , fIgnoreShadowAlpha(false) {
44 fName =
"ShadowUtils";
51 fConvexPaths.
push_back().addRRect(oddRRect);
53 fConvexPaths.
push_back().addCircle(25, 25, 25);
54 fConvexPaths.
push_back().cubicTo(100, 50, 20, 100, 0, 0);
58 fConcavePaths.
push_back().moveTo(0.0f, -33.3333f);
59 fConcavePaths.
back().lineTo(9.62f, -16.6667f);
60 fConcavePaths.
back().lineTo(28.867f, -16.6667f);
61 fConcavePaths.
back().lineTo(19.24f, 0.0f);
62 fConcavePaths.
back().lineTo(28.867f, 16.6667f);
63 fConcavePaths.
back().lineTo(9.62f, 16.6667f);
64 fConcavePaths.
back().lineTo(0.0f, 33.3333f);
65 fConcavePaths.
back().lineTo(-9.62f, 16.6667f);
66 fConcavePaths.
back().lineTo(-28.867f, 16.6667f);
67 fConcavePaths.
back().lineTo(-19.24f, 0.0f);
68 fConcavePaths.
back().lineTo(-28.867f, -16.6667f);
69 fConcavePaths.
back().lineTo(-9.62f, -16.6667f);
70 fConcavePaths.
back().close();
74 fConcavePaths.
back().cubicTo(100, 25, 60, 50, 50, 0);
75 fConcavePaths.
back().cubicTo(0, -25, 40, -50, 50, 0);
82 fShowAmbient = !fShowAmbient;
86 fShowSpot = !fShowSpot;
94 fShowObject = !fShowObject;
106 fIgnoreShadowAlpha = !fIgnoreShadowAlpha;
119 this->drawBG(canvas);
121 static constexpr int kW = 800;
123 static constexpr SkScalar kLightR = 100.f;
125 static constexpr SkScalar kAmbientAlpha = 0.5f;
126 static constexpr SkScalar kSpotAlpha = 0.5f;
127 static constexpr SkPoint3 lightPos = { 250, 400, 500 };
134 matrices.
append()->reset();
135 matrices.
append()->setRotate(33.f, 25.f, 25.f).postScale(1.2f, 0.8f, 25.f, 25.f);
142 for (
auto& m : matrices) {
144 for (
const auto& path : fConvexPaths) {
145 SkRect postMBounds = path.getBounds();
146 m.mapRect(&postMBounds);
159 this->drawShadowedPath(canvas, path, zPlaneParams, greenPaint, kAmbientAlpha,
160 lightPos, kLightR, kSpotAlpha,
flags);
176 for (
auto& m : matrices) {
177 for (
const auto& path : fConcavePaths) {
178 SkRect postMBounds = path.getBounds();
179 m.mapRect(&postMBounds);
185 this->drawShadowedPath(canvas, path, zPlaneParams, greenPaint, kAmbientAlpha,
197 if (invCanvasM.
invert(&invCanvasM)) {
199 canvas->
concat(invCanvasM);
203 canvas->
drawCircle(lightPos.
fX, lightPos.
fY, kLightR / 10.f, blackPaint);
218 if (fIgnoreShadowAlpha) {
235 lightPos, lightWidth,
236 ambientColor, spotColor,
flags);
246 canvas->
drawPath(path, strokePaint);
static constexpr SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
constexpr SkColor SK_ColorBLACK
constexpr SkColor SK_ColorGREEN
@ kGeometricOnly_ShadowFlag
@ kTransparentOccluder_ShadowFlag
void draw(SkCanvas *canvas) override
void load(SkScalar w, SkScalar h) override
bool onChar(SkUnichar uni) override
void translate(SkScalar dx, SkScalar dy)
void drawColor(SkColor color, SkBlendMode mode=SkBlendMode::kSrcOver)
SkMatrix getTotalMatrix() const
void drawPath(const SkPath &path, const SkPaint &paint)
void concat(const SkMatrix &matrix)
void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint &paint)
bool invert(SkMatrix *inverse) const
void setStyle(Style style)
void setColor(SkColor color)
void setAntiAlias(bool aa)
@ kStroke_Style
set to stroke geometry
void setNinePatch(const SkRect &rect, SkScalar leftRad, SkScalar topRad, SkScalar rightRad, SkScalar bottomRad)
static void DrawShadow(SkCanvas *canvas, const SkPath &path, const SkPoint3 &zPlaneParams, const SkPoint3 &lightPos, SkScalar lightRadius, SkColor ambientColor, SkColor spotColor, uint32_t flags=SkShadowFlags::kNone_ShadowFlag)
FlutterSemanticsFlag flags
static SkPoint3 Make(SkScalar x, SkScalar y, SkScalar z)
constexpr float height() const
constexpr float width() const
static constexpr SkRect MakeWH(float w, float h)