blob: 03653368abc568cd8fa4c014c255e5acd8b1fb38 [file] [log] [blame]
ajuma77b6ba32016-01-08 14:58:35 -08001/*
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
14static 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
reed9283d202016-03-13 13:01:57 -070033 SkPaint gradientPaint;
reed1a9b9642016-03-13 14:13:58 -070034 gradientPaint.setShader(SkGradientShader::MakeRadial(
35 center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
ajuma77b6ba32016-01-08 14:58:35 -080036
37 // Test using the image filter
38 {
39 SkPaint paint;
40 SkImageFilter::CropRect cr(r);
robertphillips372177e2016-03-30 07:32:28 -070041 paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
ajuma77b6ba32016-01-08 14:58:35 -080042 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
60static 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
reed9283d202016-03-13 13:01:57 -070079 SkPaint gradientPaint;
reed1a9b9642016-03-13 14:13:58 -070080 gradientPaint.setShader(SkGradientShader::MakeRadial(
81 center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
ajuma77b6ba32016-01-08 14:58:35 -080082
83 // Test using the image filter
84 {
85 SkPaint paint;
86 SkImageFilter::CropRect cr(r);
robertphillips372177e2016-03-30 07:32:28 -070087 paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
ajuma77b6ba32016-01-08 14:58:35 -080088 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
108DEF_TEST(PaintImageFilter, reporter) {
109 test_unscaled(reporter);
110 test_scaled(reporter);
111}