From f880b683048b5098e1e62b534902376626ffabac Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Fri, 10 Mar 2017 11:30:44 -0500 Subject: use AutoRestore instead of making a copy of the clipstack BUG=skia: Change-Id: I86683156926f7c63c83790eaf313112ba5fab763 Reviewed-on: https://skia-review.googlesource.com/9532 Reviewed-by: Florin Malita Commit-Queue: Mike Reed --- src/svg/SkSVGDevice.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'src/svg') diff --git a/src/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp index 7ce616436c..91ebadb7f0 100644 --- a/src/svg/SkSVGDevice.cpp +++ b/src/svg/SkSVGDevice.cpp @@ -278,10 +278,8 @@ struct SkSVGDevice::MxCp { const SkMatrix* fMatrix; const SkClipStack* fClipStack; - MxCp(SkSVGDevice* device) { - fMatrix = &device->ctm(); - fClipStack = &device->cs(); - } + MxCp(const SkMatrix* mx, const SkClipStack* cs) : fMatrix(mx), fClipStack(cs) {} + MxCp(SkSVGDevice* device) : fMatrix(&device->ctm()), fClipStack(&device->cs()) {} }; class SkSVGDevice::AutoElement : ::SkNoncopyable { @@ -729,24 +727,20 @@ void SkSVGDevice::drawSprite(const SkBitmap& bitmap, void SkSVGDevice::drawBitmapRect(const SkBitmap& bm, const SkRect* srcOrNull, const SkRect& dst, const SkPaint& paint, SkCanvas::SrcRectConstraint) { - MxCp mc(this); - - SkClipStack adjustedClipStack; + SkClipStack* cs = &this->cs(); + SkClipStack::AutoRestore ar(cs, false); if (srcOrNull && *srcOrNull != SkRect::Make(bm.bounds())) { - adjustedClipStack = *mc.fClipStack; - adjustedClipStack.clipRect(dst, *mc.fMatrix, kIntersect_SkClipOp, - paint.isAntiAlias()); - mc.fClipStack = &adjustedClipStack; + cs->save(); + cs->clipRect(dst, this->ctm(), kIntersect_SkClipOp, paint.isAntiAlias()); } SkMatrix adjustedMatrix; adjustedMatrix.setRectToRect(srcOrNull ? *srcOrNull : SkRect::Make(bm.bounds()), dst, SkMatrix::kFill_ScaleToFit); - adjustedMatrix.postConcat(*mc.fMatrix); - mc.fMatrix = &adjustedMatrix; + adjustedMatrix.postConcat(this->ctm()); - drawBitmapCommon(mc, bm, paint); + drawBitmapCommon(MxCp(&adjustedMatrix, cs), bm, paint); } void SkSVGDevice::drawText(const void* text, size_t len, -- cgit v1.2.3