From 95b85bd1ba98141c9ec70a4593eaf4671347e472 Mon Sep 17 00:00:00 2001 From: "mike@reedtribe.org" Date: Wed, 23 Nov 2011 03:12:58 +0000 Subject: add test that aaclip.setRegion creates the same mask as the region ... in prep for optimizatin work on setRegion. git-svn-id: http://skia.googlecode.com/svn/trunk@2739 2bbb7eff-a529-9590-31e7-b0007b416f81 --- tests/AAClipTest.cpp | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) (limited to 'tests/AAClipTest.cpp') diff --git a/tests/AAClipTest.cpp b/tests/AAClipTest.cpp index f56645e006..1392264b81 100644 --- a/tests/AAClipTest.cpp +++ b/tests/AAClipTest.cpp @@ -7,9 +7,120 @@ #include "Test.h" #include "SkAAClip.h" +#include "SkCanvas.h" +#include "SkMask.h" #include "SkPath.h" #include "SkRandom.h" +static bool operator==(const SkMask& a, const SkMask& b) { + if (a.fFormat != b.fFormat || a.fBounds != b.fBounds) { + return false; + } + if (!a.fImage && !b.fImage) { + return true; + } + if (!a.fImage || !b.fImage) { + return false; + } + + size_t wbytes = a.fBounds.width(); + switch (a.fFormat) { + case SkMask::kBW_Format: + wbytes = (wbytes + 7) >> 3; + break; + case SkMask::kA8_Format: + case SkMask::k3D_Format: + break; + case SkMask::kLCD16_Format: + wbytes <<= 1; + break; + case SkMask::kLCD32_Format: + case SkMask::kARGB32_Format: + wbytes <<= 2; + break; + default: + SkASSERT(!"unknown mask format"); + return false; + } + + const int h = a.fBounds.height(); + const char* aptr = (const char*)a.fImage; + const char* bptr = (const char*)b.fImage; + for (int y = 0; y < h; ++y) { + if (memcmp(aptr, bptr, wbytes)) { + return false; + } + aptr += wbytes; + bptr += wbytes; + } + return true; +} + +static void copyToMask(const SkRegion& rgn, SkMask* mask) { + if (rgn.isEmpty()) { + mask->fImage = NULL; + mask->fBounds.setEmpty(); + mask->fRowBytes = 0; + return; + } + + mask->fBounds = rgn.getBounds(); + mask->fRowBytes = mask->fBounds.width(); + mask->fFormat = SkMask::kA8_Format; + mask->fImage = SkMask::AllocImage(mask->computeImageSize()); + sk_bzero(mask->fImage, mask->computeImageSize()); + + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kA8_Config, mask->fBounds.width(), + mask->fBounds.height(), mask->fRowBytes); + bitmap.setPixels(mask->fImage); + + // canvas expects its coordinate system to always be 0,0 in the top/left + // so we translate the rgn to match that before drawing into the mask. + // + SkRegion tmpRgn(rgn); + tmpRgn.translate(-rgn.getBounds().fLeft, -rgn.getBounds().fTop); + + SkCanvas canvas(bitmap); + canvas.clipRegion(tmpRgn); + canvas.drawColor(SK_ColorBLACK); +} + +static SkIRect rand_rect(SkRandom& rand, int n) { + int x = rand.nextS() % n; + int y = rand.nextS() % n; + int w = rand.nextU() % n; + int h = rand.nextU() % n; + return SkIRect::MakeXYWH(x, y, w, h); +} + +static void make_rand_rgn(SkRegion* rgn, SkRandom& rand) { + int count = rand.nextU() % 20; + for (int i = 0; i < count; ++i) { + rgn->op(rand_rect(rand, 100), SkRegion::kXOR_Op); + } +} + +// aaclip.setRegion should create idential masks to the region +static void test_rgn(skiatest::Reporter* reporter) { + SkRandom rand; + for (int i = 0; i < 1000; i++) { + SkRegion rgn; + make_rand_rgn(&rgn, rand); + SkMask mask0; + copyToMask(rgn, &mask0); + SkAAClip aaclip; + aaclip.setRegion(rgn); + SkMask mask1; + aaclip.copyToMask(&mask1); + + REPORTER_ASSERT(reporter, mask0 == mask1); + + SkMask::FreeImage(mask0.fImage); + SkMask::FreeImage(mask1.fImage); + } +} + static const SkRegion::Op gRgnOps[] = { SkRegion::kDifference_Op, SkRegion::kIntersect_Op, @@ -138,6 +249,7 @@ static void TestAAClip(skiatest::Reporter* reporter) { test_empty(reporter); test_path_bounds(reporter); test_irect(reporter); + test_rgn(reporter); } #include "TestClassDef.h" -- cgit v1.2.3