Index: tests/BlurTest.cpp |
diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp |
index 028b509b5120463a696566f03ab2e156f2921e21..c09a4ee1c664e548107c739b6d5f13a7c1728c95 100644 |
--- a/tests/BlurTest.cpp |
+++ b/tests/BlurTest.cpp |
@@ -1,12 +1,15 @@ |
- |
/* |
* Copyright 2011 Google Inc. |
* |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
*/ |
+ |
#include "SkBlurMask.h" |
#include "SkBlurMaskFilter.h" |
+#include "SkBlurDrawLooper.h" |
+#include "SkLayerDrawLooper.h" |
+#include "SkEmbossMaskFilter.h" |
#include "SkCanvas.h" |
#include "SkMath.h" |
#include "SkPaint.h" |
@@ -380,7 +383,187 @@ static void test_sigma_range(skiatest::Reporter* reporter, GrContextFactory* fac |
} |
} |
+/////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+static SkBlurQuality blurMaskFilterFlags_as_quality(uint32_t blurMaskFilterFlags) { |
+ return (blurMaskFilterFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
+ kHigh_SkBlurQuality : kLow_SkBlurQuality; |
+} |
+ |
+static uint32_t blurMaskFilterFlags_to_blurDrawLooperFlags(uint32_t bmf) { |
+ const struct { |
+ uint32_t fBlurMaskFilterFlag; |
+ uint32_t fBlurDrawLooperFlag; |
+ } pairs[] = { |
+ { SkBlurMaskFilter::kIgnoreTransform_BlurFlag, SkBlurDrawLooper::kIgnoreTransform_BlurFlag }, |
+ { SkBlurMaskFilter::kHighQuality_BlurFlag, SkBlurDrawLooper::kHighQuality_BlurFlag }, |
+ }; |
+ |
+ uint32_t bdl = 0; |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(pairs); ++i) { |
+ if (bmf & pairs[i].fBlurMaskFilterFlag) { |
+ bdl |= pairs[i].fBlurDrawLooperFlag; |
+ } |
+ } |
+ return bdl; |
+} |
+ |
+static void test_blurDrawLooper(skiatest::Reporter* reporter, SkScalar sigma, |
+ SkBlurStyle style, uint32_t blurMaskFilterFlags) { |
+ if (kNormal_SkBlurStyle != style) { |
+ return; // blurdrawlooper only supports normal |
+ } |
+ |
+ const SkColor color = 0xFF335577; |
+ const SkScalar dx = 10; |
+ const SkScalar dy = -5; |
+ const SkBlurQuality quality = blurMaskFilterFlags_as_quality(blurMaskFilterFlags); |
+ uint32_t flags = blurMaskFilterFlags_to_blurDrawLooperFlags(blurMaskFilterFlags); |
+ |
+ SkAutoTUnref<SkDrawLooper> lp(SkBlurDrawLooper::Create(color, sigma, dx, dy, flags)); |
+ |
+ const bool expectSuccess = sigma > 0 && |
+ 0 == (flags & SkBlurDrawLooper::kIgnoreTransform_BlurFlag); |
+ |
+ if (NULL == lp.get()) { |
+ REPORTER_ASSERT(reporter, sigma <= 0); |
+ } else { |
+ SkDrawLooper::BlurShadowRec rec; |
+ bool success = lp->asABlurShadow(&rec); |
+ REPORTER_ASSERT(reporter, success == expectSuccess); |
+ if (success) { |
+ REPORTER_ASSERT(reporter, rec.fSigma == sigma); |
+ REPORTER_ASSERT(reporter, rec.fOffset.x() == dx); |
+ REPORTER_ASSERT(reporter, rec.fOffset.y() == dy); |
+ REPORTER_ASSERT(reporter, rec.fColor == color); |
+ REPORTER_ASSERT(reporter, rec.fStyle == style); |
+ REPORTER_ASSERT(reporter, rec.fQuality == quality); |
+ } |
+ } |
+} |
+ |
+static void test_delete_looper(skiatest::Reporter* reporter, SkDrawLooper* lp, SkScalar sigma, |
+ SkBlurStyle style, SkBlurQuality quality, bool expectSuccess) { |
+ SkDrawLooper::BlurShadowRec rec; |
+ bool success = lp->asABlurShadow(&rec); |
+ REPORTER_ASSERT(reporter, success == expectSuccess); |
+ if (success != expectSuccess) { |
+ lp->asABlurShadow(&rec); |
+ } |
+ if (success) { |
+ REPORTER_ASSERT(reporter, rec.fSigma == sigma); |
+ REPORTER_ASSERT(reporter, rec.fStyle == style); |
+ REPORTER_ASSERT(reporter, rec.fQuality == quality); |
+ } |
+ lp->unref(); |
+} |
+ |
+static void make_noop_layer(SkLayerDrawLooper::Builder* builder) { |
+ SkLayerDrawLooper::LayerInfo info; |
+ |
+ info.fPaintBits = 0; |
+ info.fColorMode = SkXfermode::kDst_Mode; |
+ builder->addLayer(info); |
+} |
+ |
+static void make_blur_layer(SkLayerDrawLooper::Builder* builder, SkMaskFilter* mf) { |
+ SkLayerDrawLooper::LayerInfo info; |
+ |
+ info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit; |
+ info.fColorMode = SkXfermode::kSrc_Mode; |
+ SkPaint* paint = builder->addLayer(info); |
+ paint->setMaskFilter(mf); |
+} |
+ |
+static void test_layerDrawLooper(skiatest::Reporter* reporter, SkMaskFilter* mf, SkScalar sigma, |
+ SkBlurStyle style, SkBlurQuality quality, bool expectSuccess) { |
+ |
+ SkLayerDrawLooper::LayerInfo info; |
+ SkLayerDrawLooper::Builder builder; |
+ |
+ // 1 layer is too few |
+ make_noop_layer(&builder); |
+ test_delete_looper(reporter, builder.detachLooper(), sigma, style, quality, false); |
+ |
+ // 2 layers is good, but need blur |
+ make_noop_layer(&builder); |
+ make_noop_layer(&builder); |
+ test_delete_looper(reporter, builder.detachLooper(), sigma, style, quality, false); |
+ |
+ // 2 layers is just right |
+ make_noop_layer(&builder); |
+ make_blur_layer(&builder, mf); |
+ test_delete_looper(reporter, builder.detachLooper(), sigma, style, quality, expectSuccess); |
+ |
+ // 3 layers is too many |
+ make_noop_layer(&builder); |
+ make_blur_layer(&builder, mf); |
+ make_noop_layer(&builder); |
+ test_delete_looper(reporter, builder.detachLooper(), sigma, style, quality, false); |
+} |
+ |
+static void test_asABlur(skiatest::Reporter* reporter) { |
+ const SkBlurStyle styles[] = { |
+ kNormal_SkBlurStyle, kSolid_SkBlurStyle, kOuter_SkBlurStyle, kInner_SkBlurStyle |
+ }; |
+ const SkScalar sigmas[] = { |
+ // values <= 0 should not success for a blur |
+ -1, 0, 0.5f, 2 |
+ }; |
+ |
+ // Test asABlur for SkBlurMaskFilter |
+ // |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(styles); ++i) { |
+ const SkBlurStyle style = (SkBlurStyle)styles[i]; |
+ for (size_t j = 0; j < SK_ARRAY_COUNT(sigmas); ++j) { |
+ const SkScalar sigma = sigmas[j]; |
+ for (int flags = 0; flags <= SkBlurMaskFilter::kAll_BlurFlag; ++flags) { |
+ const SkBlurQuality quality = blurMaskFilterFlags_as_quality(flags); |
+ |
+ SkAutoTUnref<SkMaskFilter> mf(SkBlurMaskFilter::Create(style, sigma, flags)); |
+ if (NULL == mf.get()) { |
+ REPORTER_ASSERT(reporter, sigma <= 0); |
+ } else { |
+ REPORTER_ASSERT(reporter, sigma > 0); |
+ SkMaskFilter::BlurRec rec; |
+ bool success = mf->asABlur(&rec); |
+ if (flags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { |
+ REPORTER_ASSERT(reporter, !success); |
+ } else { |
+ REPORTER_ASSERT(reporter, success); |
+ REPORTER_ASSERT(reporter, rec.fSigma == sigma); |
+ REPORTER_ASSERT(reporter, rec.fStyle == style); |
+ REPORTER_ASSERT(reporter, rec.fQuality == quality); |
+ } |
+ test_layerDrawLooper(reporter, mf, sigma, style, quality, success); |
+ } |
+ test_blurDrawLooper(reporter, sigma, style, flags); |
+ } |
+ } |
+ } |
+ |
+ // Test asABlur for SkEmbossMaskFilter -- should never succeed |
+ // |
+ { |
+ SkEmbossMaskFilter::Light light = { |
+ { 1, 1, 1 }, 0, 127, 127 |
+ }; |
+ for (size_t j = 0; j < SK_ARRAY_COUNT(sigmas); ++j) { |
+ const SkScalar sigma = sigmas[j]; |
+ SkAutoTUnref<SkMaskFilter> mf(SkEmbossMaskFilter::Create(sigma, light)); |
+ if (mf.get()) { |
+ SkMaskFilter::BlurRec rec; |
+ bool success = mf->asABlur(&rec); |
+ REPORTER_ASSERT(reporter, !success); |
+ } |
+ } |
+ } |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////// |
+ |
DEF_GPUTEST(Blur, reporter, factory) { |
test_blur_drawing(reporter); |
test_sigma_range(reporter, factory); |
+ test_asABlur(reporter); |
} |