• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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 "SkCanvas.h"
9 #include "SkGradientShader.h"
10 #include "SkPaintImageFilter.h"
11 #include "SkShader.h"
12 #include "Test.h"
13 
test_unscaled(skiatest::Reporter * reporter)14 static void test_unscaled(skiatest::Reporter* reporter) {
15     int w = 10, h = 10;
16     SkRect r = SkRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h));
17 
18     SkBitmap filterResult, paintResult;
19 
20     filterResult.allocN32Pixels(w, h);
21     SkCanvas canvasFilter(filterResult);
22     canvasFilter.clear(0x00000000);
23 
24     paintResult.allocN32Pixels(w, h);
25     SkCanvas canvasPaint(paintResult);
26     canvasPaint.clear(0x00000000);
27 
28     SkPoint center = SkPoint::Make(SkIntToScalar(5), SkIntToScalar(5));
29     SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
30     SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
31     SkScalar radius = SkIntToScalar(5);
32 
33     SkPaint gradientPaint;
34     gradientPaint.setShader(SkGradientShader::MakeRadial(
35         center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
36 
37     // Test using the image filter
38     {
39         SkPaint paint;
40         SkImageFilter::CropRect cr(r);
41         paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
42         canvasFilter.drawRect(r, paint);
43     }
44 
45     // Test using the paint directly
46     {
47         canvasPaint.drawRect(r, gradientPaint);
48     }
49 
50     // Assert that both paths yielded the same result
51     for (int y = 0; y < r.height(); ++y) {
52         const SkPMColor* filterPtr = filterResult.getAddr32(0, y);
53         const SkPMColor* paintPtr = paintResult.getAddr32(0, y);
54         for (int x = 0; x < r.width(); ++x, ++filterPtr, ++paintPtr) {
55             REPORTER_ASSERT(reporter, *filterPtr == *paintPtr);
56         }
57     }
58 }
59 
test_scaled(skiatest::Reporter * reporter)60 static void test_scaled(skiatest::Reporter* reporter) {
61     int w = 10, h = 10;
62     SkRect r = SkRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h));
63 
64     SkBitmap filterResult, paintResult;
65 
66     filterResult.allocN32Pixels(w, h);
67     SkCanvas canvasFilter(filterResult);
68     canvasFilter.clear(0x00000000);
69 
70     paintResult.allocN32Pixels(w, h);
71     SkCanvas canvasPaint(paintResult);
72     canvasPaint.clear(0x00000000);
73 
74     SkPoint center = SkPoint::Make(SkIntToScalar(5), SkIntToScalar(5));
75     SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
76     SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
77     SkScalar radius = SkIntToScalar(5);
78 
79     SkPaint gradientPaint;
80     gradientPaint.setShader(SkGradientShader::MakeRadial(
81         center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
82 
83     // Test using the image filter
84     {
85         SkPaint paint;
86         SkImageFilter::CropRect cr(r);
87         paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
88         canvasFilter.scale(SkIntToScalar(2), SkIntToScalar(2));
89         canvasFilter.drawRect(r, paint);
90     }
91 
92     // Test using the paint directly
93     {
94         canvasPaint.scale(SkIntToScalar(2), SkIntToScalar(2));
95         canvasPaint.drawRect(r, gradientPaint);
96     }
97 
98     // Assert that both paths yielded the same result
99     for (int y = 0; y < r.height(); ++y) {
100         const SkPMColor* filterPtr = filterResult.getAddr32(0, y);
101         const SkPMColor* paintPtr = paintResult.getAddr32(0, y);
102         for (int x = 0; x < r.width(); ++x, ++filterPtr, ++paintPtr) {
103             REPORTER_ASSERT(reporter, *filterPtr == *paintPtr);
104         }
105     }
106 }
107 
DEF_TEST(PaintImageFilter,reporter)108 DEF_TEST(PaintImageFilter, reporter) {
109     test_unscaled(reporter);
110     test_scaled(reporter);
111 }
112