aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-01-17 12:20:04 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-17 17:38:57 +0000
commit8008df1080f5623bf1cf13c713082c2b732d4eb2 (patch)
tree2c0914aa9f49f5e97c68325f58d2eebe7a41faf3
parent33a86560ce12b549c2d69e3f891e0cae3173aed9 (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.cpp2
-rw-r--r--src/core/SkDraw.cpp2
-rw-r--r--src/core/SkRectPriv.h14
-rw-r--r--src/core/SkScan_Path.cpp4
-rw-r--r--src/core/SkThreadedBMPDevice.cpp2
-rw-r--r--tests/RectTest.cpp4
-rw-r--r--tests/SGTest.cpp4
-rw-r--r--tests/WindowRectanglesTest.cpp4
-rw-r--r--tools/debugger/SkDebugCanvas.cpp2
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