blob: 237c678f4d2f484f1b40afe11355b0d2fd6246d3 [file] [log] [blame]
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
robertphillips@google.comb7061172013-09-06 14:16:12 +00009#include "SkBlurMask.h"
robertphillips@google.comb7061172013-09-06 14:16:12 +000010#include "SkCanvas.h"
Mike Reed1be1f8d2018-03-14 13:01:17 -040011#include "SkMaskFilter.h"
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000012
13// This GM tests out the quick reject bounds of the blur mask filter. It draws
14// four blurred rects around a central clip. The blurred rect geometry outset
15// by the blur radius does not overlap the clip rect so, if the blur clipping
16// just uses the radius, they will be clipped out (and the result will differ
17// from the result if quick reject were disabled. If the blur clipping uses
18// the correct 3 sigma bound then the images with and without quick rejecting
19// will be the same.
20class BlurQuickRejectGM : public skiagm::GM {
21public:
22 BlurQuickRejectGM() {}
23
24protected:
mtklein36352bf2015-03-25 18:17:31 -070025 SkString onShortName() override {
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000026 return SkString("blurquickreject");
27 }
28
mtklein36352bf2015-03-25 18:17:31 -070029 SkISize onISize() override {
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000030 return SkISize::Make(kWidth, kHeight);
31 }
32
mtklein36352bf2015-03-25 18:17:31 -070033 void onDraw(SkCanvas* canvas) override {
mtkleindbfd7ab2016-09-01 11:24:54 -070034 constexpr SkScalar kBlurRadius = SkIntToScalar(20);
35 constexpr SkScalar kBoxSize = SkIntToScalar(100);
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000036
37 SkRect clipRect = SkRect::MakeXYWH(0, 0, kBoxSize, kBoxSize);
38 SkRect blurRects[] = {
39 { -kBoxSize - (kBlurRadius+1), 0, -(kBlurRadius+1), kBoxSize },
40 { 0, -kBoxSize - (kBlurRadius+1), kBoxSize, -(kBlurRadius+1) },
41 { kBoxSize+kBlurRadius+1, 0, 2*kBoxSize+kBlurRadius+1, kBoxSize },
42 { 0, kBoxSize+kBlurRadius+1, kBoxSize, 2*kBoxSize+kBlurRadius+1 }
43 };
44 SkColor colors[] = {
45 SK_ColorRED,
46 SK_ColorGREEN,
47 SK_ColorBLUE,
48 SK_ColorYELLOW,
49 };
50 SkASSERT(SK_ARRAY_COUNT(colors) == SK_ARRAY_COUNT(blurRects));
51
52 SkPaint hairlinePaint;
53 hairlinePaint.setStyle(SkPaint::kStroke_Style);
54 hairlinePaint.setColor(SK_ColorWHITE);
55 hairlinePaint.setStrokeWidth(0);
56
57 SkPaint blurPaint;
reed93a12152015-03-16 10:08:34 -070058 blurPaint.setFilterQuality(kLow_SkFilterQuality);
Mike Reed1be1f8d2018-03-14 13:01:17 -040059 blurPaint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
reedefdfd512016-04-04 10:02:58 -070060 SkBlurMask::ConvertRadiusToSigma(kBlurRadius)));
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000061
62 canvas->clear(SK_ColorBLACK);
63 canvas->save();
64 canvas->translate(kBoxSize, kBoxSize);
65 canvas->drawRect(clipRect, hairlinePaint);
66 canvas->clipRect(clipRect);
robertphillips@google.com073a32e2013-07-30 12:29:20 +000067 for (size_t i = 0; i < SK_ARRAY_COUNT(blurRects); ++i) {
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000068 blurPaint.setColor(colors[i]);
69 canvas->drawRect(blurRects[i], blurPaint);
70 canvas->drawRect(blurRects[i], hairlinePaint);
71 }
72 canvas->restore();
73 }
74
75private:
mtkleindbfd7ab2016-09-01 11:24:54 -070076 static constexpr int kWidth = 300;
77 static constexpr int kHeight = 300;
robertphillips@google.com17ad2bd2013-07-30 12:15:19 +000078
79 typedef GM INHERITED;
80};
81
82DEF_GM( return new BlurQuickRejectGM(); )