OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 "SkScan.h" | 8 #include "SkScan.h" |
9 #include "SkBlitter.h" | 9 #include "SkBlitter.h" |
10 #include "SkRasterClip.h" | 10 #include "SkRasterClip.h" |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 return idx + (idy >> 1); | 211 return idx + (idy >> 1); |
212 } else { | 212 } else { |
213 return idy + (idx >> 1); | 213 return idy + (idx >> 1); |
214 } | 214 } |
215 } | 215 } |
216 | 216 |
217 static void hairquad(const SkPoint pts[3], const SkRegion* clip, | 217 static void hairquad(const SkPoint pts[3], const SkRegion* clip, |
218 SkBlitter* blitter, int level, SkScan::HairRgnProc lineproc
) { | 218 SkBlitter* blitter, int level, SkScan::HairRgnProc lineproc
) { |
219 SkASSERT(level <= kMaxQuadSubdivideLevel); | 219 SkASSERT(level <= kMaxQuadSubdivideLevel); |
220 | 220 |
221 #ifdef SK_SUPPORT_LEGACY_BLITANTIH2V2 | |
222 if (level > 0) { | |
223 SkPoint tmp[5]; | |
224 | |
225 SkChopQuadAtHalf(pts, tmp); | |
226 hairquad(tmp, clip, blitter, level - 1, lineproc); | |
227 hairquad(&tmp[2], clip, blitter, level - 1, lineproc); | |
228 } else { | |
229 SkPoint tmp[] = { pts[0], pts[2] }; | |
230 lineproc(tmp, 2, clip, blitter); | |
231 } | |
232 #else | |
233 SkPoint coeff[3]; | 221 SkPoint coeff[3]; |
234 SkQuadToCoeff(pts, coeff); | 222 SkQuadToCoeff(pts, coeff); |
235 | 223 |
236 const int lines = 1 << level; | 224 const int lines = 1 << level; |
237 Sk2s t(0); | 225 Sk2s t(0); |
238 Sk2s dt(SK_Scalar1 / lines); | 226 Sk2s dt(SK_Scalar1 / lines); |
239 | 227 |
240 SkPoint tmp[(1 << kMaxQuadSubdivideLevel) + 1]; | 228 SkPoint tmp[(1 << kMaxQuadSubdivideLevel) + 1]; |
241 SkASSERT((unsigned)lines < SK_ARRAY_COUNT(tmp)); | 229 SkASSERT((unsigned)lines < SK_ARRAY_COUNT(tmp)); |
242 | 230 |
243 tmp[0] = pts[0]; | 231 tmp[0] = pts[0]; |
244 Sk2s A = Sk2s::Load(&coeff[0].fX); | 232 Sk2s A = Sk2s::Load(&coeff[0].fX); |
245 Sk2s B = Sk2s::Load(&coeff[1].fX); | 233 Sk2s B = Sk2s::Load(&coeff[1].fX); |
246 Sk2s C = Sk2s::Load(&coeff[2].fX); | 234 Sk2s C = Sk2s::Load(&coeff[2].fX); |
247 for (int i = 1; i < lines; ++i) { | 235 for (int i = 1; i < lines; ++i) { |
248 t += dt; | 236 t += dt; |
249 ((A * t + B) * t + C).store(&tmp[i].fX); | 237 ((A * t + B) * t + C).store(&tmp[i].fX); |
250 } | 238 } |
251 tmp[lines] = pts[2]; | 239 tmp[lines] = pts[2]; |
252 lineproc(tmp, lines + 1, clip, blitter); | 240 lineproc(tmp, lines + 1, clip, blitter); |
253 #endif | |
254 } | 241 } |
255 | 242 |
256 #ifndef SK_SUPPORT_LEGACY_BLITANTIH2V2 | |
257 static inline Sk2s abs(const Sk2s& value) { | 243 static inline Sk2s abs(const Sk2s& value) { |
258 return Sk2s::Max(value, -value); | 244 return Sk2s::Max(value, -value); |
259 } | 245 } |
260 | 246 |
261 static inline SkScalar max_component(const Sk2s& value) { | 247 static inline SkScalar max_component(const Sk2s& value) { |
262 SkScalar components[2]; | 248 SkScalar components[2]; |
263 value.store(components); | 249 value.store(components); |
264 return SkTMax(components[0], components[1]); | 250 return SkTMax(components[0], components[1]); |
265 } | 251 } |
266 | 252 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 Sk2s B = Sk2s::Load(&coeff[1].fX); | 310 Sk2s B = Sk2s::Load(&coeff[1].fX); |
325 Sk2s C = Sk2s::Load(&coeff[2].fX); | 311 Sk2s C = Sk2s::Load(&coeff[2].fX); |
326 Sk2s D = Sk2s::Load(&coeff[3].fX); | 312 Sk2s D = Sk2s::Load(&coeff[3].fX); |
327 for (int i = 1; i < lines; ++i) { | 313 for (int i = 1; i < lines; ++i) { |
328 t += dt; | 314 t += dt; |
329 (((A * t + B) * t + C) * t + D).store(&tmp[i].fX); | 315 (((A * t + B) * t + C) * t + D).store(&tmp[i].fX); |
330 } | 316 } |
331 tmp[lines] = pts[3]; | 317 tmp[lines] = pts[3]; |
332 lineproc(tmp, lines + 1, clip, blitter); | 318 lineproc(tmp, lines + 1, clip, blitter); |
333 } | 319 } |
334 #endif | |
335 | 320 |
336 static inline void haircubic(const SkPoint pts[4], const SkRegion* clip, | 321 static inline void haircubic(const SkPoint pts[4], const SkRegion* clip, |
337 SkBlitter* blitter, int level, SkScan::HairRgnProc linepro
c) { | 322 SkBlitter* blitter, int level, SkScan::HairRgnProc linepro
c) { |
338 #ifdef SK_SUPPORT_LEGACY_BLITANTIH2V2 | |
339 if (level > 0) { | |
340 SkPoint tmp[7]; | |
341 | |
342 SkChopCubicAt(pts, tmp, SK_Scalar1/2); | |
343 haircubic(tmp, clip, blitter, level - 1, lineproc); | |
344 haircubic(&tmp[3], clip, blitter, level - 1, lineproc); | |
345 } else { | |
346 SkPoint tmp[] = { pts[0], pts[3] }; | |
347 lineproc(tmp, 2, clip, blitter); | |
348 } | |
349 #else | |
350 if (quick_cubic_niceness_check(pts)) { | 323 if (quick_cubic_niceness_check(pts)) { |
351 hair_cubic(pts, clip, blitter, lineproc); | 324 hair_cubic(pts, clip, blitter, lineproc); |
352 } else { | 325 } else { |
353 SkPoint tmp[13]; | 326 SkPoint tmp[13]; |
354 SkScalar tValues[3]; | 327 SkScalar tValues[3]; |
355 | 328 |
356 int count = SkChopCubicAtMaxCurvature(pts, tmp, tValues); | 329 int count = SkChopCubicAtMaxCurvature(pts, tmp, tValues); |
357 for (int i = 0; i < count; i++) { | 330 for (int i = 0; i < count; i++) { |
358 hair_cubic(&tmp[i * 3], clip, blitter, lineproc); | 331 hair_cubic(&tmp[i * 3], clip, blitter, lineproc); |
359 } | 332 } |
360 } | 333 } |
361 #endif | |
362 } | 334 } |
363 | 335 |
364 static int compute_quad_level(const SkPoint pts[3]) { | 336 static int compute_quad_level(const SkPoint pts[3]) { |
365 int d = compute_int_quad_dist(pts); | 337 int d = compute_int_quad_dist(pts); |
366 /* quadratics approach the line connecting their start and end points | 338 /* quadratics approach the line connecting their start and end points |
367 4x closer with each subdivision, so we compute the number of | 339 4x closer with each subdivision, so we compute the number of |
368 subdivisions to be the minimum need to get that distance to be less | 340 subdivisions to be the minimum need to get that distance to be less |
369 than a pixel. | 341 than a pixel. |
370 */ | 342 */ |
371 int level = (33 - SkCLZ(d)) >> 1; | 343 int level = (33 - SkCLZ(d)) >> 1; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 | 490 |
519 SkAAClipBlitterWrapper wrap; | 491 SkAAClipBlitterWrapper wrap; |
520 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) { | 492 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) { |
521 wrap.init(clip, blitter); | 493 wrap.init(clip, blitter); |
522 blitter = wrap.getBlitter(); | 494 blitter = wrap.getBlitter(); |
523 clipRgn = &wrap.getRgn(); | 495 clipRgn = &wrap.getRgn(); |
524 } | 496 } |
525 AntiHairLineRgn(pts, count, clipRgn, blitter); | 497 AntiHairLineRgn(pts, count, clipRgn, blitter); |
526 } | 498 } |
527 } | 499 } |
OLD | NEW |