func (gc *GraphicContext) FillStroke(paths ...*draw2d.PathStorage) { gc.fillRasterizer.UseNonZeroWinding = gc.Current.FillRule.UseNonZeroWinding() gc.strokeRasterizer.UseNonZeroWinding = true filler := draw2d.NewVertexMatrixTransform(gc.Current.Tr, draw2d.NewVertexAdder(gc.fillRasterizer)) stroker := draw2d.NewLineStroker(gc.Current.Cap, gc.Current.Join, draw2d.NewVertexMatrixTransform(gc.Current.Tr, draw2d.NewVertexAdder(gc.strokeRasterizer))) stroker.HalfLineWidth = gc.Current.LineWidth / 2 demux := draw2d.NewDemuxConverter(filler, stroker) paths = append(paths, gc.Current.Path) pathConverter := draw2d.NewPathConverter(demux) pathConverter.ApproximationScale = gc.Current.Tr.GetScale() // From agg code pathConverter.Convert(paths...) gc.paint(gc.fillRasterizer, gc.Current.FillColor) gc.paint(gc.strokeRasterizer, gc.Current.StrokeColor) gc.Current.Path = draw2d.NewPathStorage() }
func (gc *GraphicContext) Stroke(paths ...*draw2d.PathStorage) { paths = append(paths, gc.Current.Path) gc.strokeRasterizer.UseNonZeroWinding = true stroker := draw2d.NewLineStroker(gc.Current.Cap, gc.Current.Join, draw2d.NewVertexMatrixTransform(gc.Current.Tr, draw2d.NewVertexAdder(gc.strokeRasterizer))) stroker.HalfLineWidth = gc.Current.LineWidth / 2 var pathConverter *draw2d.PathConverter if gc.Current.Dash != nil && len(gc.Current.Dash) > 0 { dasher := draw2d.NewDashConverter(gc.Current.Dash, gc.Current.DashOffset, stroker) pathConverter = draw2d.NewPathConverter(dasher) } else { pathConverter = draw2d.NewPathConverter(stroker) } pathConverter.ApproximationScale = gc.Current.Tr.GetScale() // From agg code pathConverter.Convert(paths...) gc.paint(gc.strokeRasterizer, gc.Current.StrokeColor) gc.Current.Path = draw2d.NewPathStorage() }