From 796a1753d96eb0c76e742c8288617d758ddf33df Mon Sep 17 00:00:00 2001 From: "mike@reedtribe.org" Date: Wed, 7 Nov 2012 03:39:46 +0000 Subject: [PATCH] fix SkRegion::contains(rect), thanks to danakj and http://code.google.com/p/skia/issues/detail?id=958 git-svn-id: http://skia.googlecode.com/svn/trunk@6324 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkRegion.cpp | 9 +++++++-- tests/RegionTest.cpp | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/core/SkRegion.cpp b/src/core/SkRegion.cpp index 0dcacd8..f6fc2dc 100644 --- a/src/core/SkRegion.cpp +++ b/src/core/SkRegion.cpp @@ -338,6 +338,10 @@ bool SkRegion::contains(int32_t x, int32_t y) const { return false; } +static SkRegion::RunType scanline_bottom(const SkRegion::RunType runs[]) { + return runs[0]; +} + static const SkRegion::RunType* scanline_next(const SkRegion::RunType runs[]) { // skip [B N [L R]... S] return runs + 2 + runs[1] * 2 + 1; @@ -370,13 +374,14 @@ bool SkRegion::contains(const SkIRect& r) const { SkASSERT(this->isComplex()); const RunType* scanline = fRunHead->findScanline(r.fTop); - + RunType bottom; do { if (!scanline_contains(scanline, r.fLeft, r.fRight)) { return false; } + bottom = scanline_bottom(scanline); scanline = scanline_next(scanline); - } while (r.fBottom >= scanline[0]); + } while (r.fBottom > bottom); return true; } diff --git a/tests/RegionTest.cpp b/tests/RegionTest.cpp index f3d1e0b..e629a9e 100644 --- a/tests/RegionTest.cpp +++ b/tests/RegionTest.cpp @@ -15,7 +15,7 @@ static void Union(SkRegion* rgn, const SkIRect& rect) { #define TEST_NO_INTERSECT(rgn, rect) REPORTER_ASSERT(reporter, !rgn.intersects(rect)) #define TEST_INTERSECT(rgn, rect) REPORTER_ASSERT(reporter, rgn.intersects(rect)) -#define TEST_NO_CONTAINS(rgn, rect) REPORTER_ASSERT(reporter, rgn.contains(rect)) +#define TEST_NO_CONTAINS(rgn, rect) REPORTER_ASSERT(reporter, !rgn.contains(rect)) // inspired by http://code.google.com/p/skia/issues/detail?id=958 // -- 2.7.4