OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
9 #include "SkBlurImageFilter.h" | 9 #include "SkBlurImageFilter.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 int count, | 315 int count, |
316 DrawBitmapProc proc) { | 316 DrawBitmapProc proc) { |
317 SkPictureRecorder recorder; | 317 SkPictureRecorder recorder; |
318 SkCanvas* canvas = recorder.beginRecording(1000, 1000); | 318 SkCanvas* canvas = recorder.beginRecording(1000, 1000); |
319 for (int i = 0; i < count; ++i) { | 319 for (int i = 0; i < count; ++i) { |
320 analytic[i].rewind(); | 320 analytic[i].rewind(); |
321 canvas->save(); | 321 canvas->save(); |
322 SkRect clipRect = SkRect::MakeXYWH(pos[i].fX, pos[i].fY, | 322 SkRect clipRect = SkRect::MakeXYWH(pos[i].fX, pos[i].fY, |
323 SkIntToScalar(bm[i].width()), | 323 SkIntToScalar(bm[i].width()), |
324 SkIntToScalar(bm[i].height())); | 324 SkIntToScalar(bm[i].height())); |
325 canvas->clipRect(clipRect, SkRegion::kIntersect_Op); | 325 canvas->clipRect(clipRect); |
326 proc(canvas, bm[i], bm[count+i], pos[i], &analytic[i]); | 326 proc(canvas, bm[i], bm[count+i], pos[i], &analytic[i]); |
327 canvas->restore(); | 327 canvas->restore(); |
328 } | 328 } |
329 return recorder.endRecording(); | 329 return recorder.endRecording(); |
330 } | 330 } |
331 | 331 |
332 static void rand_rect(SkRect* rect, SkRandom& rand, SkScalar W, SkScalar H) { | 332 static void rand_rect(SkRect* rect, SkRandom& rand, SkScalar W, SkScalar H) { |
333 rect->fLeft = rand.nextRangeScalar(-W, 2*W); | 333 rect->fLeft = rand.nextRangeScalar(-W, 2*W); |
334 rect->fTop = rand.nextRangeScalar(-H, 2*H); | 334 rect->fTop = rand.nextRangeScalar(-H, 2*H); |
335 rect->fRight = rect->fLeft + rand.nextRangeScalar(0, W); | 335 rect->fRight = rect->fLeft + rand.nextRangeScalar(0, W); |
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1213 recorder->partialReplay(canvas); | 1213 recorder->partialReplay(canvas); |
1214 | 1214 |
1215 return recorder2.endRecording(); | 1215 return recorder2.endRecording(); |
1216 } | 1216 } |
1217 }; | 1217 }; |
1218 | 1218 |
1219 static void create_imbalance(SkCanvas* canvas) { | 1219 static void create_imbalance(SkCanvas* canvas) { |
1220 SkRect clipRect = SkRect::MakeWH(2, 2); | 1220 SkRect clipRect = SkRect::MakeWH(2, 2); |
1221 SkRect drawRect = SkRect::MakeWH(10, 10); | 1221 SkRect drawRect = SkRect::MakeWH(10, 10); |
1222 canvas->save(); | 1222 canvas->save(); |
1223 canvas->clipRect(clipRect, SkRegion::kReplace_Op); | 1223 canvas->legacyClipRect(clipRect, SkRegion::kReplace_Op); |
1224 canvas->translate(1.0f, 1.0f); | 1224 canvas->translate(1.0f, 1.0f); |
1225 SkPaint p; | 1225 SkPaint p; |
1226 p.setColor(SK_ColorGREEN); | 1226 p.setColor(SK_ColorGREEN); |
1227 canvas->drawRect(drawRect, p); | 1227 canvas->drawRect(drawRect, p); |
1228 // no restore | 1228 // no restore |
1229 } | 1229 } |
1230 | 1230 |
1231 // This tests that replaying a potentially unbalanced picture into a canvas | 1231 // This tests that replaying a potentially unbalanced picture into a canvas |
1232 // doesn't affect the canvas' save count or matrix/clip state. | 1232 // doesn't affect the canvas' save count or matrix/clip state. |
1233 static void check_balance(skiatest::Reporter* reporter, SkPicture* picture) { | 1233 static void check_balance(skiatest::Reporter* reporter, SkPicture* picture) { |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1524 SkPath path; | 1524 SkPath path; |
1525 path.addOval(rect2); | 1525 path.addOval(rect2); |
1526 SkPath path2; | 1526 SkPath path2; |
1527 path2.addOval(rect3); | 1527 path2.addOval(rect3); |
1528 SkIRect clipBounds; | 1528 SkIRect clipBounds; |
1529 SkPictureRecorder recorder; | 1529 SkPictureRecorder recorder; |
1530 | 1530 |
1531 // Testing conservative-raster-clip that is enabled by PictureRecord | 1531 // Testing conservative-raster-clip that is enabled by PictureRecord |
1532 { | 1532 { |
1533 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1533 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1534 canvas->clipPath(invPath, SkRegion::kIntersect_Op); | 1534 canvas->clipPath(invPath); |
1535 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1535 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1536 REPORTER_ASSERT(reporter, true == nonEmpty); | 1536 REPORTER_ASSERT(reporter, true == nonEmpty); |
1537 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 1537 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
1538 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 1538 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
1539 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 1539 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
1540 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 1540 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
1541 } | 1541 } |
1542 { | 1542 { |
1543 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1543 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1544 canvas->clipPath(path, SkRegion::kIntersect_Op); | 1544 canvas->clipPath(path); |
1545 canvas->clipPath(invPath, SkRegion::kIntersect_Op); | 1545 canvas->clipPath(invPath); |
1546 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1546 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1547 REPORTER_ASSERT(reporter, true == nonEmpty); | 1547 REPORTER_ASSERT(reporter, true == nonEmpty); |
1548 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); | 1548 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); |
1549 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); | 1549 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); |
1550 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 1550 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
1551 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 1551 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
1552 } | 1552 } |
1553 { | 1553 { |
1554 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1554 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1555 canvas->clipPath(path, SkRegion::kIntersect_Op); | 1555 canvas->clipPath(path); |
1556 canvas->clipPath(invPath, SkRegion::kUnion_Op); | 1556 canvas->legacyClipPath(invPath, SkRegion::kUnion_Op); |
1557 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1557 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1558 REPORTER_ASSERT(reporter, true == nonEmpty); | 1558 REPORTER_ASSERT(reporter, true == nonEmpty); |
1559 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 1559 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
1560 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 1560 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
1561 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 1561 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
1562 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 1562 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
1563 } | 1563 } |
1564 { | 1564 { |
1565 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1565 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1566 canvas->clipPath(path, SkRegion::kDifference_Op); | 1566 canvas->clipPath(path, kDifference_SkClipOp); |
1567 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1567 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1568 REPORTER_ASSERT(reporter, true == nonEmpty); | 1568 REPORTER_ASSERT(reporter, true == nonEmpty); |
1569 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 1569 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
1570 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 1570 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
1571 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 1571 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
1572 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 1572 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
1573 } | 1573 } |
1574 { | 1574 { |
1575 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1575 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1576 canvas->clipPath(path, SkRegion::kReverseDifference_Op); | 1576 canvas->legacyClipPath(path, SkRegion::kReverseDifference_Op); |
1577 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1577 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1578 // True clip is actually empty in this case, but the best | 1578 // True clip is actually empty in this case, but the best |
1579 // determination we can make using only bounds as input is that the | 1579 // determination we can make using only bounds as input is that the |
1580 // clip is included in the bounds of 'path'. | 1580 // clip is included in the bounds of 'path'. |
1581 REPORTER_ASSERT(reporter, true == nonEmpty); | 1581 REPORTER_ASSERT(reporter, true == nonEmpty); |
1582 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); | 1582 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); |
1583 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); | 1583 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); |
1584 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 1584 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
1585 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 1585 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
1586 } | 1586 } |
1587 { | 1587 { |
1588 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1588 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1589 canvas->clipPath(path, SkRegion::kIntersect_Op); | 1589 canvas->clipPath(path); |
1590 canvas->clipPath(path2, SkRegion::kXOR_Op); | 1590 canvas->legacyClipPath(path2, SkRegion::kXOR_Op); |
1591 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1591 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1592 REPORTER_ASSERT(reporter, true == nonEmpty); | 1592 REPORTER_ASSERT(reporter, true == nonEmpty); |
1593 REPORTER_ASSERT(reporter, 6 == clipBounds.fLeft); | 1593 REPORTER_ASSERT(reporter, 6 == clipBounds.fLeft); |
1594 REPORTER_ASSERT(reporter, 6 == clipBounds.fTop); | 1594 REPORTER_ASSERT(reporter, 6 == clipBounds.fTop); |
1595 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 1595 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
1596 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 1596 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
1597 } | 1597 } |
1598 } | 1598 } |
1599 | 1599 |
1600 /** | 1600 /** |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 private: | 1638 private: |
1639 unsigned fClipCount; | 1639 unsigned fClipCount; |
1640 | 1640 |
1641 typedef SkCanvas INHERITED; | 1641 typedef SkCanvas INHERITED; |
1642 }; | 1642 }; |
1643 | 1643 |
1644 static void test_clip_expansion(skiatest::Reporter* reporter) { | 1644 static void test_clip_expansion(skiatest::Reporter* reporter) { |
1645 SkPictureRecorder recorder; | 1645 SkPictureRecorder recorder; |
1646 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1646 SkCanvas* canvas = recorder.beginRecording(10, 10); |
1647 | 1647 |
1648 canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); | 1648 canvas->legacyClipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); |
1649 // The following expanding clip should not be skipped. | 1649 // The following expanding clip should not be skipped. |
1650 canvas->clipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op); | 1650 canvas->legacyClipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op); |
1651 // Draw something so the optimizer doesn't just fold the world. | 1651 // Draw something so the optimizer doesn't just fold the world. |
1652 SkPaint p; | 1652 SkPaint p; |
1653 p.setColor(SK_ColorBLUE); | 1653 p.setColor(SK_ColorBLUE); |
1654 canvas->drawPaint(p); | 1654 canvas->drawPaint(p); |
1655 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 1655 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
1656 | 1656 |
1657 ClipCountingCanvas testCanvas(10, 10); | 1657 ClipCountingCanvas testCanvas(10, 10); |
1658 picture->playback(&testCanvas); | 1658 picture->playback(&testCanvas); |
1659 | 1659 |
1660 // Both clips should be present on playback. | 1660 // Both clips should be present on playback. |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1919 | 1919 |
1920 // The picture shares the immutable pixels but copies the mutable ones. | 1920 // The picture shares the immutable pixels but copies the mutable ones. |
1921 REPORTER_ASSERT(r, mut.pixelRef()->unique()); | 1921 REPORTER_ASSERT(r, mut.pixelRef()->unique()); |
1922 REPORTER_ASSERT(r, !immut.pixelRef()->unique()); | 1922 REPORTER_ASSERT(r, !immut.pixelRef()->unique()); |
1923 | 1923 |
1924 // When the picture goes away, it's just our bitmaps holding the refs. | 1924 // When the picture goes away, it's just our bitmaps holding the refs. |
1925 pic.reset(NULL); | 1925 pic.reset(NULL); |
1926 REPORTER_ASSERT(r, mut.pixelRef()->unique()); | 1926 REPORTER_ASSERT(r, mut.pixelRef()->unique()); |
1927 REPORTER_ASSERT(r, immut.pixelRef()->unique()); | 1927 REPORTER_ASSERT(r, immut.pixelRef()->unique()); |
1928 } | 1928 } |
OLD | NEW |