diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkShadowUtils.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp index 2e560b454e..8206bd3f54 100644 --- a/src/utils/SkShadowUtils.cpp +++ b/src/utils/SkShadowUtils.cpp @@ -471,12 +471,12 @@ void SkShadowUtils::DrawShadow(SkCanvas* canvas, const SkPath& path, SkScalar oc if (ambientAlpha > 0) { newPaint.setMaskFilter(SkAmbientShadowMaskFilter::Make(occluderHeight, ambientAlpha, flags)); - canvas->drawPath(path, newPaint); + canvas->drawOval(rect, newPaint); } if (spotAlpha > 0) { newPaint.setMaskFilter(SkSpotShadowMaskFilter::Make(occluderHeight, devLightPos, lightRadius, spotAlpha, flags)); - canvas->drawPath(path, newPaint); + canvas->drawOval(rect, newPaint); } return; } @@ -565,6 +565,26 @@ void SkShadowUtils::DrawUncachedShadow(SkCanvas* canvas, const SkPath& path, uint32_t flags) { SkAutoCanvasRestore acr(canvas, true); SkMatrix viewMatrix = canvas->getTotalMatrix(); + + // try circular fast path + SkRect rect; + if (viewMatrix.isSimilarity() && + path.isOval(&rect) && rect.width() == rect.height()) { + SkPaint newPaint; + newPaint.setColor(color); + if (ambientAlpha > 0) { + newPaint.setMaskFilter(SkAmbientShadowMaskFilter::Make(heightFunc(0,0), ambientAlpha, + flags)); + canvas->drawOval(rect, newPaint); + } + if (spotAlpha > 0) { + newPaint.setMaskFilter(SkSpotShadowMaskFilter::Make(heightFunc(0,0), lightPos, + lightRadius, spotAlpha, flags)); + canvas->drawOval(rect, newPaint); + } + return; + } + canvas->resetMatrix(); bool transparent = SkToBool(flags & SkShadowFlags::kTransparentOccluder_ShadowFlag); |