Replace LineCloseMarker by Close() Method
This commit is contained in:
parent
4fa829a373
commit
42d0eb260f
6 changed files with 38 additions and 44 deletions
12
dasher.go
12
dasher.go
|
@ -21,10 +21,6 @@ func NewDashConverter(dash []float64, dashOffset float64, converter LineBuilder)
|
||||||
return &dasher
|
return &dasher
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dasher *DashVertexConverter) End() {
|
|
||||||
dasher.next.End()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dasher *DashVertexConverter) NextCommand(cmd LineMarker) {
|
func (dasher *DashVertexConverter) NextCommand(cmd LineMarker) {
|
||||||
dasher.command = cmd
|
dasher.command = cmd
|
||||||
}
|
}
|
||||||
|
@ -41,6 +37,14 @@ func (dasher *DashVertexConverter) MoveTo(x, y float64) {
|
||||||
dasher.currentDash = 0
|
dasher.currentDash = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dasher *DashVertexConverter) Close() {
|
||||||
|
dasher.next.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dasher *DashVertexConverter) End() {
|
||||||
|
dasher.next.End()
|
||||||
|
}
|
||||||
|
|
||||||
func (dasher *DashVertexConverter) lineTo(x, y float64) {
|
func (dasher *DashVertexConverter) lineTo(x, y float64) {
|
||||||
rest := dasher.dash[dasher.currentDash] - dasher.distance
|
rest := dasher.dash[dasher.currentDash] - dasher.distance
|
||||||
for rest < 0 {
|
for rest < 0 {
|
||||||
|
|
14
line.go
14
line.go
|
@ -9,15 +9,17 @@ const (
|
||||||
LineNoneMarker LineMarker = iota
|
LineNoneMarker LineMarker = iota
|
||||||
// Mark the current point of the line as a join to it can draw some specific join Bevel, Miter, Rount
|
// Mark the current point of the line as a join to it can draw some specific join Bevel, Miter, Rount
|
||||||
LineJoinMarker
|
LineJoinMarker
|
||||||
// Mark the current point of the line as closed so it draw a line from the current
|
|
||||||
// position to the point specified by the last start marker.
|
|
||||||
LineCloseMarker
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type LineBuilder interface {
|
type LineBuilder interface {
|
||||||
NextCommand(cmd LineMarker)
|
NextCommand(cmd LineMarker)
|
||||||
|
// MoveTo Start a New line from the point (x, y)
|
||||||
MoveTo(x, y float64)
|
MoveTo(x, y float64)
|
||||||
|
// LineTo Draw a line from the current position to the point (x, y)
|
||||||
LineTo(x, y float64)
|
LineTo(x, y float64)
|
||||||
|
// Close add the most recent starting point to close the path to create a polygon
|
||||||
|
Close()
|
||||||
|
// End mark the current line as finished so we can draw caps
|
||||||
End()
|
End()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +49,12 @@ func (dc *LineBuilders) LineTo(x, y float64) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dc *LineBuilders) Close() {
|
||||||
|
for _, converter := range dc.builders {
|
||||||
|
converter.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (dc *LineBuilders) End() {
|
func (dc *LineBuilders) End() {
|
||||||
for _, converter := range dc.builders {
|
for _, converter := range dc.builders {
|
||||||
converter.End()
|
converter.End()
|
||||||
|
|
|
@ -27,6 +27,9 @@ func (vertexAdder *VertexAdder) LineTo(x, y float64) {
|
||||||
vertexAdder.adder.Add1(raster.Point{raster.Fix32(x * 256), raster.Fix32(y * 256)})
|
vertexAdder.adder.Add1(raster.Point{raster.Fix32(x * 256), raster.Fix32(y * 256)})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (vertexAdder *VertexAdder) Close() {
|
||||||
|
}
|
||||||
|
|
||||||
func (vertexAdder *VertexAdder) End() {
|
func (vertexAdder *VertexAdder) End() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,38 +33,26 @@ func (c *PathConverter) Convert(paths ...*PathStorage) {
|
||||||
i += 2
|
i += 2
|
||||||
case LineTo:
|
case LineTo:
|
||||||
c.x, c.y = path.vertices[i], path.vertices[i+1]
|
c.x, c.y = path.vertices[i], path.vertices[i+1]
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
c.converter.NextCommand(LineJoinMarker)
|
c.converter.NextCommand(LineJoinMarker)
|
||||||
i += 2
|
i += 2
|
||||||
case QuadCurveTo:
|
case QuadCurveTo:
|
||||||
curve.TraceQuad(c.converter, path.vertices[i-2:], 0.5)
|
curve.TraceQuad(c.converter, path.vertices[i-2:], 0.5)
|
||||||
c.x, c.y = path.vertices[i+2], path.vertices[i+3]
|
c.x, c.y = path.vertices[i+2], path.vertices[i+3]
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
i += 4
|
i += 4
|
||||||
case CubicCurveTo:
|
case CubicCurveTo:
|
||||||
curve.TraceCubic(c.converter, path.vertices[i-2:], 0.5)
|
curve.TraceCubic(c.converter, path.vertices[i-2:], 0.5)
|
||||||
c.x, c.y = path.vertices[i+4], path.vertices[i+5]
|
c.x, c.y = path.vertices[i+4], path.vertices[i+5]
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
i += 6
|
i += 6
|
||||||
case ArcTo:
|
case ArcTo:
|
||||||
c.x, c.y = arc(c.converter, path.vertices[i], path.vertices[i+1], path.vertices[i+2], path.vertices[i+3], path.vertices[i+4], path.vertices[i+5], c.ApproximationScale)
|
c.x, c.y = arc(c.converter, path.vertices[i], path.vertices[i+1], path.vertices[i+2], path.vertices[i+3], path.vertices[i+4], path.vertices[i+5], c.ApproximationScale)
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
i += 6
|
i += 6
|
||||||
case Close:
|
case Close:
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
c.converter.LineTo(c.startX, c.startY)
|
c.converter.LineTo(c.startX, c.startY)
|
||||||
|
c.converter.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.converter.End()
|
c.converter.End()
|
||||||
|
@ -90,9 +78,6 @@ func (c *PathConverter) RMoveTo(dx, dy float64) *PathConverter {
|
||||||
|
|
||||||
func (c *PathConverter) LineTo(x, y float64) *PathConverter {
|
func (c *PathConverter) LineTo(x, y float64) *PathConverter {
|
||||||
c.x, c.y = x, y
|
c.x, c.y = x, y
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
c.converter.NextCommand(LineJoinMarker)
|
c.converter.NextCommand(LineJoinMarker)
|
||||||
return c
|
return c
|
||||||
|
@ -106,9 +91,6 @@ func (c *PathConverter) RLineTo(dx, dy float64) *PathConverter {
|
||||||
func (c *PathConverter) QuadCurveTo(cx, cy, x, y float64) *PathConverter {
|
func (c *PathConverter) QuadCurveTo(cx, cy, x, y float64) *PathConverter {
|
||||||
curve.TraceQuad(c.converter, []float64{c.x, c.y, cx, cy, x, y}, 0.5)
|
curve.TraceQuad(c.converter, []float64{c.x, c.y, cx, cy, x, y}, 0.5)
|
||||||
c.x, c.y = x, y
|
c.x, c.y = x, y
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
@ -121,9 +103,6 @@ func (c *PathConverter) RQuadCurveTo(dcx, dcy, dx, dy float64) *PathConverter {
|
||||||
func (c *PathConverter) CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) *PathConverter {
|
func (c *PathConverter) CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) *PathConverter {
|
||||||
curve.TraceCubic(c.converter, []float64{c.x, c.y, cx1, cy1, cx2, cy2, x, y}, 0.5)
|
curve.TraceCubic(c.converter, []float64{c.x, c.y, cx1, cy1, cx2, cy2, x, y}, 0.5)
|
||||||
c.x, c.y = x, y
|
c.x, c.y = x, y
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
@ -153,9 +132,6 @@ func (c *PathConverter) ArcTo(cx, cy, rx, ry, startAngle, angle float64) *PathCo
|
||||||
startY := cy + math.Sin(startAngle)*ry
|
startY := cy + math.Sin(startAngle)*ry
|
||||||
c.MoveTo(startX, startY)
|
c.MoveTo(startX, startY)
|
||||||
c.x, c.y = arc(c.converter, cx, cy, rx, ry, startAngle, angle, c.ApproximationScale)
|
c.x, c.y = arc(c.converter, cx, cy, rx, ry, startAngle, angle, c.ApproximationScale)
|
||||||
if c.startX == c.x && c.startY == c.y {
|
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
|
||||||
}
|
|
||||||
c.converter.LineTo(c.x, c.y)
|
c.converter.LineTo(c.x, c.y)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
@ -166,7 +142,6 @@ func (c *PathConverter) RArcTo(dcx, dcy, rx, ry, startAngle, angle float64) *Pat
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PathConverter) Close() *PathConverter {
|
func (c *PathConverter) Close() *PathConverter {
|
||||||
c.converter.NextCommand(LineCloseMarker)
|
c.converter.Close()
|
||||||
c.converter.LineTo(c.startX, c.startY)
|
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
20
stroker.go
20
stroker.go
|
@ -78,16 +78,22 @@ func (l *LineStroker) LineTo(x, y float64) {
|
||||||
switch l.command {
|
switch l.command {
|
||||||
case LineJoinMarker:
|
case LineJoinMarker:
|
||||||
l.joinLine(l.x, l.y, l.nx, l.ny, x, y)
|
l.joinLine(l.x, l.y, l.nx, l.ny, x, y)
|
||||||
case LineCloseMarker:
|
// case LineCloseMarker:
|
||||||
l.line(l.x, l.y, x, y)
|
// l.line(l.x, l.y, x, y)
|
||||||
l.joinLine(l.x, l.y, l.nx, l.ny, x, y)
|
// l.joinLine(l.x, l.y, l.nx, l.ny, x, y)
|
||||||
l.closePolygon()
|
// l.closePolygon()
|
||||||
default:
|
default:
|
||||||
l.line(l.x, l.y, x, y)
|
l.line(l.x, l.y, x, y)
|
||||||
}
|
}
|
||||||
l.command = LineNoneMarker
|
l.command = LineNoneMarker
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *LineStroker) Close() {
|
||||||
|
if len(l.vertices) > 1 {
|
||||||
|
l.appendVertex(l.vertices[0], l.vertices[1], l.rewind[0], l.rewind[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (l *LineStroker) appendVertex(vertices ...float64) {
|
func (l *LineStroker) appendVertex(vertices ...float64) {
|
||||||
s := len(vertices) / 2
|
s := len(vertices) / 2
|
||||||
if len(l.vertices)+s >= cap(l.vertices) {
|
if len(l.vertices)+s >= cap(l.vertices) {
|
||||||
|
@ -106,12 +112,6 @@ func (l *LineStroker) appendVertex(vertices ...float64) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LineStroker) closePolygon() {
|
|
||||||
if len(l.vertices) > 1 {
|
|
||||||
l.appendVertex(l.vertices[0], l.vertices[1], l.rewind[0], l.rewind[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *LineStroker) line(x1, y1, x2, y2 float64) {
|
func (l *LineStroker) line(x1, y1, x2, y2 float64) {
|
||||||
dx := (x2 - x1)
|
dx := (x2 - x1)
|
||||||
dy := (y2 - y1)
|
dy := (y2 - y1)
|
||||||
|
|
|
@ -278,6 +278,10 @@ func (vmt *VertexMatrixTransform) LineTo(x, y float64) {
|
||||||
vmt.Next.LineTo(u, v)
|
vmt.Next.LineTo(u, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (vmt *VertexMatrixTransform) Close() {
|
||||||
|
vmt.Next.Close()
|
||||||
|
}
|
||||||
|
|
||||||
func (vmt *VertexMatrixTransform) End() {
|
func (vmt *VertexMatrixTransform) End() {
|
||||||
vmt.Next.End()
|
vmt.Next.End()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue