diff options
author | junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-07 13:26:18 +0000 |
---|---|---|
committer | junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-07 13:26:18 +0000 |
commit | 0962ae1fbc450dd4672739402bb57fc2bd4fcdc7 (patch) | |
tree | 446a347655f1069dd19ad8a9c4f5600d72e5e6c4 | |
parent | 8e2cdff9ab583bd4bc012b5bc724b5059069c560 (diff) |
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
-rw-r--r-- | src/core/SkPictureRecord.cpp | 6 | ||||
-rw-r--r-- | tests/PictureTest.cpp | 21 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 375bf42662..c8386438c5 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 c702e9426e..c92f11cfcf 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" |