OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkDashPathEffect.h" | 10 #include "SkDashPathEffect.h" |
11 #include "SkSurface.h" | 11 #include "SkSurface.h" |
12 #include "Test.h" | 12 #include "Test.h" |
13 | 13 |
14 static SkCanvas* new_canvas(int w, int h) { | |
15 SkBitmap bm; | |
16 bm.allocN32Pixels(w, h); | |
17 return new SkCanvas(bm); | |
18 } | |
19 | |
20 /////////////////////////////////////////////////////////////////////////////// | |
21 | |
22 // test that we can draw an aa-rect at coordinates > 32K (bigger than fixedpoint
) | 14 // test that we can draw an aa-rect at coordinates > 32K (bigger than fixedpoint
) |
23 static void test_big_aa_rect(skiatest::Reporter* reporter) { | 15 static void test_big_aa_rect(skiatest::Reporter* reporter) { |
24 SkBitmap output; | 16 SkBitmap output; |
25 SkPMColor pixel[1]; | 17 SkPMColor pixel[1]; |
26 output.installPixels(SkImageInfo::MakeN32Premul(1, 1), | 18 output.installPixels(SkImageInfo::MakeN32Premul(1, 1), |
27 pixel, 4, NULL, NULL); | 19 pixel, 4, NULL, NULL); |
28 | 20 |
29 SkSurface* surf = SkSurface::NewRasterPMColor(300, 33300); | 21 SkSurface* surf = SkSurface::NewRasterPMColor(300, 33300); |
30 SkCanvas* canvas = surf->getCanvas(); | 22 SkCanvas* canvas = surf->getCanvas(); |
31 | 23 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 */ | 88 */ |
97 uint32_t data[] = { | 89 uint32_t data[] = { |
98 0x419727af, 0x43011f0c, 0x41972663, 0x43011f27, | 90 0x419727af, 0x43011f0c, 0x41972663, 0x43011f27, |
99 0x419728fc, 0x43011ed4, 0x4194064b, 0x43012197 | 91 0x419728fc, 0x43011ed4, 0x4194064b, 0x43012197 |
100 }; | 92 }; |
101 | 93 |
102 SkPath path; | 94 SkPath path; |
103 moveToH(&path, &data[0]); | 95 moveToH(&path, &data[0]); |
104 cubicToH(&path, &data[2]); | 96 cubicToH(&path, &data[2]); |
105 | 97 |
106 SkAutoTUnref<SkCanvas> canvas(new_canvas(640, 480)); | 98 SkAutoTUnref<SkCanvas> canvas(SkCanvas::NewRasterN32(640, 480)); |
107 | 99 |
108 SkPaint paint; | 100 SkPaint paint; |
109 paint.setAntiAlias(true); | 101 paint.setAntiAlias(true); |
110 canvas->drawPath(path, paint); | 102 canvas->drawPath(path, paint); |
111 } | 103 } |
112 | 104 |
113 // This used to assert in debug builds (and crash writing bad memory in release) | 105 // This used to assert in debug builds (and crash writing bad memory in release) |
114 // because we overflowed an intermediate value (B coefficient) setting up our | 106 // because we overflowed an intermediate value (B coefficient) setting up our |
115 // stepper for the quadratic. Now we bias that value by 1/2 so we don't overflow | 107 // stepper for the quadratic. Now we bias that value by 1/2 so we don't overflow |
116 static void test_crbug_140803() { | 108 static void test_crbug_140803() { |
(...skipping 17 matching lines...) Expand all Loading... |
134 static void test_inversepathwithclip() { | 126 static void test_inversepathwithclip() { |
135 SkPath path; | 127 SkPath path; |
136 | 128 |
137 path.moveTo(0, SkIntToScalar(20)); | 129 path.moveTo(0, SkIntToScalar(20)); |
138 path.quadTo(SkIntToScalar(10), SkIntToScalar(10), | 130 path.quadTo(SkIntToScalar(10), SkIntToScalar(10), |
139 SkIntToScalar(20), SkIntToScalar(20)); | 131 SkIntToScalar(20), SkIntToScalar(20)); |
140 path.toggleInverseFillType(); | 132 path.toggleInverseFillType(); |
141 | 133 |
142 SkPaint paint; | 134 SkPaint paint; |
143 | 135 |
144 SkAutoTUnref<SkCanvas> canvas(new_canvas(640, 480)); | 136 SkAutoTUnref<SkCanvas> canvas(SkCanvas::NewRasterN32(640, 480)); |
145 canvas.get()->save(); | 137 canvas.get()->save(); |
146 canvas.get()->clipRect(SkRect::MakeWH(SkIntToScalar(19), SkIntToScalar(11)))
; | 138 canvas.get()->clipRect(SkRect::MakeWH(SkIntToScalar(19), SkIntToScalar(11)))
; |
147 | 139 |
148 paint.setAntiAlias(false); | 140 paint.setAntiAlias(false); |
149 canvas.get()->drawPath(path, paint); | 141 canvas.get()->drawPath(path, paint); |
150 paint.setAntiAlias(true); | 142 paint.setAntiAlias(true); |
151 canvas.get()->drawPath(path, paint); | 143 canvas.get()->drawPath(path, paint); |
152 | 144 |
153 canvas.get()->restore(); | 145 canvas.get()->restore(); |
154 | 146 |
(...skipping 19 matching lines...) Expand all Loading... |
174 This particular test/bug only applies to the float case, where the | 166 This particular test/bug only applies to the float case, where the |
175 coordinates are very large. | 167 coordinates are very large. |
176 */ | 168 */ |
177 SkPath path; | 169 SkPath path; |
178 path.moveTo(64, 3); | 170 path.moveTo(64, 3); |
179 path.quadTo(-329936, -100000000, 1153, 330003); | 171 path.quadTo(-329936, -100000000, 1153, 330003); |
180 | 172 |
181 SkPaint paint; | 173 SkPaint paint; |
182 paint.setAntiAlias(true); | 174 paint.setAntiAlias(true); |
183 | 175 |
184 SkAutoTUnref<SkCanvas> canvas(new_canvas(640, 480)); | 176 SkAutoTUnref<SkCanvas> canvas(SkCanvas::NewRasterN32(640, 480)); |
185 canvas.get()->drawPath(path, paint); | 177 canvas.get()->drawPath(path, paint); |
186 } | 178 } |
187 | 179 |
188 static void test_crbug_140642() { | 180 static void test_crbug_140642() { |
189 /* | 181 /* |
190 * We used to see this construct, and due to rounding as we accumulated | 182 * We used to see this construct, and due to rounding as we accumulated |
191 * our length, the loop where we apply the phase would run off the end of | 183 * our length, the loop where we apply the phase would run off the end of |
192 * the array, since it relied on just -= each interval value, which did not | 184 * the array, since it relied on just -= each interval value, which did not |
193 * behave as "expected". Now the code explicitly checks for walking off the | 185 * behave as "expected". Now the code explicitly checks for walking off the |
194 * end of that array. | 186 * end of that array. |
(...skipping 21 matching lines...) Expand all Loading... |
216 } | 208 } |
217 | 209 |
218 static void test_bigcubic() { | 210 static void test_bigcubic() { |
219 SkPath path; | 211 SkPath path; |
220 path.moveTo(64, 3); | 212 path.moveTo(64, 3); |
221 path.cubicTo(-329936, -100000000, -329936, 100000000, 1153, 330003); | 213 path.cubicTo(-329936, -100000000, -329936, 100000000, 1153, 330003); |
222 | 214 |
223 SkPaint paint; | 215 SkPaint paint; |
224 paint.setAntiAlias(true); | 216 paint.setAntiAlias(true); |
225 | 217 |
226 SkAutoTUnref<SkCanvas> canvas(new_canvas(640, 480)); | 218 SkAutoTUnref<SkCanvas> canvas(SkCanvas::NewRasterN32(640, 480)); |
227 canvas.get()->drawPath(path, paint); | 219 canvas.get()->drawPath(path, paint); |
228 } | 220 } |
229 | 221 |
230 // we used to assert if the bounds of the device (clip) was larger than 32K | 222 // we used to assert if the bounds of the device (clip) was larger than 32K |
231 // even when the path itself was smaller. We just draw and hope in the debug | 223 // even when the path itself was smaller. We just draw and hope in the debug |
232 // version to not assert. | 224 // version to not assert. |
233 static void test_giantaa() { | 225 static void test_giantaa() { |
234 const int W = 400; | 226 const int W = 400; |
235 const int H = 400; | 227 const int H = 400; |
236 SkAutoTUnref<SkCanvas> canvas(new_canvas(33000, 10)); | 228 SkAutoTUnref<SkCanvas> canvas(SkCanvas::NewRasterN32(33000, 10)); |
237 canvas.get()->clear(SK_ColorTRANSPARENT); | |
238 | 229 |
239 SkPaint paint; | 230 SkPaint paint; |
240 paint.setAntiAlias(true); | 231 paint.setAntiAlias(true); |
241 SkPath path; | 232 SkPath path; |
242 path.addOval(SkRect::MakeXYWH(-10, -10, 20 + W, 20 + H)); | 233 path.addOval(SkRect::MakeXYWH(-10, -10, 20 + W, 20 + H)); |
243 canvas.get()->drawPath(path, paint); | 234 canvas.get()->drawPath(path, paint); |
244 } | 235 } |
245 | 236 |
246 // Extremely large path_length/dash_length ratios may cause infinite looping | 237 // Extremely large path_length/dash_length ratios may cause infinite looping |
247 // in SkDashPathEffect::filterPath() due to single precision rounding. | 238 // in SkDashPathEffect::filterPath() due to single precision rounding. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 test_crbug_124652(); | 283 test_crbug_124652(); |
293 test_crbug_140642(); | 284 test_crbug_140642(); |
294 test_crbug_140803(); | 285 test_crbug_140803(); |
295 test_inversepathwithclip(); | 286 test_inversepathwithclip(); |
296 // why? | 287 // why? |
297 if (false) test_crbug131181(); | 288 if (false) test_crbug131181(); |
298 test_infinite_dash(reporter); | 289 test_infinite_dash(reporter); |
299 test_crbug_165432(reporter); | 290 test_crbug_165432(reporter); |
300 test_big_aa_rect(reporter); | 291 test_big_aa_rect(reporter); |
301 } | 292 } |
OLD | NEW |