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 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 if (rclip.isBW()) { | 367 if (rclip.isBW()) { |
368 clip = &rclip.bwRgn(); | 368 clip = &rclip.bwRgn(); |
369 } else { | 369 } else { |
370 wrap.init(rclip, blitter); | 370 wrap.init(rclip, blitter); |
371 blitter = wrap.getBlitter(); | 371 blitter = wrap.getBlitter(); |
372 clip = &wrap.getRgn(); | 372 clip = &wrap.getRgn(); |
373 } | 373 } |
374 } | 374 } |
375 } | 375 } |
376 | 376 |
377 SkPath::Iter iter(path, false); | 377 SkPath::RawIter iter(path); |
378 SkPoint pts[4]; | 378 SkPoint pts[4], firstPt, lastPt; |
379 SkPath::Verb verb; | 379 SkPath::Verb verb; |
380 SkAutoConicToQuads converter; | 380 SkAutoConicToQuads converter; |
381 | 381 |
382 while ((verb = iter.next(pts, false)) != SkPath::kDone_Verb) { | 382 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { |
383 switch (verb) { | 383 switch (verb) { |
384 case SkPath::kMove_Verb: | 384 case SkPath::kMove_Verb: |
| 385 firstPt = lastPt = pts[0]; |
385 break; | 386 break; |
386 case SkPath::kLine_Verb: | 387 case SkPath::kLine_Verb: |
387 lineproc(pts, 2, clip, blitter); | 388 lineproc(pts, 2, clip, blitter); |
| 389 lastPt = pts[1]; |
388 break; | 390 break; |
389 case SkPath::kQuad_Verb: | 391 case SkPath::kQuad_Verb: |
390 hairquad(pts, clip, blitter, compute_quad_level(pts), lineproc); | 392 hairquad(pts, clip, blitter, compute_quad_level(pts), lineproc); |
| 393 lastPt = pts[2]; |
391 break; | 394 break; |
392 case SkPath::kConic_Verb: { | 395 case SkPath::kConic_Verb: { |
393 // how close should the quads be to the original conic? | 396 // how close should the quads be to the original conic? |
394 const SkScalar tol = SK_Scalar1 / 4; | 397 const SkScalar tol = SK_Scalar1 / 4; |
395 const SkPoint* quadPts = converter.computeQuads(pts, | 398 const SkPoint* quadPts = converter.computeQuads(pts, |
396 iter.conicWeight(), tol); | 399 iter.conicWeight(), tol); |
397 for (int i = 0; i < converter.countQuads(); ++i) { | 400 for (int i = 0; i < converter.countQuads(); ++i) { |
398 int level = compute_quad_level(quadPts); | 401 int level = compute_quad_level(quadPts); |
399 hairquad(quadPts, clip, blitter, level, lineproc); | 402 hairquad(quadPts, clip, blitter, level, lineproc); |
400 quadPts += 2; | 403 quadPts += 2; |
401 } | 404 } |
| 405 lastPt = pts[2]; |
402 break; | 406 break; |
403 } | 407 } |
404 case SkPath::kCubic_Verb: { | 408 case SkPath::kCubic_Verb: { |
405 haircubic(pts, clip, blitter, kMaxCubicSubdivideLevel, lineproc)
; | 409 haircubic(pts, clip, blitter, kMaxCubicSubdivideLevel, lineproc)
; |
| 410 lastPt = pts[3]; |
406 } break; | 411 } break; |
407 case SkPath::kClose_Verb: | 412 case SkPath::kClose_Verb: |
| 413 pts[0] = lastPt; |
| 414 pts[1] = firstPt; |
| 415 lineproc(pts, 2, clip, blitter); |
408 break; | 416 break; |
409 case SkPath::kDone_Verb: | 417 case SkPath::kDone_Verb: |
410 break; | 418 break; |
411 } | 419 } |
412 } | 420 } |
413 } | 421 } |
414 | 422 |
415 void SkScan::HairPath(const SkPath& path, const SkRasterClip& clip, SkBlitter* b
litter) { | 423 void SkScan::HairPath(const SkPath& path, const SkRasterClip& clip, SkBlitter* b
litter) { |
416 hair_path(path, clip, blitter, SkScan::HairLineRgn); | 424 hair_path(path, clip, blitter, SkScan::HairLineRgn); |
417 } | 425 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 | 498 |
491 SkAAClipBlitterWrapper wrap; | 499 SkAAClipBlitterWrapper wrap; |
492 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) { | 500 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) { |
493 wrap.init(clip, blitter); | 501 wrap.init(clip, blitter); |
494 blitter = wrap.getBlitter(); | 502 blitter = wrap.getBlitter(); |
495 clipRgn = &wrap.getRgn(); | 503 clipRgn = &wrap.getRgn(); |
496 } | 504 } |
497 AntiHairLineRgn(pts, count, clipRgn, blitter); | 505 AntiHairLineRgn(pts, count, clipRgn, blitter); |
498 } | 506 } |
499 } | 507 } |
OLD | NEW |