aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/blurignorexform.cpp
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2017-05-30 11:15:07 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-30 15:34:49 +0000
commit2cb7a1a3bf6917c125c55f9eebcc13019f9adb1b (patch)
treeed705178ce6b3fd9c6221a806a23b620eecc099a /gm/blurignorexform.cpp
parentb474e2d826cf7d6ac232d1e39c61e02c472e43b6 (diff)
Add GM to test the IgnoreTransform flag on blurs
Bug: skia: Change-Id: I2525daa83d78280e4be3b31b66dc4f13971af311 Reviewed-on: https://skia-review.googlesource.com/18066 Commit-Queue: Greg Daniel <egdaniel@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'gm/blurignorexform.cpp')
-rw-r--r--gm/blurignorexform.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/gm/blurignorexform.cpp b/gm/blurignorexform.cpp
new file mode 100644
index 0000000000..8db56ab8d7
--- /dev/null
+++ b/gm/blurignorexform.cpp
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gm.h"
+#include "sk_tool_utils.h"
+
+#include "SkBlurMask.h"
+#include "SkBlurMaskFilter.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+
+// This GM tests out the SkBlurMaskFilter's kIgnoreTransform flag. That flag causes the blur mask
+// filter to not apply the CTM to the blur's radius.
+class BlurIgnoreXformGM : public skiagm::GM {
+public:
+ enum class DrawType {
+ kCircle,
+ kRect,
+ kRRect,
+ };
+
+ BlurIgnoreXformGM(DrawType drawType) : fDrawType(drawType) { }
+
+protected:
+ bool runAsBench() const override { return true; }
+
+ SkString onShortName() override {
+ SkString name;
+ name.printf("blur_ignore_xform_%s",
+ DrawType::kCircle == fDrawType ? "circle"
+ : DrawType::kRect == fDrawType ? "rect" : "rrect");
+ return name;
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(375, 475);
+ }
+
+ void onOnceBeforeDraw() override {
+ for (int i = 0; i < kNumBlurs; ++i) {
+ fBlurFilters[i] = SkBlurMaskFilter::Make(
+ kNormal_SkBlurStyle,
+ SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
+ SkBlurMaskFilter::kHighQuality_BlurFlag | kBlurFlags[i].fFlags);
+ }
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ SkPaint paint;
+ paint.setColor(SK_ColorBLACK);
+ paint.setAntiAlias(true);
+
+ canvas->translate(10, 25);
+ canvas->save();
+ canvas->translate(80, 0);
+ for (size_t i = 0; i < kNumBlurs; ++i) {
+ SkAutoCanvasRestore autoRestore(canvas, true);
+ canvas->translate(SkIntToScalar(i * 150), 0);
+ for (auto scale : kMatrixScales) {
+ canvas->save();
+ canvas->scale(scale.fScale, scale.fScale);
+ static const SkScalar kRadius = 20.0f;
+ SkScalar coord = 50.0f * 1.0f / scale.fScale;
+ SkRect rect = SkRect::MakeXYWH(coord - kRadius , coord - kRadius,
+ 2 * kRadius, 2 * kRadius);
+ SkRRect rrect = SkRRect::MakeRectXY(rect, kRadius/2.0f, kRadius/2.0f);
+
+ paint.setMaskFilter(fBlurFilters[i]);
+ for (int j = 0; j < 2; ++j) {
+ canvas->save();
+ canvas->translate(10 * (1 - j), 10 * (1 - j));
+ if (DrawType::kCircle == fDrawType) {
+ canvas->drawCircle(coord, coord, kRadius, paint);
+ } else if (DrawType::kRect == fDrawType) {
+ canvas->drawRect(rect, paint);
+ } else {
+ canvas->drawRRect(rrect, paint);
+ }
+ paint.setMaskFilter(nullptr);
+ canvas->restore();
+ }
+ canvas->restore();
+ canvas->translate(0, SkIntToScalar(150));
+ }
+ }
+ canvas->restore();
+ if (kBench_Mode != this->getMode()) {
+ this->drawOverlay(canvas);
+ }
+ }
+
+ void drawOverlay(SkCanvas* canvas) {
+ canvas->translate(10, 0);
+ SkPaint textPaint;
+ sk_tool_utils::set_portable_typeface(&textPaint);
+ textPaint.setAntiAlias(true);
+ canvas->save();
+ for (int i = 0; i < kNumBlurs; ++i) {
+ canvas->drawString(kBlurFlags[i].fName, 100, 0, textPaint);
+ canvas->translate(SkIntToScalar(130), 0);
+ }
+ canvas->restore();
+ for (auto scale : kMatrixScales) {
+ canvas->drawString(scale.fName, 0, 50, textPaint);
+ canvas->translate(0, SkIntToScalar(150));
+ }
+ }
+
+private:
+ static constexpr int kNumBlurs = 2;
+
+ static const struct BlurFlags {
+ uint32_t fFlags;
+ const char* fName;
+ } kBlurFlags[kNumBlurs];
+
+ static const struct MatrixScale {
+ float fScale;
+ const char* fName;
+ } kMatrixScales[3];
+
+ DrawType fDrawType;
+ sk_sp<SkMaskFilter> fBlurFilters[kNumBlurs];
+
+ typedef skiagm::GM INHERITED;
+};
+
+const BlurIgnoreXformGM::BlurFlags BlurIgnoreXformGM::kBlurFlags[] = {
+ {0, "none"},
+ {SkBlurMaskFilter::kIgnoreTransform_BlurFlag, "IgnoreTransform"}
+};
+
+const BlurIgnoreXformGM::MatrixScale BlurIgnoreXformGM::kMatrixScales[] = {
+ {1.0f, "Identity"},
+ {0.5f, "Scale = 0.5"},
+ {2.0f, "Scale = 2.0"}
+};
+
+DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kCircle);)
+DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRect);)
+DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRRect);)
+
+
+