• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #include "Test.h"
9 #include "SkBlurMaskFilter.h"
10 #include "SkCanvas.h"
11 #include "SkMath.h"
12 #include "SkPaint.h"
13 #include "SkRandom.h"
14 
15 ///////////////////////////////////////////////////////////////////////////////
16 
17 #define ILLEGAL_MODE    ((SkXfermode::Mode)-1)
18 
19 static const int outset = 100;
20 static const SkColor bgColor = SK_ColorWHITE;
21 static const int strokeWidth = 4;
22 
create(SkBitmap * bm,SkIRect bound,SkBitmap::Config config)23 static void create(SkBitmap* bm, SkIRect bound, SkBitmap::Config config) {
24     bm->setConfig(config, bound.width(), bound.height());
25     bm->allocPixels();
26 }
27 
drawBG(SkCanvas * canvas)28 static void drawBG(SkCanvas* canvas) {
29     canvas->drawColor(bgColor);
30 }
31 
32 
33 struct BlurTest {
34     void (*addPath)(SkPath*);
35     int viewLen;
36     SkIRect views[9];
37 };
38 
39 //Path Draw Procs
40 //Beware that paths themselves my draw differently depending on the clip.
draw50x50Rect(SkPath * path)41 static void draw50x50Rect(SkPath* path) {
42     path->addRect(0, 0, SkIntToScalar(50), SkIntToScalar(50));
43 }
44 
45 //Tests
46 static BlurTest tests[] = {
47     { draw50x50Rect, 3, {
48         //inner half of blur
49         { 0, 0, 50, 50 },
50         //blur, but no path.
51         { 50 + strokeWidth/2, 50 + strokeWidth/2, 100, 100 },
52         //just an edge
53         { 40, strokeWidth, 60, 50 - strokeWidth },
54     }},
55 };
56 
57 /** Assumes that the ref draw was completely inside ref canvas --
58     implies that everything outside is "bgColor".
59     Checks that all overlap is the same and that all non-overlap on the
60     ref is "bgColor".
61  */
compare(const SkBitmap & ref,const SkIRect & iref,const SkBitmap & test,const SkIRect & itest)62 static bool compare(const SkBitmap& ref, const SkIRect& iref,
63                     const SkBitmap& test, const SkIRect& itest)
64 {
65     const int xOff = itest.fLeft - iref.fLeft;
66     const int yOff = itest.fTop - iref.fTop;
67 
68     SkAutoLockPixels alpRef(ref);
69     SkAutoLockPixels alpTest(test);
70 
71     for (int y = 0; y < test.height(); ++y) {
72         for (int x = 0; x < test.width(); ++x) {
73             SkColor testColor = test.getColor(x, y);
74             int refX = x + xOff;
75             int refY = y + yOff;
76             SkColor refColor;
77             if (refX >= 0 && refX < ref.width() &&
78                 refY >= 0 && refY < ref.height())
79             {
80                 refColor = ref.getColor(refX, refY);
81             } else {
82                 refColor = bgColor;
83             }
84             if (refColor != testColor) {
85                 return false;
86             }
87         }
88     }
89     return true;
90 }
91 
test_blur(skiatest::Reporter * reporter)92 static void test_blur(skiatest::Reporter* reporter) {
93 
94     SkPaint paint;
95     paint.setColor(SK_ColorGRAY);
96     paint.setStyle(SkPaint::kStroke_Style);
97     paint.setStrokeWidth(SkIntToScalar(strokeWidth));
98 
99     SkScalar radius = SkIntToScalar(5);
100     for (int style = 0; style < SkBlurMaskFilter::kBlurStyleCount; ++style) {
101         SkBlurMaskFilter::BlurStyle blurStyle =
102             static_cast<SkBlurMaskFilter::BlurStyle>(style);
103 
104         const uint32_t flagPermutations = SkBlurMaskFilter::kAll_BlurFlag;
105         for (uint32_t flags = 0; flags < flagPermutations; ++flags) {
106             SkMaskFilter* filter;
107             filter = SkBlurMaskFilter::Create(radius, blurStyle, flags);
108 
109             SkMaskFilter::BlurInfo info;
110             sk_bzero(&info, sizeof(info));
111             SkMaskFilter::BlurType type = filter->asABlur(&info);
112 
113             REPORTER_ASSERT(reporter, type ==
114                 static_cast<SkMaskFilter::BlurType>(style + 1));
115             REPORTER_ASSERT(reporter, info.fRadius == radius);
116             REPORTER_ASSERT(reporter, info.fIgnoreTransform ==
117                 SkToBool(flags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
118             REPORTER_ASSERT(reporter, info.fHighQuality ==
119                 SkToBool(flags & SkBlurMaskFilter::kHighQuality_BlurFlag));
120 
121             paint.setMaskFilter(filter);
122             filter->unref();
123 
124             for (size_t test = 0; test < SK_ARRAY_COUNT(tests); ++test) {
125                 SkPath path;
126                 tests[test].addPath(&path);
127                 SkPath strokedPath;
128                 paint.getFillPath(path, &strokedPath);
129                 SkRect refBound = strokedPath.getBounds();
130                 SkIRect iref;
131                 refBound.roundOut(&iref);
132                 iref.inset(-outset, -outset);
133                 SkBitmap refBitmap;
134                 create(&refBitmap, iref, SkBitmap::kARGB_8888_Config);
135 
136                 SkCanvas refCanvas(refBitmap);
137                 refCanvas.translate(SkIntToScalar(-iref.fLeft),
138                                     SkIntToScalar(-iref.fTop));
139                 drawBG(&refCanvas);
140                 refCanvas.drawPath(path, paint);
141 
142                 for (int view = 0; view < tests[test].viewLen; ++view) {
143                     SkIRect itest = tests[test].views[view];
144                     SkBitmap testBitmap;
145                     create(&testBitmap, itest, SkBitmap::kARGB_8888_Config);
146 
147                     SkCanvas testCanvas(testBitmap);
148                     testCanvas.translate(SkIntToScalar(-itest.fLeft),
149                                          SkIntToScalar(-itest.fTop));
150                     drawBG(&testCanvas);
151                     testCanvas.drawPath(path, paint);
152 
153                     REPORTER_ASSERT(reporter,
154                         compare(refBitmap, iref, testBitmap, itest));
155                 }
156             }
157         }
158     }
159 }
160 
161 #include "TestClassDef.h"
162 DEFINE_TESTCLASS("BlurMaskFilter", BlurTestClass, test_blur)
163