diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp index ee833d7939..cdc9e75201 100644 --- a/samplecode/SampleAndroidShadows.cpp +++ b/samplecode/SampleAndroidShadows.cpp @@ -315,6 +315,7 @@ protected: fWideOvalPath.getBounds().height() / 2); translate = SkPoint::Make(100, 600); view.restore(); + view.save(); view.rotateY(fAnimAngle); view.getMatrix(&persp); persp.preTranslate(-pivot.fX, -pivot.fY); @@ -325,6 +326,21 @@ protected: SkTMax(1.0f, 32 + fZDelta) + SkScalarSin(radians)*pivot.fX); this->drawShadowedPath(canvas, fWideOvalPath, zPlaneParams, paint, .1f, lightPos, kLightWidth, .5f); + + pivot = SkPoint::Make(fStarPath.getBounds().width() / 2, + fStarPath.getBounds().height() / 2); + translate = SkPoint::Make(700, 250); + view.restore(); + view.rotateY(fAnimAngle); + view.getMatrix(&persp); + persp.preTranslate(-pivot.fX, -pivot.fY); + persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY); + canvas->setMatrix(persp); + zPlaneParams = SkPoint3::Make(-SkScalarSin(radians), + 0, + SkTMax(1.0f, 8 + fZDelta) + SkScalarSin(radians)*pivot.fX); + this->drawShadowedPath(canvas, fStarPath, zPlaneParams, paint, .1f, + lightPos, kLightWidth, .5f); } bool onAnimate(const SkAnimTimer& timer) override { diff --git a/src/utils/SkShadowTessellator.cpp b/src/utils/SkShadowTessellator.cpp index c50265fd42..79f8f22636 100755 --- a/src/utils/SkShadowTessellator.cpp +++ b/src/utils/SkShadowTessellator.cpp @@ -794,9 +794,9 @@ bool SkAmbientShadowTessellator::computeConcaveShadow() { SkTDArray penumbraIndices; penumbraPolygon.setReserve(umbraPolygon.count()); penumbraIndices.setReserve(umbraPolygon.count()); - // TODO: handle tilt - SkScalar radius = this->offset(fTransformedHeightFunc(fPathPolygon[0])); - if (!SkOffsetSimplePolygon(&fPathPolygon[0], fPathPolygon.count(), -radius, + + auto offsetFunc = [this](const SkPoint& p) { return -this->offset(fTransformedHeightFunc(p)); }; + if (!SkOffsetSimplePolygon(&fPathPolygon[0], fPathPolygon.count(), offsetFunc, &penumbraPolygon, &penumbraIndices)) { // TODO: figure out how to handle this case return false;