diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index bdaf3a03ea245..cf63dfbace650 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -298,7 +298,16 @@ public: jlong deviceRgnHandle, jint op) { SkCanvas* canvas = getNativeCanvas(canvasHandle); SkRegion* deviceRgn = reinterpret_cast(deviceRgnHandle); - canvas->clipRegion(*deviceRgn, static_cast(op)); + SkPath rgnPath; + if (deviceRgn->getBoundaryPath(&rgnPath)) { + // The region is specified in device space. + SkMatrix savedMatrix = canvas->getTotalMatrix(); + canvas->resetMatrix(); + canvas->clipPath(rgnPath, static_cast(op)); + canvas->setMatrix(savedMatrix); + } else { + canvas->clipRect(SkRect::MakeEmpty(), static_cast(op)); + } return hasNonEmptyClip(*canvas); }