MCPcopy
hub / github.com/tdewolff/canvas / ToScanxScanner

Method ToScanxScanner

path.go:2526–2568  ·  view source on GitHub ↗

ToScanxScanner rasterizes the path to *scanx.Scanner using the given rasterizer, height, and resolution.

(ras *scanx.Scanner, dy float64, resolution Resolution)

Source from the content-addressed store, hash-verified

2524
2525// ToScanxScanner rasterizes the path to *scanx.Scanner using the given rasterizer, height, and resolution.
2526func (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}

Callers 2

RenderPathMethod · 0.95
BenchmarkToScanxFunction · 0.80

Calls 8

fixedPoint26_6Function · 0.85
flattenQuadraticBezierFunction · 0.85
flattenCubicBezierFunction · 0.85
toArcFlagsFunction · 0.85
flattenEllipticArcFunction · 0.85
cmdLenFunction · 0.85
DPMMMethod · 0.80
StartMethod · 0.45

Tested by 1

BenchmarkToScanxFunction · 0.64