ToScanxScanner rasterizes the path to *scanx.Scanner using the given rasterizer, height, and resolution.
(ras *scanx.Scanner, dy float64, resolution Resolution)
| 2524 | |
| 2525 | // ToScanxScanner rasterizes the path to *scanx.Scanner using the given rasterizer, height, and resolution. |
| 2526 | func (p *Path) ToScanxScanner(ras *scanx.Scanner, dy float64, resolution Resolution) { |
| 2527 | dpmm := resolution.DPMM() |
| 2528 | tolerance := PixelTolerance / dpmm // tolerance of 1/10 of a pixel |
| 2529 | for i := 0; i < len(p.d); { |
| 2530 | cmd := p.d[i] |
| 2531 | switch cmd { |
| 2532 | case MoveToCmd: |
| 2533 | ras.Start(fixedPoint26_6(p.d[i+1]*dpmm, dy-p.d[i+2]*dpmm)) |
| 2534 | case LineToCmd: |
| 2535 | ras.Line(fixedPoint26_6(p.d[i+1]*dpmm, dy-p.d[i+2]*dpmm)) |
| 2536 | case QuadToCmd, CubeToCmd, ArcToCmd: |
| 2537 | // flatten |
| 2538 | var q *Path |
| 2539 | var start Point |
| 2540 | if 0 < i { |
| 2541 | start = Point{p.d[i-3], p.d[i-2]} |
| 2542 | } |
| 2543 | if cmd == QuadToCmd { |
| 2544 | cp := Point{p.d[i+1], p.d[i+2]} |
| 2545 | end := Point{p.d[i+3], p.d[i+4]} |
| 2546 | q = flattenQuadraticBezier(start, cp, end, tolerance) |
| 2547 | } else if cmd == CubeToCmd { |
| 2548 | cp1 := Point{p.d[i+1], p.d[i+2]} |
| 2549 | cp2 := Point{p.d[i+3], p.d[i+4]} |
| 2550 | end := Point{p.d[i+5], p.d[i+6]} |
| 2551 | q = flattenCubicBezier(start, cp1, cp2, end, tolerance) |
| 2552 | } else { |
| 2553 | rx, ry, phi := p.d[i+1], p.d[i+2], p.d[i+3] |
| 2554 | large, sweep := toArcFlags(p.d[i+4]) |
| 2555 | end := Point{p.d[i+5], p.d[i+6]} |
| 2556 | q = flattenEllipticArc(start, rx, ry, phi, large, sweep, end, tolerance) |
| 2557 | } |
| 2558 | for j := 4; j < len(q.d); j += 4 { |
| 2559 | ras.Line(fixedPoint26_6(q.d[j+1]*dpmm, dy-q.d[j+2]*dpmm)) |
| 2560 | } |
| 2561 | case CloseCmd: |
| 2562 | ras.Line(fixedPoint26_6(p.d[i+1]*dpmm, dy-p.d[i+2]*dpmm)) |
| 2563 | default: |
| 2564 | panic("quadratic and cubic Béziers and arcs should have been replaced") |
| 2565 | } |
| 2566 | i += cmdLen(cmd) |
| 2567 | } |
| 2568 | } |