OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "Test.h" | 9 #include "Test.h" |
| 10 #include "SkBitmapDevice.h" |
| 11 #include "SkCanvas.h" |
10 #include "SkTileGrid.h" | 12 #include "SkTileGrid.h" |
11 #include "SkTileGridPicture.h" | 13 #include "SkTileGridPicture.h" |
12 #include "SkCanvas.h" | |
13 #include "SkDevice.h" | |
14 | 14 |
15 enum Tile { | 15 enum Tile { |
16 kTopLeft_Tile = 0x1, | 16 kTopLeft_Tile = 0x1, |
17 kTopRight_Tile = 0x2, | 17 kTopRight_Tile = 0x2, |
18 kBottomLeft_Tile = 0x4, | 18 kBottomLeft_Tile = 0x4, |
19 kBottomRight_Tile = 0x8, | 19 kBottomRight_Tile = 0x8, |
20 | 20 |
21 kAll_Tile = kTopLeft_Tile | kTopRight_Tile | kBottomLeft_Tile | kBottomRight
_Tile, | 21 kAll_Tile = kTopLeft_Tile | kTopRight_Tile | kBottomLeft_Tile | kBottomRight
_Tile, |
22 }; | 22 }; |
23 | 23 |
24 namespace { | 24 namespace { |
25 class MockCanvas : public SkCanvas { | 25 class MockCanvas : public SkCanvas { |
26 public: | 26 public: |
27 MockCanvas(SkDevice* device) : SkCanvas(device) | 27 MockCanvas(SkBaseDevice* device) : SkCanvas(device) |
28 {} | 28 {} |
29 | 29 |
30 virtual void drawRect(const SkRect& rect, const SkPaint&) | 30 virtual void drawRect(const SkRect& rect, const SkPaint&) |
31 { | 31 { |
32 // This capture occurs before quick reject. | 32 // This capture occurs before quick reject. |
33 fRects.push(rect); | 33 fRects.push(rect); |
34 } | 34 } |
35 | 35 |
36 SkTDArray<SkRect> fRects; | 36 SkTDArray<SkRect> fRects; |
37 }; | 37 }; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 canvas->drawRect(rect1, paint); | 73 canvas->drawRect(rect1, paint); |
74 canvas->drawRect(rect2, paint); | 74 canvas->drawRect(rect2, paint); |
75 picture.endRecording(); | 75 picture.endRecording(); |
76 | 76 |
77 SkBitmap store; | 77 SkBitmap store; |
78 store.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); | 78 store.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); |
79 store.allocPixels(); | 79 store.allocPixels(); |
80 | 80 |
81 // Test parts of top-left tile | 81 // Test parts of top-left tile |
82 { | 82 { |
83 SkDevice device(store); | 83 SkBitmapDevice device(store); |
84 MockCanvas mockCanvas(&device); | 84 MockCanvas mockCanvas(&device); |
85 picture.draw(&mockCanvas); | 85 picture.draw(&mockCanvas); |
86 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 86 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
87 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 87 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
88 } | 88 } |
89 { | 89 { |
90 SkDevice device(store); | 90 SkBitmapDevice device(store); |
91 MockCanvas mockCanvas(&device); | 91 MockCanvas mockCanvas(&device); |
92 mockCanvas.translate(SkFloatToScalar(-7.99f), SkFloatToScalar(-7.99f
)); | 92 mockCanvas.translate(SkFloatToScalar(-7.99f), SkFloatToScalar(-7.99f
)); |
93 picture.draw(&mockCanvas); | 93 picture.draw(&mockCanvas); |
94 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 94 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
95 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 95 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
96 } | 96 } |
97 // Corner overlap | 97 // Corner overlap |
98 { | 98 { |
99 SkDevice device(store); | 99 SkBitmapDevice device(store); |
100 MockCanvas mockCanvas(&device); | 100 MockCanvas mockCanvas(&device); |
101 mockCanvas.translate(SkFloatToScalar(-9.5f), SkFloatToScalar(-9.5f))
; | 101 mockCanvas.translate(SkFloatToScalar(-9.5f), SkFloatToScalar(-9.5f))
; |
102 picture.draw(&mockCanvas); | 102 picture.draw(&mockCanvas); |
103 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); | 103 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); |
104 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 104 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
105 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); | 105 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); |
106 } | 106 } |
107 // Intersect bottom right tile, but does not overlap rect 2 | 107 // Intersect bottom right tile, but does not overlap rect 2 |
108 { | 108 { |
109 SkDevice device(store); | 109 SkBitmapDevice device(store); |
110 MockCanvas mockCanvas(&device); | 110 MockCanvas mockCanvas(&device); |
111 mockCanvas.translate(SkFloatToScalar(-16.0f), SkFloatToScalar(-16.0f
)); | 111 mockCanvas.translate(SkFloatToScalar(-16.0f), SkFloatToScalar(-16.0f
)); |
112 picture.draw(&mockCanvas); | 112 picture.draw(&mockCanvas); |
113 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 113 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
114 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); | 114 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); |
115 } | 115 } |
116 // Out of bounds queries, snap to border tiles | 116 // Out of bounds queries, snap to border tiles |
117 { | 117 { |
118 SkDevice device(store); | 118 SkBitmapDevice device(store); |
119 MockCanvas mockCanvas(&device); | 119 MockCanvas mockCanvas(&device); |
120 mockCanvas.translate(SkFloatToScalar(2.0f), SkFloatToScalar(0.0f)); | 120 mockCanvas.translate(SkFloatToScalar(2.0f), SkFloatToScalar(0.0f)); |
121 picture.draw(&mockCanvas); | 121 picture.draw(&mockCanvas); |
122 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 122 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
123 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 123 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
124 } | 124 } |
125 { | 125 { |
126 SkDevice device(store); | 126 SkBitmapDevice device(store); |
127 MockCanvas mockCanvas(&device); | 127 MockCanvas mockCanvas(&device); |
128 mockCanvas.translate(SkFloatToScalar(0.0f), SkFloatToScalar(2.0f)); | 128 mockCanvas.translate(SkFloatToScalar(0.0f), SkFloatToScalar(2.0f)); |
129 picture.draw(&mockCanvas); | 129 picture.draw(&mockCanvas); |
130 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 130 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
131 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 131 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
132 } | 132 } |
133 { | 133 { |
134 SkDevice device(store); | 134 SkBitmapDevice device(store); |
135 MockCanvas mockCanvas(&device); | 135 MockCanvas mockCanvas(&device); |
136 mockCanvas.translate(SkFloatToScalar(-22.0f), SkFloatToScalar(-16.0f
)); | 136 mockCanvas.translate(SkFloatToScalar(-22.0f), SkFloatToScalar(-16.0f
)); |
137 picture.draw(&mockCanvas); | 137 picture.draw(&mockCanvas); |
138 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 138 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
139 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); | 139 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); |
140 } | 140 } |
141 { | 141 { |
142 SkDevice device(store); | 142 SkBitmapDevice device(store); |
143 MockCanvas mockCanvas(&device); | 143 MockCanvas mockCanvas(&device); |
144 mockCanvas.translate(SkFloatToScalar(-16.0f), SkFloatToScalar(-22.0f
)); | 144 mockCanvas.translate(SkFloatToScalar(-16.0f), SkFloatToScalar(-22.0f
)); |
145 picture.draw(&mockCanvas); | 145 picture.draw(&mockCanvas); |
146 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 146 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
147 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); | 147 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); |
148 } | 148 } |
149 } | 149 } |
150 | 150 |
151 static void TestOverlapOffsetQueryAlignment(skiatest::Reporter* reporter) { | 151 static void TestOverlapOffsetQueryAlignment(skiatest::Reporter* reporter) { |
152 // Use SkTileGridPicture to generate a SkTileGrid with a helper | 152 // Use SkTileGridPicture to generate a SkTileGrid with a helper |
(...skipping 25 matching lines...) Expand all Loading... |
178 SkBitmap moreThanATileBitmap; | 178 SkBitmap moreThanATileBitmap; |
179 moreThanATileBitmap.setConfig(SkBitmap::kARGB_8888_Config, 11, 11); | 179 moreThanATileBitmap.setConfig(SkBitmap::kARGB_8888_Config, 11, 11); |
180 moreThanATileBitmap.allocPixels(); | 180 moreThanATileBitmap.allocPixels(); |
181 SkBitmap tinyBitmap; | 181 SkBitmap tinyBitmap; |
182 tinyBitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); | 182 tinyBitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); |
183 tinyBitmap.allocPixels(); | 183 tinyBitmap.allocPixels(); |
184 // Test parts of top-left tile | 184 // Test parts of top-left tile |
185 { | 185 { |
186 // The offset should cancel the top and left borders of the top left
tile | 186 // The offset should cancel the top and left borders of the top left
tile |
187 // So a look-up at interval 0-10 should be grid aligned, | 187 // So a look-up at interval 0-10 should be grid aligned, |
188 SkDevice device(tileBitmap); | 188 SkBitmapDevice device(tileBitmap); |
189 MockCanvas mockCanvas(&device); | 189 MockCanvas mockCanvas(&device); |
190 picture.draw(&mockCanvas); | 190 picture.draw(&mockCanvas); |
191 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 191 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
192 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 192 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
193 } | 193 } |
194 { | 194 { |
195 // Encroaching border by one pixel | 195 // Encroaching border by one pixel |
196 SkDevice device(moreThanATileBitmap); | 196 SkBitmapDevice device(moreThanATileBitmap); |
197 MockCanvas mockCanvas(&device); | 197 MockCanvas mockCanvas(&device); |
198 picture.draw(&mockCanvas); | 198 picture.draw(&mockCanvas); |
199 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); | 199 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); |
200 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 200 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
201 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); | 201 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); |
202 } | 202 } |
203 { | 203 { |
204 // Tile stride is 8 (tileWidth - 2 * border pixels | 204 // Tile stride is 8 (tileWidth - 2 * border pixels |
205 // so translating by 8, should make query grid-aligned | 205 // so translating by 8, should make query grid-aligned |
206 // with middle tile. | 206 // with middle tile. |
207 SkDevice device(tileBitmap); | 207 SkBitmapDevice device(tileBitmap); |
208 MockCanvas mockCanvas(&device); | 208 MockCanvas mockCanvas(&device); |
209 mockCanvas.translate(SkIntToScalar(-8), SkIntToScalar(-8)); | 209 mockCanvas.translate(SkIntToScalar(-8), SkIntToScalar(-8)); |
210 picture.draw(&mockCanvas); | 210 picture.draw(&mockCanvas); |
211 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); | 211 REPORTER_ASSERT(reporter, 1 == mockCanvas.fRects.count()); |
212 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); | 212 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); |
213 } | 213 } |
214 { | 214 { |
215 SkDevice device(tileBitmap); | 215 SkBitmapDevice device(tileBitmap); |
216 MockCanvas mockCanvas(&device); | 216 MockCanvas mockCanvas(&device); |
217 mockCanvas.translate(SkFloatToScalar(-7.9f), SkFloatToScalar(-7.9f))
; | 217 mockCanvas.translate(SkFloatToScalar(-7.9f), SkFloatToScalar(-7.9f))
; |
218 picture.draw(&mockCanvas); | 218 picture.draw(&mockCanvas); |
219 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); | 219 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); |
220 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); | 220 REPORTER_ASSERT(reporter, rect1 == mockCanvas.fRects[0]); |
221 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); | 221 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[1]); |
222 } | 222 } |
223 { | 223 { |
224 SkDevice device(tileBitmap); | 224 SkBitmapDevice device(tileBitmap); |
225 MockCanvas mockCanvas(&device); | 225 MockCanvas mockCanvas(&device); |
226 mockCanvas.translate(SkFloatToScalar(-8.1f), SkFloatToScalar(-8.1f))
; | 226 mockCanvas.translate(SkFloatToScalar(-8.1f), SkFloatToScalar(-8.1f))
; |
227 picture.draw(&mockCanvas); | 227 picture.draw(&mockCanvas); |
228 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); | 228 REPORTER_ASSERT(reporter, 2 == mockCanvas.fRects.count()); |
229 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); | 229 REPORTER_ASSERT(reporter, rect2 == mockCanvas.fRects[0]); |
230 REPORTER_ASSERT(reporter, rect3 == mockCanvas.fRects[1]); | 230 REPORTER_ASSERT(reporter, rect3 == mockCanvas.fRects[1]); |
231 } | 231 } |
232 { | 232 { |
233 // Regression test for crbug.com/234688 | 233 // Regression test for crbug.com/234688 |
234 // Once the 2x2 device region is inset by margin, it yields an empty | 234 // Once the 2x2 device region is inset by margin, it yields an empty |
235 // adjusted region, sitting right on top of the tile boundary. | 235 // adjusted region, sitting right on top of the tile boundary. |
236 SkDevice device(tinyBitmap); | 236 SkBitmapDevice device(tinyBitmap); |
237 MockCanvas mockCanvas(&device); | 237 MockCanvas mockCanvas(&device); |
238 mockCanvas.translate(SkFloatToScalar(-8.0f), SkFloatToScalar(-8.0f))
; | 238 mockCanvas.translate(SkFloatToScalar(-8.0f), SkFloatToScalar(-8.0f))
; |
239 picture.draw(&mockCanvas); | 239 picture.draw(&mockCanvas); |
240 // This test passes by not asserting. We do not validate the rects r
ecorded | 240 // This test passes by not asserting. We do not validate the rects r
ecorded |
241 // because the result is numerically unstable (floating point equali
ty). | 241 // because the result is numerically unstable (floating point equali
ty). |
242 // The content of any one of the four tiles of the tilegrid would be
a valid | 242 // The content of any one of the four tiles of the tilegrid would be
a valid |
243 // result since any bbox that covers the center point of the canvas
will be | 243 // result since any bbox that covers the center point of the canvas
will be |
244 // recorded in all four tiles. | 244 // recorded in all four tiles. |
245 } | 245 } |
246 } | 246 } |
(...skipping 27 matching lines...) Expand all Loading... |
274 verifyTileHits(reporter, SkIRect::MakeXYWH(-10, -10, 40, 40), kAll_Tile
); | 274 verifyTileHits(reporter, SkIRect::MakeXYWH(-10, -10, 40, 40), kAll_Tile
); |
275 | 275 |
276 TestUnalignedQuery(reporter); | 276 TestUnalignedQuery(reporter); |
277 TestOverlapOffsetQueryAlignment(reporter); | 277 TestOverlapOffsetQueryAlignment(reporter); |
278 } | 278 } |
279 }; | 279 }; |
280 | 280 |
281 | 281 |
282 #include "TestClassDef.h" | 282 #include "TestClassDef.h" |
283 DEFINE_TESTCLASS("TileGrid", TileGridTestClass, TileGridTest::Test) | 283 DEFINE_TESTCLASS("TileGrid", TileGridTestClass, TileGridTest::Test) |
OLD | NEW |