aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-07 13:26:18 +0000
committerGravatar junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-07 13:26:18 +0000
commit0962ae1fbc450dd4672739402bb57fc2bd4fcdc7 (patch)
tree446a347655f1069dd19ad8a9c4f5600d72e5e6c4
parent8e2cdff9ab583bd4bc012b5bc724b5059069c560 (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.cpp6
-rw-r--r--tests/PictureTest.cpp21
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"