aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--samplecode/SampleAndroidShadows.cpp4
-rw-r--r--src/gpu/GrRenderTargetContext.cpp2
-rw-r--r--src/gpu/ops/GrShadowRRectOp.cpp16
-rwxr-xr-xsrc/utils/SkShadowTessellator.cpp2
4 files changed, 16 insertions, 8 deletions
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp
index 5d4cd26956..a5fb6fcb9f 100644
--- a/samplecode/SampleAndroidShadows.cpp
+++ b/samplecode/SampleAndroidShadows.cpp
@@ -206,8 +206,8 @@ protected:
void onDrawContent(SkCanvas* canvas) override {
this->drawBG(canvas);
const SkScalar kLightWidth = 800;
- const SkScalar kAmbientAlpha = 0.1f;
- const SkScalar kSpotAlpha = 0.25f;
+ const SkScalar kAmbientAlpha = 0.039f;
+ const SkScalar kSpotAlpha = 0.19f;
SkPaint paint;
paint.setAntiAlias(true);
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index e26ec9018b..bb541229d7 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -1110,7 +1110,7 @@ bool GrRenderTargetContext::drawFastShadow(const GrClip& clip,
maxOffset = SkScalarSqrt(SkTMax(SkPointPriv::LengthSqd(upperLeftOffset),
SkPointPriv::LengthSqd(lowerRightOffset))) + dr;
}
- insetWidth += maxOffset;
+ insetWidth += SkTMax(blurOutset, maxOffset);
}
// Outset the shadow rrect to the border of the penumbra
diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp
index ba96941073..8d609466a4 100644
--- a/src/gpu/ops/GrShadowRRectOp.cpp
+++ b/src/gpu/ops/GrShadowRRectOp.cpp
@@ -460,11 +460,19 @@ private:
// we also skew the vectors we send to the shader that help define the circle.
// By doing so, we end up with a quarter circle in the corner rather than the
// elliptical curve.
- SkVector outerVec = SkVector::Make(0.5f*(outerRadius - umbraInset), -umbraInset);
+
+ // This is a bit magical, but it gives us the correct results at extrema:
+ // a) umbraInset == outerRadius produces an orthogonal vector
+ // b) outerRadius == 0 produces a diagonal vector
+ // And visually the corner looks correct.
+ SkVector outerVec = SkVector::Make(outerRadius - umbraInset, -outerRadius - umbraInset);
outerVec.normalize();
- SkVector diagVec = SkVector::Make(outerVec.fX + outerVec.fY,
- outerVec.fX + outerVec.fY);
- diagVec *= umbraInset / (2 * umbraInset - outerRadius);
+ // We want the circle edge to fall fractionally along the diagonal at
+ // (sqrt(2)*(umbraInset - outerRadius) + outerRadius)/sqrt(2)*umbraInset
+ //
+ // Setting the components of the diagonal offset to the following value will give us that.
+ SkScalar diagVal = umbraInset / (SK_ScalarSqrt2*(outerRadius - umbraInset) - outerRadius);
+ SkVector diagVec = SkVector::Make(diagVal, diagVal);
SkScalar distanceCorrection = umbraInset / blurRadius;
SkScalar clampValue = args.fClampValue;
diff --git a/src/utils/SkShadowTessellator.cpp b/src/utils/SkShadowTessellator.cpp
index 98c47a6f2d..0bf1adaaa4 100755
--- a/src/utils/SkShadowTessellator.cpp
+++ b/src/utils/SkShadowTessellator.cpp
@@ -121,7 +121,7 @@ static void compute_radial_steps(const SkVector& v1, const SkVector& v2, SkScala
SkScalar rSin = v1.cross(v2);
SkScalar theta = SkScalarATan2(rSin, rCos);
- int steps = SkScalarFloorToInt(r*theta*kRecipPixelsPerArcSegment);
+ int steps = SkScalarRoundToInt(SkScalarAbs(r*theta*kRecipPixelsPerArcSegment));
SkScalar dTheta = theta / steps;
*rotSin = SkScalarSinCos(dTheta, rotCos);