| Index: tests/BlurTest.cpp
|
| diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp
|
| index 32e2930171211c97e70edc14ebbf42ac073fee0d..d9fca98fa65e19edaf932efc3ca19a2fe6119ae3 100644
|
| --- a/tests/BlurTest.cpp
|
| +++ b/tests/BlurTest.cpp
|
| @@ -577,12 +577,15 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SmallBoxBlurBug, reporter, ctxInfo) {
|
|
|
| DEF_TEST(BlurredRRectNinePatchComputation, reporter) {
|
| const SkRect r = SkRect::MakeXYWH(10, 10, 100, 100);
|
| + static const SkScalar kBlurRad = 3.0f;
|
|
|
| bool ninePatchable;
|
| SkRRect rrectToDraw;
|
| SkISize size;
|
| - SkScalar xs[4], ys[4];
|
| - int numXs, numYs;
|
| + SkScalar rectXs[SkBlurMaskFilter::kMaxDivisions], rectYs[SkBlurMaskFilter::kMaxDivisions];
|
| + SkScalar texXs[SkBlurMaskFilter::kMaxDivisions], texYs[SkBlurMaskFilter::kMaxDivisions];
|
| + int numX, numY;
|
| + uint32_t skipMask;
|
|
|
| // not nine-patchable
|
| {
|
| @@ -591,47 +594,123 @@ DEF_TEST(BlurredRRectNinePatchComputation, reporter) {
|
| SkRRect rr;
|
| rr.setRectRadii(r, radii);
|
|
|
| - ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, 3.0f, &rrectToDraw, &size,
|
| - xs, &numXs, ys, &numYs);
|
| + ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, rr, SkRect::MakeEmpty(),
|
| + kBlurRad, kBlurRad,
|
| + &rrectToDraw, &size,
|
| + rectXs, rectYs, texXs, texYs,
|
| + &numX, &numY, &skipMask);
|
| REPORTER_ASSERT(reporter, !ninePatchable);
|
| }
|
|
|
| // simple circular
|
| {
|
| + static const SkScalar kCornerRad = 10.0f;
|
| SkRRect rr;
|
| - rr.setRectXY(r, 10, 10);
|
| + rr.setRectXY(r, kCornerRad, kCornerRad);
|
|
|
| - ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, 3.0f, &rrectToDraw, &size,
|
| - xs, &numXs, ys, &numYs);
|
| + ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, rr, SkRect::MakeEmpty(),
|
| + kBlurRad, kBlurRad,
|
| + &rrectToDraw, &size,
|
| + rectXs, rectYs, texXs, texYs,
|
| + &numX, &numY, &skipMask);
|
| +
|
| + static const SkScalar kAns = 12.0f * kBlurRad + 2.0f * kCornerRad + 1.0f;
|
| REPORTER_ASSERT(reporter, ninePatchable);
|
| - REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fWidth), 57.0f));
|
| - REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fHeight), 57.0));
|
| - REPORTER_ASSERT(reporter, 4 == numXs && 4 == numYs);
|
| - for (int i = 0; i < numXs; ++i) {
|
| - REPORTER_ASSERT(reporter, xs[i] >= 0.0f && xs[i] <= 1.0f);
|
| - }
|
| - for (int i = 0; i < numYs; ++i) {
|
| - REPORTER_ASSERT(reporter, ys[i] >= 0.0f && ys[i] <= 1.0f);
|
| - }
|
| + REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fWidth), kAns));
|
| + REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fHeight), kAns));
|
| + REPORTER_ASSERT(reporter, 4 == numX && 4 == numY);
|
| + REPORTER_ASSERT(reporter, !skipMask);
|
| }
|
|
|
| // simple elliptical
|
| {
|
| + static const SkScalar kXCornerRad = 2.0f;
|
| + static const SkScalar kYCornerRad = 10.0f;
|
| SkRRect rr;
|
| - rr.setRectXY(r, 2, 10);
|
| + rr.setRectXY(r, kXCornerRad, kYCornerRad);
|
| +
|
| + ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, rr, SkRect::MakeEmpty(),
|
| + kBlurRad, kBlurRad,
|
| + &rrectToDraw, &size,
|
| + rectXs, rectYs, texXs, texYs,
|
| + &numX, &numY, &skipMask);
|
| +
|
| + static const SkScalar kXAns = 12.0f * kBlurRad + 2.0f * kXCornerRad + 1.0f;
|
| + static const SkScalar kYAns = 12.0f * kBlurRad + 2.0f * kYCornerRad + 1.0f;
|
|
|
| - ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(rr, 3.0f, &rrectToDraw, &size,
|
| - xs, &numXs, ys, &numYs);
|
| REPORTER_ASSERT(reporter, ninePatchable);
|
| - REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fWidth), 41.0f));
|
| - REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fHeight), 57.0));
|
| - REPORTER_ASSERT(reporter, 4 == numXs && 4 == numYs);
|
| - for (int i = 0; i < numXs; ++i) {
|
| - REPORTER_ASSERT(reporter, xs[i] >= 0.0f && xs[i] <= 1.0f);
|
| - }
|
| - for (int i = 0; i < numYs; ++i) {
|
| - REPORTER_ASSERT(reporter, ys[i] >= 0.0f && ys[i] <= 1.0f);
|
| + REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fWidth), kXAns));
|
| + REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SkIntToScalar(size.fHeight), kYAns));
|
| + REPORTER_ASSERT(reporter, 4 == numX && 4 == numY);
|
| + REPORTER_ASSERT(reporter, !skipMask);
|
| + }
|
| +
|
| + // test-out occlusion
|
| + {
|
| + static const SkScalar kCornerRad = 10.0f;
|
| + SkRRect rr;
|
| + rr.setRectXY(r, kCornerRad, kCornerRad);
|
| +
|
| + // The rectXs & rectYs should be { 1, 29, 91, 119 }. Add two more points around each.
|
| + SkScalar testLocs[] = {
|
| + -18.0f, -9.0f,
|
| + 1.0f,
|
| + 9.0f, 18.0f,
|
| + 29.0f,
|
| + 39.0f, 49.0f,
|
| + 91.0f,
|
| + 109.0f, 118.0f,
|
| + 119.0f,
|
| + 139.0f, 149.0f
|
| + };
|
| +
|
| + for (int minY = 0; minY < (int)SK_ARRAY_COUNT(testLocs); ++minY) {
|
| + for (int maxY = minY+1; maxY < (int)SK_ARRAY_COUNT(testLocs); ++maxY) {
|
| + for (int minX = 0; minX < (int)SK_ARRAY_COUNT(testLocs); ++minX) {
|
| + for (int maxX = minX+1; maxX < (int)SK_ARRAY_COUNT(testLocs); ++maxX) {
|
| + SkRect occluder = SkRect::MakeLTRB(testLocs[minX], testLocs[minY],
|
| + testLocs[maxX], testLocs[maxY]);
|
| + if (occluder.isEmpty()) {
|
| + continue;
|
| + }
|
| +
|
| + ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(
|
| + rr, rr, occluder,
|
| + kBlurRad, kBlurRad,
|
| + &rrectToDraw, &size,
|
| + rectXs, rectYs, texXs, texYs,
|
| + &numX, &numY, &skipMask);
|
| +
|
| + static const SkScalar kAns = 12.0f * kBlurRad + 2.0f * kCornerRad + 1.0f;
|
| + REPORTER_ASSERT(reporter, ninePatchable);
|
| + REPORTER_ASSERT(reporter,
|
| + SkScalarNearlyEqual(SkIntToScalar(size.fWidth), kAns));
|
| + REPORTER_ASSERT(reporter,
|
| + SkScalarNearlyEqual(SkIntToScalar(size.fHeight), kAns));
|
| +
|
| + int checkBit = 0x1;
|
| + for (int y = 0; y < numY-1; ++y) {
|
| + for (int x = 0; x < numX-1; ++x) {
|
| + SkRect cell = SkRect::MakeLTRB(rectXs[x], rectYs[y],
|
| + rectXs[x+1], rectYs[y+1]);
|
| + REPORTER_ASSERT(reporter,
|
| + SkToBool(skipMask & checkBit) ==
|
| + (cell.isEmpty() || occluder.contains(cell)));
|
| +
|
| + REPORTER_ASSERT(reporter, texXs[x] >= 0 &&
|
| + texXs[x] <= size.fWidth);
|
| + REPORTER_ASSERT(reporter, texYs[y] >= 0 &&
|
| + texXs[y] <= size.fHeight);
|
| +
|
| + checkBit <<= 1;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| }
|
| +
|
| +
|
| }
|
|
|
| }
|
|
|