replace LineEndMarker by End() Method
This commit is contained in:
parent
ceb331894d
commit
4fa829a373
10 changed files with 93 additions and 82 deletions
11
dasher.go
11
dasher.go
|
@ -21,11 +21,12 @@ 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
|
||||||
if dasher.command == LineEndMarker {
|
|
||||||
dasher.next.NextCommand(LineEndMarker)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dasher *DashVertexConverter) LineTo(x, y float64) {
|
func (dasher *DashVertexConverter) LineTo(x, y float64) {
|
||||||
|
@ -57,7 +58,7 @@ func (dasher *DashVertexConverter) lineTo(x, y float64) {
|
||||||
dasher.next.LineTo(lx, ly)
|
dasher.next.LineTo(lx, ly)
|
||||||
} else {
|
} else {
|
||||||
// gap
|
// gap
|
||||||
dasher.next.NextCommand(LineEndMarker)
|
dasher.next.End()
|
||||||
dasher.next.MoveTo(lx, ly)
|
dasher.next.MoveTo(lx, ly)
|
||||||
}
|
}
|
||||||
d = d - rest
|
d = d - rest
|
||||||
|
@ -71,7 +72,7 @@ func (dasher *DashVertexConverter) lineTo(x, y float64) {
|
||||||
dasher.next.LineTo(x, y)
|
dasher.next.LineTo(x, y)
|
||||||
} else {
|
} else {
|
||||||
// gap
|
// gap
|
||||||
dasher.next.NextCommand(LineEndMarker)
|
dasher.next.End()
|
||||||
dasher.next.MoveTo(x, y)
|
dasher.next.MoveTo(x, y)
|
||||||
}
|
}
|
||||||
if dasher.distance >= dasher.dash[dasher.currentDash] {
|
if dasher.distance >= dasher.dash[dasher.currentDash] {
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2010 The draw2d Authors. All rights reserved.
|
|
||||||
// created: 13/12/2010 by Laurent Le Goff
|
|
||||||
|
|
||||||
package draw2d
|
|
||||||
|
|
||||||
type DemuxConverter struct {
|
|
||||||
converters []LineBuilder
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDemuxConverter(converters ...LineBuilder) *DemuxConverter {
|
|
||||||
return &DemuxConverter{converters}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dc *DemuxConverter) NextCommand(cmd LineMarker) {
|
|
||||||
for _, converter := range dc.converters {
|
|
||||||
converter.NextCommand(cmd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dc *DemuxConverter) MoveTo(x, y float64) {
|
|
||||||
for _, converter := range dc.converters {
|
|
||||||
converter.MoveTo(x, y)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dc *DemuxConverter) LineTo(x, y float64) {
|
|
||||||
for _, converter := range dc.converters {
|
|
||||||
converter.LineTo(x, y)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -223,7 +223,7 @@ func (gc *GraphicContext) FillStroke(paths ...*draw2d.PathStorage) {
|
||||||
stroker := draw2d.NewLineStroker(gc.Current.Cap, gc.Current.Join, draw2d.NewVertexMatrixTransform(gc.Current.Tr, draw2d.NewVertexAdder(gc.strokeRasterizer)))
|
stroker := draw2d.NewLineStroker(gc.Current.Cap, gc.Current.Join, draw2d.NewVertexMatrixTransform(gc.Current.Tr, draw2d.NewVertexAdder(gc.strokeRasterizer)))
|
||||||
stroker.HalfLineWidth = gc.Current.LineWidth / 2
|
stroker.HalfLineWidth = gc.Current.LineWidth / 2
|
||||||
|
|
||||||
demux := draw2d.NewDemuxConverter(filler, stroker)
|
demux := draw2d.NewLineBuilders(filler, stroker)
|
||||||
paths = append(paths, gc.Current.Path)
|
paths = append(paths, gc.Current.Path)
|
||||||
pathConverter := draw2d.NewPathConverter(demux)
|
pathConverter := draw2d.NewPathConverter(demux)
|
||||||
pathConverter.ApproximationScale = gc.Current.Tr.GetScale() // From agg code
|
pathConverter.ApproximationScale = gc.Current.Tr.GetScale() // From agg code
|
||||||
|
|
2
image.go
2
image.go
|
@ -317,7 +317,7 @@ func (gc *ImageGraphicContext) FillStroke(paths ...*PathStorage) {
|
||||||
stroker := NewLineStroker(gc.Current.Cap, gc.Current.Join, NewVertexMatrixTransform(gc.Current.Tr, NewVertexAdder(gc.strokeRasterizer)))
|
stroker := NewLineStroker(gc.Current.Cap, gc.Current.Join, NewVertexMatrixTransform(gc.Current.Tr, NewVertexAdder(gc.strokeRasterizer)))
|
||||||
stroker.HalfLineWidth = gc.Current.LineWidth / 2
|
stroker.HalfLineWidth = gc.Current.LineWidth / 2
|
||||||
|
|
||||||
demux := NewDemuxConverter(filler, stroker)
|
demux := NewLineBuilders(filler, stroker)
|
||||||
paths = append(paths, gc.Current.Path)
|
paths = append(paths, gc.Current.Path)
|
||||||
pathConverter := NewPathConverter(demux)
|
pathConverter := NewPathConverter(demux)
|
||||||
pathConverter.ApproximationScale = gc.Current.Tr.GetScale()
|
pathConverter.ApproximationScale = gc.Current.Tr.GetScale()
|
||||||
|
|
54
line.go
Normal file
54
line.go
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
// Copyright 2010 The draw2d Authors. All rights reserved.
|
||||||
|
// created: 21/11/2010 by Laurent Le Goff
|
||||||
|
|
||||||
|
package draw2d
|
||||||
|
|
||||||
|
type LineMarker byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
LineNoneMarker LineMarker = iota
|
||||||
|
// Mark the current point of the line as a join to it can draw some specific join Bevel, Miter, Rount
|
||||||
|
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 {
|
||||||
|
NextCommand(cmd LineMarker)
|
||||||
|
MoveTo(x, y float64)
|
||||||
|
LineTo(x, y float64)
|
||||||
|
End()
|
||||||
|
}
|
||||||
|
|
||||||
|
type LineBuilders struct {
|
||||||
|
builders []LineBuilder
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLineBuilders(builders ...LineBuilder) *LineBuilders {
|
||||||
|
return &LineBuilders{builders}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *LineBuilders) NextCommand(cmd LineMarker) {
|
||||||
|
for _, converter := range dc.builders {
|
||||||
|
converter.NextCommand(cmd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *LineBuilders) MoveTo(x, y float64) {
|
||||||
|
for _, converter := range dc.builders {
|
||||||
|
converter.MoveTo(x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *LineBuilders) LineTo(x, y float64) {
|
||||||
|
for _, converter := range dc.builders {
|
||||||
|
converter.LineTo(x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *LineBuilders) End() {
|
||||||
|
for _, converter := range dc.builders {
|
||||||
|
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) End() {
|
||||||
|
}
|
||||||
|
|
||||||
type PathAdder struct {
|
type PathAdder struct {
|
||||||
adder raster.Adder
|
adder raster.Adder
|
||||||
firstPoint raster.Point
|
firstPoint raster.Point
|
||||||
|
|
|
@ -27,7 +27,7 @@ func (c *PathConverter) Convert(paths ...*PathStorage) {
|
||||||
c.x, c.y = path.vertices[i], path.vertices[i+1]
|
c.x, c.y = path.vertices[i], path.vertices[i+1]
|
||||||
c.startX, c.startY = c.x, c.y
|
c.startX, c.startY = c.x, c.y
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
c.converter.NextCommand(LineEndMarker)
|
c.converter.End()
|
||||||
}
|
}
|
||||||
c.converter.MoveTo(c.x, c.y)
|
c.converter.MoveTo(c.x, c.y)
|
||||||
i += 2
|
i += 2
|
||||||
|
@ -67,7 +67,7 @@ func (c *PathConverter) Convert(paths ...*PathStorage) {
|
||||||
c.converter.LineTo(c.startX, c.startY)
|
c.converter.LineTo(c.startX, c.startY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.converter.NextCommand(LineEndMarker)
|
c.converter.End()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ func (c *PathConverter) convertCommand(cmd PathCmd, vertices ...float64) int {
|
||||||
func (c *PathConverter) MoveTo(x, y float64) *PathConverter {
|
func (c *PathConverter) MoveTo(x, y float64) *PathConverter {
|
||||||
c.x, c.y = x, y
|
c.x, c.y = x, y
|
||||||
c.startX, c.startY = c.x, c.y
|
c.startX, c.startY = c.x, c.y
|
||||||
c.converter.NextCommand(LineEndMarker)
|
c.converter.End()
|
||||||
c.converter.MoveTo(c.x, c.y)
|
c.converter.MoveTo(c.x, c.y)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
40
stroker.go
40
stroker.go
|
@ -44,28 +44,30 @@ func NewLineStroker(c Cap, j Join, converter LineBuilder) *LineStroker {
|
||||||
|
|
||||||
func (l *LineStroker) NextCommand(command LineMarker) {
|
func (l *LineStroker) NextCommand(command LineMarker) {
|
||||||
l.command = command
|
l.command = command
|
||||||
if command == LineEndMarker {
|
}
|
||||||
if len(l.vertices) > 1 {
|
|
||||||
l.Next.MoveTo(l.vertices[0], l.vertices[1])
|
func (l *LineStroker) End() {
|
||||||
for i, j := 2, 3; j < len(l.vertices); i, j = i+2, j+2 {
|
if len(l.vertices) > 1 {
|
||||||
l.Next.LineTo(l.vertices[i], l.vertices[j])
|
l.Next.MoveTo(l.vertices[0], l.vertices[1])
|
||||||
l.Next.NextCommand(LineNoneMarker)
|
for i, j := 2, 3; j < len(l.vertices); i, j = i+2, j+2 {
|
||||||
}
|
l.Next.LineTo(l.vertices[i], l.vertices[j])
|
||||||
}
|
|
||||||
for i, j := len(l.rewind)-2, len(l.rewind)-1; j > 0; i, j = i-2, j-2 {
|
|
||||||
l.Next.NextCommand(LineNoneMarker)
|
l.Next.NextCommand(LineNoneMarker)
|
||||||
l.Next.LineTo(l.rewind[i], l.rewind[j])
|
|
||||||
}
|
}
|
||||||
if len(l.vertices) > 1 {
|
|
||||||
l.Next.NextCommand(LineNoneMarker)
|
|
||||||
l.Next.LineTo(l.vertices[0], l.vertices[1])
|
|
||||||
}
|
|
||||||
l.Next.NextCommand(LineEndMarker)
|
|
||||||
// reinit vertices
|
|
||||||
l.vertices = l.vertices[0:0]
|
|
||||||
l.rewind = l.rewind[0:0]
|
|
||||||
l.x, l.y, l.nx, l.ny = 0, 0, 0, 0
|
|
||||||
}
|
}
|
||||||
|
for i, j := len(l.rewind)-2, len(l.rewind)-1; j > 0; i, j = i-2, j-2 {
|
||||||
|
l.Next.NextCommand(LineNoneMarker)
|
||||||
|
l.Next.LineTo(l.rewind[i], l.rewind[j])
|
||||||
|
}
|
||||||
|
if len(l.vertices) > 1 {
|
||||||
|
l.Next.NextCommand(LineNoneMarker)
|
||||||
|
l.Next.LineTo(l.vertices[0], l.vertices[1])
|
||||||
|
}
|
||||||
|
l.Next.End()
|
||||||
|
// reinit vertices
|
||||||
|
l.vertices = l.vertices[0:0]
|
||||||
|
l.rewind = l.rewind[0:0]
|
||||||
|
l.x, l.y, l.nx, l.ny = 0, 0, 0, 0
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LineStroker) MoveTo(x, y float64) {
|
func (l *LineStroker) MoveTo(x, y float64) {
|
||||||
|
|
|
@ -278,6 +278,10 @@ func (vmt *VertexMatrixTransform) LineTo(x, y float64) {
|
||||||
vmt.Next.LineTo(u, v)
|
vmt.Next.LineTo(u, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (vmt *VertexMatrixTransform) End() {
|
||||||
|
vmt.Next.End()
|
||||||
|
}
|
||||||
|
|
||||||
// this adder apply a Matrix transformation to points
|
// this adder apply a Matrix transformation to points
|
||||||
type MatrixTransformAdder struct {
|
type MatrixTransformAdder struct {
|
||||||
tr MatrixTransform
|
tr MatrixTransform
|
||||||
|
|
23
vertex2d.go
23
vertex2d.go
|
@ -1,23 +0,0 @@
|
||||||
// Copyright 2010 The draw2d Authors. All rights reserved.
|
|
||||||
// created: 21/11/2010 by Laurent Le Goff
|
|
||||||
|
|
||||||
package draw2d
|
|
||||||
|
|
||||||
type LineMarker byte
|
|
||||||
|
|
||||||
const (
|
|
||||||
LineNoneMarker LineMarker = iota
|
|
||||||
// Mark the current point of the line as a join to it can draw some specific join Bevel, Miter, Rount
|
|
||||||
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
|
|
||||||
// Mark the current point of the line as finished. This ending maker allow caps to be drawn
|
|
||||||
LineEndMarker
|
|
||||||
)
|
|
||||||
|
|
||||||
type LineBuilder interface {
|
|
||||||
NextCommand(cmd LineMarker)
|
|
||||||
MoveTo(x, y float64)
|
|
||||||
LineTo(x, y float64)
|
|
||||||
}
|
|
Loading…
Reference in a new issue