Fix fast blur for shadow rrects.
* Handles case where blur is greater than
corner radius.
* Speeds up shader by avoiding a divide.
* Tweaks shadow sample to be more MD-ish.
Bug: skia:
Change-Id: I2990357b39784c22f02a8e51872391fd68e8226a
Reviewed-on: https://skia-review.googlesource.com/14141
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp
index 55acd57..02b494f 100644
--- a/samplecode/SampleAndroidShadows.cpp
+++ b/samplecode/SampleAndroidShadows.cpp
@@ -52,7 +52,7 @@
, fAnimAngle(0)
, fShowAmbient(true)
, fShowSpot(true)
- , fUseAlt(true)
+ , fUseAlt(false)
, fShowObject(true)
, fIgnoreShadowAlpha(false) {}
@@ -72,7 +72,7 @@
fWideRectPath.addRect(SkRect::MakeXYWH(0, 0, 630, 70));
fWideOvalPath.addOval(SkRect::MakeXYWH(0, 0, 630, 70));
- fLightPos = SkPoint3::Make(-700, -700, 2800);
+ fLightPos = SkPoint3::Make(350, 0, 600);
}
// overrides from SkEventSink
@@ -465,38 +465,32 @@
void onDrawContent(SkCanvas* canvas) override {
this->drawBG(canvas);
- const SkScalar kLightWidth = 2800;
- const SkScalar kAmbientAlpha = 0.25f;
+ const SkScalar kLightWidth = 800;
+ const SkScalar kAmbientAlpha = 0.1f;
const SkScalar kSpotAlpha = 0.25f;
SkPaint paint;
paint.setAntiAlias(true);
SkPoint3 lightPos = fLightPos;
- lightPos.fX = canvas->getBaseLayerSize().fWidth * 0.5f;
paint.setColor(SK_ColorWHITE);
canvas->translate(200, 90);
- lightPos.fX += 200;
- lightPos.fY += 90;
SkScalar zValue = SkTMax(1.0f, 2 + fZDelta);
- std::function<SkScalar(SkScalar, SkScalar)> zFunc =
+ std::function<SkScalar(SkScalar, SkScalar)> zFunc =
[zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fRRPath, zFunc, paint, kAmbientAlpha,
lightPos, kLightWidth, kSpotAlpha);
paint.setColor(SK_ColorRED);
canvas->translate(250, 0);
- lightPos.fX += 250;
- zValue = SkTMax(1.0f, 4 + fZDelta);
+ zValue = SkTMax(1.0f, 8 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fRectPath, zFunc, paint, kAmbientAlpha,
lightPos, kLightWidth, kSpotAlpha);
paint.setColor(SK_ColorBLUE);
canvas->translate(-250, 110);
- lightPos.fX -= 250;
- lightPos.fY += 110;
zValue = SkTMax(1.0f, 12 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fCirclePath, zFunc, paint, kAmbientAlpha,
@@ -504,7 +498,6 @@
paint.setColor(SK_ColorGREEN);
canvas->translate(250, 0);
- lightPos.fX += 250;
zValue = SkTMax(1.0f, 64 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fRRPath, zFunc, paint, kAmbientAlpha,
@@ -512,8 +505,6 @@
paint.setColor(SK_ColorYELLOW);
canvas->translate(-250, 110);
- lightPos.fX -= 250;
- lightPos.fY += 110;
zValue = SkTMax(1.0f, 8 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fFunkyRRPath, zFunc, paint, kAmbientAlpha,
@@ -521,7 +512,6 @@
paint.setColor(SK_ColorCYAN);
canvas->translate(250, 0);
- lightPos.fX += 250;
zValue = SkTMax(1.0f, 16 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, fCubicPath, zFunc, paint,
@@ -535,8 +525,6 @@
paint.setColor(SK_ColorMAGENTA);
canvas->translate(-125, 60);
- lightPos.fX -= 125;
- lightPos.fY += 60;
zValue = SkTMax(1.0f, 32 + fZDelta);
zFunc = [zValue](SkScalar, SkScalar) { return zValue; };
this->drawShadowedPath(canvas, tmpPath, zFunc, paint, .1f,
@@ -555,9 +543,6 @@
persp.preTranslate(-pivot.fX, -pivot.fY);
persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
canvas->setMatrix(persp);
- lightPos = fLightPos;
- lightPos.fX += pivot.fX + translate.fX;
- lightPos.fY += pivot.fY + translate.fY;
zValue = SkTMax(1.0f, 16 + fZDelta);
SkScalar radians = SkDegreesToRadians(fAnimAngle);
zFunc = [zValue, pivot, radians](SkScalar x, SkScalar y) {
@@ -576,9 +561,6 @@
persp.preTranslate(-pivot.fX, -pivot.fY);
persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
canvas->setMatrix(persp);
- lightPos = fLightPos;
- lightPos.fX += pivot.fX + translate.fX;
- lightPos.fY += pivot.fY + translate.fY;
zValue = SkTMax(1.0f, 32 + fZDelta);
zFunc = [zValue, pivot, radians](SkScalar x, SkScalar y) {
return -SkScalarSin(radians)*x +