diff options
author | Mike Reed <reed@google.com> | 2018-01-17 12:20:04 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-17 17:38:57 +0000 |
commit | 8008df1080f5623bf1cf13c713082c2b732d4eb2 (patch) | |
tree | 2c0914aa9f49f5e97c68325f58d2eebe7a41faf3 | |
parent | 33a86560ce12b549c2d69e3f891e0cae3173aed9 (diff) |
handle large rects, rename helper
To fix gm/bigrect, needed to do adjust "largest" rect so it doesn't become empty when round-tripping with SkRect/SkIRect.
I renamed it after this.
Bug: skia:
Change-Id: I747782c8456da603cf298275d2300ea1996e7629
Reviewed-on: https://skia-review.googlesource.com/95563
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Yuqian Li <liyuqian@google.com>
-rw-r--r-- | experimental/sksg/SkSGNode.cpp | 2 | ||||
-rw-r--r-- | src/core/SkDraw.cpp | 2 | ||||
-rw-r--r-- | src/core/SkRectPriv.h | 14 | ||||
-rw-r--r-- | src/core/SkScan_Path.cpp | 4 | ||||
-rw-r--r-- | src/core/SkThreadedBMPDevice.cpp | 2 | ||||
-rw-r--r-- | tests/RectTest.cpp | 4 | ||||
-rw-r--r-- | tests/SGTest.cpp | 4 | ||||
-rw-r--r-- | tests/WindowRectanglesTest.cpp | 4 | ||||
-rw-r--r-- | tools/debugger/SkDebugCanvas.cpp | 2 |
9 files changed, 21 insertions, 17 deletions
diff --git a/experimental/sksg/SkSGNode.cpp b/experimental/sksg/SkSGNode.cpp index b634175b21..74867ef819 100644 --- a/experimental/sksg/SkSGNode.cpp +++ b/experimental/sksg/SkSGNode.cpp @@ -40,7 +40,7 @@ private: Node::Node(uint32_t invalTraits) : fInvalReceiver(nullptr) - , fBounds(SkRectPriv::MakeLargestS32()) + , fBounds(SkRectPriv::MakeLargeS32()) , fInvalTraits(invalTraits) , fFlags(kInvalidated_Flag) {} diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index a0f08e5916..77af440caf 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -782,7 +782,7 @@ void SkDraw::drawRect(const SkRect& prePaintRect, const SkPaint& paint, } } - if (!SkRectPriv::MakeLargestS32().contains(bbox)) { + if (!SkRectPriv::MakeLargeS32().contains(bbox)) { // bbox.roundOut() is undefined; use slow path. draw_rect_as_path(*this, prePaintRect, paint, matrix); return; diff --git a/src/core/SkRectPriv.h b/src/core/SkRectPriv.h index a8f40db005..16c9535cc8 100644 --- a/src/core/SkRectPriv.h +++ b/src/core/SkRectPriv.h @@ -12,18 +12,22 @@ class SkRectPriv { public: - static SkIRect MakeILargest() { - const int32_t ihalf = SK_MaxS32 >> 1; - return { -ihalf, -ihalf, ihalf, ihalf }; + // Returns an irect that is very large, and can be safely round-trip with SkRect and still + // be considered non-empty (i.e. width/height > 0) even if we round-out the SkRect. + static SkIRect MakeILarge() { + // SK_MaxS32 >> 1 seemed better, but it did not survive round-trip with SkRect and rounding. + // Also, 1 << 29 can be perfectly represented in float, while SK_MaxS32 >> 1 cannot. + const int32_t large = 1 << 29; + return { -large, -large, large, large }; } static SkIRect MakeILargestInverted() { return { SK_MaxS32, SK_MaxS32, SK_MinS32, SK_MinS32 }; } - static SkRect MakeLargestS32() { + static SkRect MakeLargeS32() { SkRect r; - r.set(MakeILargest()); + r.set(MakeILarge()); return r; } diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp index 21e2ecbf55..f2a18b631e 100644 --- a/src/core/SkScan_Path.cpp +++ b/src/core/SkScan_Path.cpp @@ -644,8 +644,8 @@ void SkScan::FillPath(const SkPath& path, const SkRegion& origClip, SkRect bounds = path.getBounds(); bool irPreClipped = false; - if (!SkRectPriv::MakeLargestS32().contains(bounds)) { - if (!bounds.intersect(SkRectPriv::MakeLargestS32())) { + if (!SkRectPriv::MakeLargeS32().contains(bounds)) { + if (!bounds.intersect(SkRectPriv::MakeLargeS32())) { bounds.setEmpty(); } irPreClipped = true; diff --git a/src/core/SkThreadedBMPDevice.cpp b/src/core/SkThreadedBMPDevice.cpp index bdb5f95c7a..a61e9b29d8 100644 --- a/src/core/SkThreadedBMPDevice.cpp +++ b/src/core/SkThreadedBMPDevice.cpp @@ -74,7 +74,7 @@ SkThreadedBMPDevice::DrawState::DrawState(SkThreadedBMPDevice* dev) { SkIRect SkThreadedBMPDevice::transformDrawBounds(const SkRect& drawBounds) const { if (drawBounds == SkRectPriv::MakeLargest()) { - return SkRectPriv::MakeILargest(); + return SkRectPriv::MakeILarge(); } SkRect transformedBounds; this->ctm().mapRect(&transformedBounds, drawBounds); diff --git a/tests/RectTest.cpp b/tests/RectTest.cpp index 39ba073725..6a588b7b6c 100644 --- a/tests/RectTest.cpp +++ b/tests/RectTest.cpp @@ -96,11 +96,11 @@ DEF_TEST(Rect_grow, reporter) { } DEF_TEST(Rect_largest, reporter) { - REPORTER_ASSERT(reporter, !SkRectPriv::MakeILargest().isEmpty()); + REPORTER_ASSERT(reporter, !SkRectPriv::MakeILarge().isEmpty()); REPORTER_ASSERT(reporter, SkRectPriv::MakeILargestInverted().isEmpty()); REPORTER_ASSERT(reporter, !SkRectPriv::MakeLargest().isEmpty()); - REPORTER_ASSERT(reporter, !SkRectPriv::MakeLargestS32().isEmpty()); + REPORTER_ASSERT(reporter, !SkRectPriv::MakeLargeS32().isEmpty()); REPORTER_ASSERT(reporter, SkRectPriv::MakeLargestInverted().isEmpty()); } diff --git a/tests/SGTest.cpp b/tests/SGTest.cpp index b0101bc034..1228e666e7 100644 --- a/tests/SGTest.cpp +++ b/tests/SGTest.cpp @@ -68,7 +68,7 @@ static void inval_test1(skiatest::Reporter* reporter) { // Initial revalidation. check_inval(reporter, root, SkRect::MakeWH(100, 100), - SkRectPriv::MakeLargestS32(), + SkRectPriv::MakeLargeS32(), nullptr); } @@ -138,7 +138,7 @@ static void inval_test2(skiatest::Reporter* reporter) { // Initial revalidation. check_inval(reporter, root, SkRect::MakeWH(100, 100), - SkRectPriv::MakeLargestS32(), + SkRectPriv::MakeLargeS32(), nullptr); } diff --git a/tests/WindowRectanglesTest.cpp b/tests/WindowRectanglesTest.cpp index 84fdca2237..d6c4756168 100644 --- a/tests/WindowRectanglesTest.cpp +++ b/tests/WindowRectanglesTest.cpp @@ -48,7 +48,7 @@ DEF_TEST(WindowRectangles, reporter) { REPORTER_ASSERT(reporter, B.data() != A.data()); REPORTER_ASSERT(reporter, B != A); - B.addWindow(SkRectPriv::MakeILargest()); + B.addWindow(SkRectPriv::MakeILarge()); REPORTER_ASSERT(reporter, B != A); REPORTER_ASSERT(reporter, !memcmp(A.data(), windowData, @@ -56,7 +56,7 @@ DEF_TEST(WindowRectangles, reporter) { REPORTER_ASSERT(reporter, !memcmp(B.data(), windowData, (GrWindowRectangles::kMaxWindows - 1) * sizeof(SkIRect))); REPORTER_ASSERT(reporter, - B.data()[GrWindowRectangles::kMaxWindows - 1] == SkRectPriv::MakeILargest()); + B.data()[GrWindowRectangles::kMaxWindows - 1] == SkRectPriv::MakeILarge()); } { GrWindowRectangles A(wr), B(wr); diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp index 0b46439d33..0bfd85f7f9 100644 --- a/tools/debugger/SkDebugCanvas.cpp +++ b/tools/debugger/SkDebugCanvas.cpp @@ -88,7 +88,7 @@ SkDebugCanvas::SkDebugCanvas(int width, int height) // rounded out. The following code creates a nearly maximal rect that will // not get collapsed by the coming conversions (Due to precision loss the // inset has to be surprisingly large). - SkIRect largeIRect = SkRectPriv::MakeILargest(); + SkIRect largeIRect = SkRectPriv::MakeILarge(); largeIRect.inset(1024, 1024); SkRect large = SkRect::Make(largeIRect); #ifdef SK_DEBUG |