From: junov@chromium.org Date: Tue, 7 May 2013 13:26:18 +0000 (+0000) Subject: Fix SkPicture path bound optimization to handle inverse filled paths. X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~12485 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0962ae1fbc450dd4672739402bb57fc2bd4fcdc7;p=platform%2Fupstream%2FlibSkiaSharp.git Fix SkPicture path bound optimization to handle inverse filled paths. BUG=crbug.com/229011 TEST=Picture unit test Review URL: https://codereview.chromium.org/14819008 git-svn-id: http://skia.googlecode.com/svn/trunk@9031 2bbb7eff-a529-9590-31e7-b0007b416f81 --- diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 375bf42..c838643 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -783,7 +783,11 @@ bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { validate(initialOffset, size); if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { - return this->INHERITED::clipRect(path.getBounds(), op, doAA); + if (path.isInverseFillType()) { + return this->getClipDeviceBounds(NULL); + } else { + return this->INHERITED::clipRect(path.getBounds(), op, doAA); + } } else { return this->INHERITED::clipPath(path, op, doAA); } diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp index c702e94..c92f11c 100644 --- a/tests/PictureTest.cpp +++ b/tests/PictureTest.cpp @@ -449,6 +449,26 @@ static void test_clone_empty(skiatest::Reporter* reporter) { } } +static void test_inverse_fill_clip_opt(skiatest::Reporter* reporter) { + // Regression test for crbug.com/229011 + SkPicture picture; + SkCanvas* canvas = picture.beginRecording(10, 10, + SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkRect rect = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), + SkIntToScalar(2), SkIntToScalar(2)); + SkPath path; + path.addRect(rect); + path.setFillType(SkPath::kInverseEvenOdd_FillType); + canvas->clipPath(path); + SkIRect clipBounds; + bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); + REPORTER_ASSERT(reporter, true == nonEmpty); + REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); + REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); + REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); + REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); +} + static void TestPicture(skiatest::Reporter* reporter) { #ifdef SK_DEBUG test_deleting_empty_playback(); @@ -460,6 +480,7 @@ static void TestPicture(skiatest::Reporter* reporter) { test_gatherpixelrefs(reporter); test_bitmap_with_encoded_data(reporter); test_clone_empty(reporter); + test_inverse_fill_clip_opt(reporter); } #include "TestClassDef.h"