OLD | NEW |
---|---|
(Empty) | |
1 /* | |
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 #include "Test.h" | |
8 #include "SkBitmap.h" | |
9 #include "SkCanvas.h" | |
10 #include "SkDraw.h" | |
11 #include "SkDevice.h" | |
12 #include "SkLayerDrawLooper.h" | |
13 #include "SkMatrix.h" | |
14 #include "SkPaint.h" | |
15 #include "SkRect.h" | |
16 #include "SkRefCnt.h" | |
17 #include "SkScalar.h" | |
18 #include "SkXfermode.h" | |
19 | |
20 namespace { | |
21 | |
22 class FakeDevice : public SkDevice { | |
23 public: | |
24 FakeDevice() : SkDevice(SkBitmap::kARGB_8888_Config, 100, 100) { } | |
25 | |
26 virtual void drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& pa int) { | |
27 fLastMatrix = *draw.fMatrix; | |
28 SkDevice::drawRect(draw, r, paint); | |
29 } | |
30 | |
31 SkMatrix fLastMatrix; | |
32 }; | |
33 | |
34 } // namespace | |
35 | |
36 static void test_frontToBack(skiatest::Reporter* reporter) { | |
37 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
38 SkAutoUnref aur(looper); | |
Tom Hudson
2013/05/22 09:46:04
Probably slightly more idiomatic to use SkAutoUnre
jbroman
2013/05/22 12:18:48
Changed to SkAutoTUnref<SkLayerDrawLooper>, here a
| |
39 SkLayerDrawLooper::LayerInfo layerInfo; | |
40 | |
41 // Add the front layer, with the defaults. | |
42 (void)looper->addLayer(layerInfo); | |
43 | |
44 // Add the back layer, with some layer info set. | |
45 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
46 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
47 SkPaint* layerPaint = looper->addLayer(layerInfo); | |
48 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
49 | |
50 FakeDevice device; | |
51 SkCanvas canvas(&device); | |
52 SkPaint paint; | |
53 looper->init(&canvas); | |
54 | |
55 // The back layer should come first. | |
56 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
57 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
58 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
59 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
60 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
61 paint.reset(); | |
62 | |
63 // Then the front layer. | |
64 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
65 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
66 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
67 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
68 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
69 | |
70 // Only two layers were added, so that should be the end. | |
71 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
72 } | |
73 | |
74 static void test_backToFront(skiatest::Reporter* reporter) { | |
75 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
76 SkAutoUnref aur(looper); | |
77 SkLayerDrawLooper::LayerInfo layerInfo; | |
78 | |
79 // Add the back layer, with the defaults. | |
80 (void)looper->addLayerOnTop(layerInfo); | |
81 | |
82 // Add the front layer, with some layer info set. | |
83 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
84 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
85 SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); | |
86 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
87 | |
88 FakeDevice device; | |
89 SkCanvas canvas(&device); | |
90 SkPaint paint; | |
91 looper->init(&canvas); | |
92 | |
93 // The back layer should come first. | |
94 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
95 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
96 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
97 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
98 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
99 paint.reset(); | |
100 | |
101 // Then the front layer. | |
102 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
103 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
104 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
105 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
106 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
107 | |
108 // Only two layers were added, so that should be the end. | |
109 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
110 } | |
111 | |
112 static void test_mixed(skiatest::Reporter* reporter) { | |
113 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
114 SkAutoUnref aur(looper); | |
115 SkLayerDrawLooper::LayerInfo layerInfo; | |
116 | |
117 // Add the back layer, with the defaults. | |
118 (void)looper->addLayer(layerInfo); | |
119 | |
120 // Add the front layer, with some layer info set. | |
121 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
122 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
123 SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); | |
124 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
125 | |
126 FakeDevice device; | |
127 SkCanvas canvas(&device); | |
128 SkPaint paint; | |
129 looper->init(&canvas); | |
130 | |
131 // The back layer should come first. | |
132 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
133 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
134 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
135 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
136 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
137 paint.reset(); | |
138 | |
139 // Then the front layer. | |
140 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
141 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
142 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
143 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
144 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
145 | |
146 // Only two layers were added, so that should be the end. | |
147 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
148 } | |
149 | |
150 static void TestLayerDrawLooper(skiatest::Reporter* reporter) { | |
151 test_frontToBack(reporter); | |
152 test_backToFront(reporter); | |
153 test_mixed(reporter); | |
154 } | |
155 | |
156 #include "TestClassDef.h" | |
157 DEFINE_TESTCLASS("LayerDrawLooper", TestLayerDrawLooperClass, TestLayerDrawLoope r) | |
OLD | NEW |