From 7ae3bc7ffb3068b0585ad313d5c43ff1aab99737 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Mon, 17 Mar 2014 10:51:44 +0000 Subject: Change tilegrid test to test it directly, rather than through SkPicture This is necessary because it makes assumptions that picture will draw all the rects that match the grids, which may not hold if picture decides to improve the accuracy of the results. BUG=skia:2125 R=tomhudson@google.com, mtklein@google.com, reed@google.com Author: iancottrell@google.com Review URL: https://codereview.chromium.org/199083004 git-svn-id: http://skia.googlecode.com/svn/trunk@13827 2bbb7eff-a529-9590-31e7-b0007b416f81 --- tests/TileGridTest.cpp | 194 ++++++++++++++++++++----------------------------- 1 file changed, 80 insertions(+), 114 deletions(-) diff --git a/tests/TileGridTest.cpp b/tests/TileGridTest.cpp index f23324a69d..cafcc8e574 100644 --- a/tests/TileGridTest.cpp +++ b/tests/TileGridTest.cpp @@ -20,18 +20,6 @@ enum Tile { kAll_Tile = kTopLeft_Tile | kTopRight_Tile | kBottomLeft_Tile | kBottomRight_Tile, }; -class MockCanvas : public SkCanvas { -public: - MockCanvas(const SkBitmap& bm) : SkCanvas(bm) {} - - virtual void drawRect(const SkRect& rect, const SkPaint&) { - // This capture occurs before quick reject. - fRects.push(rect); - } - - SkTDArray fRects; -}; - static void verifyTileHits(skiatest::Reporter* reporter, SkIRect rect, uint32_t tileMask, int borderPixels = 0) { SkTileGridPicture::TileGridInfo info; @@ -50,85 +38,79 @@ static void verifyTileHits(skiatest::Reporter* reporter, SkIRect rect, ((tileMask & kBottomRight_Tile)? 1 : 0)); } +static SkIRect query(float x, float y, float w, float h) { + // inflate for the margin++ in tilegrid + SkRect bounds = SkRect::MakeXYWH(x, y, w, h); + SkIRect r; + bounds.roundOut(&r); + r.outset(1, 1); // to counteract the inset in SkTileGrid::search + return r; +} + + DEF_TEST(TileGrid_UnalignedQuery, reporter) { - // Use SkTileGridPicture to generate a SkTileGrid with a helper SkTileGridPicture::TileGridInfo info; info.fMargin.setEmpty(); info.fOffset.setZero(); info.fTileInterval.set(10, 10); - SkTileGridPicture picture(20, 20, info); - SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), - SkIntToScalar(8), SkIntToScalar(8)); - SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(11), SkIntToScalar(11), - SkIntToScalar(1), SkIntToScalar(1)); - SkCanvas* canvas = picture.beginRecording(20, 20, SkPicture::kOptimizeForClippedPlayback_RecordingFlag); - SkPaint paint; - canvas->drawRect(rect1, paint); - canvas->drawRect(rect2, paint); - picture.endRecording(); - - SkBitmap store; - store.allocN32Pixels(1, 1); + SkIRect rect1 = SkIRect::MakeXYWH(0, 0, 8, 8); + SkIRect rect2 = SkIRect::MakeXYWH(11, 11, 1, 1); + SkTileGrid grid(2, 2, info, SkTileGridNextDatum); + grid.insert(&rect1, rect1, true); + grid.insert(&rect2, rect2, true); // Test parts of top-left tile { - MockCanvas mockCanvas(store); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(0.0f, 0.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); } { - MockCanvas mockCanvas(store); - mockCanvas.translate(-7.99f, -7.99f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(7.99f, 7.99f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); } // Corner overlap { - MockCanvas mockCanvas(store); - mockCanvas.translate(-9.5f, -9.5f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); + SkTDArray rects; + grid.search(query(9.5f, 9.5f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 2 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); + REPORTER_ASSERT(reporter, &rect2 == rects[1]); } // Intersect bottom right tile, but does not overlap rect 2 { - MockCanvas mockCanvas(store); - mockCanvas.translate(-16.0f, -16.0f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(16.0f, 16.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect2 == rects[0]); } // Out of bounds queries, snap to border tiles { - MockCanvas mockCanvas(store); - mockCanvas.translate(2.0f, 0.0f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(-2.0f, 0.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); } { - MockCanvas mockCanvas(store); - mockCanvas.translate(0.0f, 2.0f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(0.0f, -2.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); } { - MockCanvas mockCanvas(store); - mockCanvas.translate(-22.0f, -16.0f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(22.0f, 16.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect2 == rects[0]); } { - MockCanvas mockCanvas(store); - mockCanvas.translate(-16.0f, -22.0f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(16.0f, 22.0f, 1.0f, 1.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect2 == rects[0]); } } @@ -138,80 +120,64 @@ DEF_TEST(TileGrid_OverlapOffsetQueryAlignment, reporter) { info.fMargin.set(1, 1); info.fOffset.set(-1, -1); info.fTileInterval.set(8, 8); - SkTileGridPicture picture(20, 20, info); // rect landing entirely in top left tile - SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), - SkIntToScalar(1), SkIntToScalar(1)); + SkIRect rect1 = SkIRect::MakeXYWH(0, 0, 1, 1); // rect landing entirely in center tile - SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(12), SkIntToScalar(12), - SkIntToScalar(1), SkIntToScalar(1)); + SkIRect rect2 = SkIRect::MakeXYWH(12, 12, 1, 1); // rect landing entirely in bottomright tile - SkRect rect3 = SkRect::MakeXYWH(SkIntToScalar(19), SkIntToScalar(19), - SkIntToScalar(1), SkIntToScalar(1)); - SkCanvas* canvas = picture.beginRecording(20, 20, SkPicture::kOptimizeForClippedPlayback_RecordingFlag); - SkPaint paint; - canvas->drawRect(rect1, paint); - canvas->drawRect(rect2, paint); - canvas->drawRect(rect3, paint); - picture.endRecording(); + SkIRect rect3 = SkIRect::MakeXYWH(19, 19, 1, 1); + SkTileGrid grid(3, 3, info, SkTileGridNextDatum); + grid.insert(&rect1, rect1, true); + grid.insert(&rect2, rect2, true); + grid.insert(&rect3, rect3, true); - SkBitmap tileBitmap; - tileBitmap.allocN32Pixels(10, 10); - SkBitmap moreThanATileBitmap; - moreThanATileBitmap.allocN32Pixels(11, 11); - SkBitmap tinyBitmap; - tinyBitmap.allocN32Pixels(2, 2); // Test parts of top-left tile { // The offset should cancel the top and left borders of the top left tile // So a look-up at interval 0-10 should be grid aligned, - MockCanvas mockCanvas(tileBitmap); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(0.0f, 0.0f, 10.0f, 10.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); } { // Encroaching border by one pixel - MockCanvas mockCanvas(moreThanATileBitmap); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); + SkTDArray rects; + grid.search(query(0.0f, 0.0f, 11.0f, 11.0f), &rects); + REPORTER_ASSERT(reporter, 2 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); + REPORTER_ASSERT(reporter, &rect2 == rects[1]); } { // Tile stride is 8 (tileWidth - 2 * border pixels // so translating by 8, should make query grid-aligned // with middle tile. - MockCanvas mockCanvas(tileBitmap); - mockCanvas.translate(SkIntToScalar(-8), SkIntToScalar(-8)); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); + SkTDArray rects; + grid.search(query(8.0f, 8.0f, 10.0f, 10.0f), &rects); + REPORTER_ASSERT(reporter, 1 == rects.count()); + REPORTER_ASSERT(reporter, &rect2 == rects[0]); } { - MockCanvas mockCanvas(tileBitmap); - mockCanvas.translate(-7.9f, -7.9f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); + SkTDArray rects; + grid.search(query(7.9f, 7.9f, 10.0f, 10.0f), &rects); + REPORTER_ASSERT(reporter, 2 == rects.count()); + REPORTER_ASSERT(reporter, &rect1 == rects[0]); + REPORTER_ASSERT(reporter, &rect2 == rects[1]); } { - MockCanvas mockCanvas(tileBitmap); - mockCanvas.translate(-8.1f, -8.1f); - picture.draw(&mockCanvas); - REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); - REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); - REPORTER_ASSERT(reporter, rect3 == mockCanvas.fRects[1]); + SkTDArray rects; + grid.search(query(8.1f, 8.1f, 10.0f, 10.0f), &rects); + REPORTER_ASSERT(reporter, 2 == rects.count()); + REPORTER_ASSERT(reporter, &rect2 == rects[0]); + REPORTER_ASSERT(reporter, &rect3 == rects[1]); } { // Regression test for crbug.com/234688 // Once the 2x2 device region is inset by margin, it yields an empty // adjusted region, sitting right on top of the tile boundary. - MockCanvas mockCanvas(tinyBitmap); - mockCanvas.translate(-8.0f, -8.0f); - picture.draw(&mockCanvas); + SkTDArray rects; + grid.search(query(8.0f, 8.0f, 2.0f, 2.0f), &rects); // This test passes by not asserting. We do not validate the rects recorded // because the result is numerically unstable (floating point equality). // The content of any one of the four tiles of the tilegrid would be a valid -- cgit v1.2.3