From d47e08f7c9c8518edecbf9695ab1b46436efaf37 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 01:03:41 +0200 Subject: [PATCH 01/52] Preparing for pdf backend - make PathStorage Commands and Vertices public, so they can be accessed by the pdf backend - start every path with MoveTo (also before ArcTo) --- advanced_path.go | 2 ++ path_adder.go | 12 +++++----- path_converter.go | 4 ++-- path_storage.go | 60 +++++++++++++++++++++++------------------------ 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/advanced_path.go b/advanced_path.go index 68f1d78..2610bb8 100644 --- a/advanced_path.go +++ b/advanced_path.go @@ -32,11 +32,13 @@ func RoundRect(path Path, x1, y1, x2, y2, arcWidth, arcHeight float64) { } func Ellipse(path Path, cx, cy, rx, ry float64) { + path.MoveTo(cx-rx, cy) path.ArcTo(cx, cy, rx, ry, 0, -math.Pi*2) path.Close() } func Circle(path Path, cx, cy, radius float64) { + path.MoveTo(cx-radius, cy) path.ArcTo(cx, cy, radius, radius, 0, -math.Pi*2) path.Close() } diff --git a/path_adder.go b/path_adder.go index c5efd2b..5731bb5 100644 --- a/path_adder.go +++ b/path_adder.go @@ -43,23 +43,23 @@ func NewPathAdder(adder raster.Adder) *PathAdder { func (pathAdder *PathAdder) Convert(paths ...*PathStorage) { for _, path := range paths { j := 0 - for _, cmd := range path.commands { + for _, cmd := range path.Commands { switch cmd { case MoveTo: - pathAdder.firstPoint = raster.Point{raster.Fix32(path.vertices[j] * 256), raster.Fix32(path.vertices[j+1] * 256)} + pathAdder.firstPoint = raster.Point{raster.Fix32(path.Vertices[j] * 256), raster.Fix32(path.Vertices[j+1] * 256)} pathAdder.adder.Start(pathAdder.firstPoint) j += 2 case LineTo: - pathAdder.adder.Add1(raster.Point{raster.Fix32(path.vertices[j] * 256), raster.Fix32(path.vertices[j+1] * 256)}) + pathAdder.adder.Add1(raster.Point{raster.Fix32(path.Vertices[j] * 256), raster.Fix32(path.Vertices[j+1] * 256)}) j += 2 case QuadCurveTo: - pathAdder.adder.Add2(raster.Point{raster.Fix32(path.vertices[j] * 256), raster.Fix32(path.vertices[j+1] * 256)}, raster.Point{raster.Fix32(path.vertices[j+2] * 256), raster.Fix32(path.vertices[j+3] * 256)}) + pathAdder.adder.Add2(raster.Point{raster.Fix32(path.Vertices[j] * 256), raster.Fix32(path.Vertices[j+1] * 256)}, raster.Point{raster.Fix32(path.Vertices[j+2] * 256), raster.Fix32(path.Vertices[j+3] * 256)}) j += 4 case CubicCurveTo: - pathAdder.adder.Add3(raster.Point{raster.Fix32(path.vertices[j] * 256), raster.Fix32(path.vertices[j+1] * 256)}, raster.Point{raster.Fix32(path.vertices[j+2] * 256), raster.Fix32(path.vertices[j+3] * 256)}, raster.Point{raster.Fix32(path.vertices[j+4] * 256), raster.Fix32(path.vertices[j+5] * 256)}) + pathAdder.adder.Add3(raster.Point{raster.Fix32(path.Vertices[j] * 256), raster.Fix32(path.Vertices[j+1] * 256)}, raster.Point{raster.Fix32(path.Vertices[j+2] * 256), raster.Fix32(path.Vertices[j+3] * 256)}, raster.Point{raster.Fix32(path.Vertices[j+4] * 256), raster.Fix32(path.Vertices[j+5] * 256)}) j += 6 case ArcTo: - lastPoint := arcAdder(pathAdder.adder, path.vertices[j], path.vertices[j+1], path.vertices[j+2], path.vertices[j+3], path.vertices[j+4], path.vertices[j+5], pathAdder.ApproximationScale) + lastPoint := arcAdder(pathAdder.adder, path.Vertices[j], path.Vertices[j+1], path.Vertices[j+2], path.Vertices[j+3], path.Vertices[j+4], path.Vertices[j+5], pathAdder.ApproximationScale) pathAdder.adder.Add1(lastPoint) j += 6 case Close: diff --git a/path_converter.go b/path_converter.go index 0ef96b8..865a466 100644 --- a/path_converter.go +++ b/path_converter.go @@ -20,8 +20,8 @@ func NewPathConverter(converter VertexConverter) *PathConverter { func (c *PathConverter) Convert(paths ...*PathStorage) { for _, path := range paths { j := 0 - for _, cmd := range path.commands { - j = j + c.ConvertCommand(cmd, path.vertices[j:]...) + for _, cmd := range path.Commands { + j = j + c.ConvertCommand(cmd, path.Vertices[j:]...) } c.converter.NextCommand(VertexStopCommand) } diff --git a/path_storage.go b/path_storage.go index c2a8870..a7e1662 100644 --- a/path_storage.go +++ b/path_storage.go @@ -20,45 +20,45 @@ const ( ) type PathStorage struct { - commands []PathCmd - vertices []float64 + Commands []PathCmd + Vertices []float64 x, y float64 } func NewPathStorage() (p *PathStorage) { p = new(PathStorage) - p.commands = make([]PathCmd, 0, 256) - p.vertices = make([]float64, 0, 256) + p.Commands = make([]PathCmd, 0, 256) + p.Vertices = make([]float64, 0, 256) return } func (p *PathStorage) Clear() { - p.commands = p.commands[0:0] - p.vertices = p.vertices[0:0] + p.Commands = p.Commands[0:0] + p.Vertices = p.Vertices[0:0] return } -func (p *PathStorage) appendToPath(cmd PathCmd, vertices ...float64) { - if cap(p.vertices) <= len(p.vertices)+6 { - a := make([]PathCmd, len(p.commands), cap(p.commands)+256) - b := make([]float64, len(p.vertices), cap(p.vertices)+256) - copy(a, p.commands) - p.commands = a - copy(b, p.vertices) - p.vertices = b +func (p *PathStorage) appendToPath(cmd PathCmd, Vertices ...float64) { + if cap(p.Vertices) <= len(p.Vertices)+6 { + a := make([]PathCmd, len(p.Commands), cap(p.Commands)+256) + b := make([]float64, len(p.Vertices), cap(p.Vertices)+256) + copy(a, p.Commands) + p.Commands = a + copy(b, p.Vertices) + p.Vertices = b } - p.commands = p.commands[0 : len(p.commands)+1] - p.commands[len(p.commands)-1] = cmd - copy(p.vertices[len(p.vertices):len(p.vertices)+len(vertices)], vertices) - p.vertices = p.vertices[0 : len(p.vertices)+len(vertices)] + p.Commands = p.Commands[0 : len(p.Commands)+1] + p.Commands[len(p.Commands)-1] = cmd + copy(p.Vertices[len(p.Vertices):len(p.Vertices)+len(Vertices)], Vertices) + p.Vertices = p.Vertices[0 : len(p.Vertices)+len(Vertices)] } func (src *PathStorage) Copy() (dest *PathStorage) { dest = new(PathStorage) - dest.commands = make([]PathCmd, len(src.commands)) - copy(dest.commands, src.commands) - dest.vertices = make([]float64, len(src.vertices)) - copy(dest.vertices, src.vertices) + dest.Commands = make([]PathCmd, len(src.Commands)) + copy(dest.Commands, src.Commands) + dest.Vertices = make([]float64, len(src.Vertices)) + copy(dest.Vertices, src.Vertices) return dest } @@ -67,7 +67,7 @@ func (p *PathStorage) LastPoint() (x, y float64) { } func (p *PathStorage) IsEmpty() bool { - return len(p.commands) == 0 + return len(p.Commands) == 0 } func (p *PathStorage) Close() *PathStorage { @@ -145,7 +145,7 @@ func (p *PathStorage) ArcTo(cx, cy, rx, ry, startAngle, angle float64) *PathStor } startX := cx + math.Cos(startAngle)*rx startY := cy + math.Sin(startAngle)*ry - if len(p.commands) > 0 { + if len(p.Commands) > 0 { p.LineTo(startX, startY) } else { p.MoveTo(startX, startY) @@ -165,22 +165,22 @@ func (p *PathStorage) RArcTo(dcx, dcy, rx, ry, startAngle, angle float64) *PathS func (p *PathStorage) String() string { s := "" j := 0 - for _, cmd := range p.commands { + for _, cmd := range p.Commands { switch cmd { case MoveTo: - s += fmt.Sprintf("MoveTo: %f, %f\n", p.vertices[j], p.vertices[j+1]) + s += fmt.Sprintf("MoveTo: %f, %f\n", p.Vertices[j], p.Vertices[j+1]) j = j + 2 case LineTo: - s += fmt.Sprintf("LineTo: %f, %f\n", p.vertices[j], p.vertices[j+1]) + s += fmt.Sprintf("LineTo: %f, %f\n", p.Vertices[j], p.Vertices[j+1]) j = j + 2 case QuadCurveTo: - s += fmt.Sprintf("QuadCurveTo: %f, %f, %f, %f\n", p.vertices[j], p.vertices[j+1], p.vertices[j+2], p.vertices[j+3]) + s += fmt.Sprintf("QuadCurveTo: %f, %f, %f, %f\n", p.Vertices[j], p.Vertices[j+1], p.Vertices[j+2], p.Vertices[j+3]) j = j + 4 case CubicCurveTo: - s += fmt.Sprintf("CubicCurveTo: %f, %f, %f, %f, %f, %f\n", p.vertices[j], p.vertices[j+1], p.vertices[j+2], p.vertices[j+3], p.vertices[j+4], p.vertices[j+5]) + s += fmt.Sprintf("CubicCurveTo: %f, %f, %f, %f, %f, %f\n", p.Vertices[j], p.Vertices[j+1], p.Vertices[j+2], p.Vertices[j+3], p.Vertices[j+4], p.Vertices[j+5]) j = j + 6 case ArcTo: - s += fmt.Sprintf("ArcTo: %f, %f, %f, %f, %f, %f\n", p.vertices[j], p.vertices[j+1], p.vertices[j+2], p.vertices[j+3], p.vertices[j+4], p.vertices[j+5]) + s += fmt.Sprintf("ArcTo: %f, %f, %f, %f, %f, %f\n", p.Vertices[j], p.Vertices[j+1], p.Vertices[j+2], p.Vertices[j+3], p.Vertices[j+4], p.Vertices[j+5]) j = j + 6 case Close: s += "Close\n" From a422b2462dd49e51b1675ce19428149b51e6c58a Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 01:13:20 +0200 Subject: [PATCH 02/52] partial implementation of gofpdf backend --- pdf2d/fileutil.go | 8 +++ pdf2d/graphiccontext.go | 144 +++++++++++++++++++++++++++++++++++++++ pdf2d/path_converter.go | 56 +++++++++++++++ pdf2d/path_logger.go | 70 +++++++++++++++++++ pdf2d/samples/android.go | 79 +++++++++++++++++++++ pdf2d/transform.go | 55 +++++++++++++++ pdf2d/vectorizer.go | 21 ++++++ 7 files changed, 433 insertions(+) create mode 100644 pdf2d/fileutil.go create mode 100644 pdf2d/graphiccontext.go create mode 100644 pdf2d/path_converter.go create mode 100644 pdf2d/path_logger.go create mode 100644 pdf2d/samples/android.go create mode 100644 pdf2d/transform.go create mode 100644 pdf2d/vectorizer.go diff --git a/pdf2d/fileutil.go b/pdf2d/fileutil.go new file mode 100644 index 0000000..7df9da9 --- /dev/null +++ b/pdf2d/fileutil.go @@ -0,0 +1,8 @@ +package pdf2d + +import "github.com/stanim/gofpdf" + +// SaveToPdfFile create and save a pdf document to a file +func SaveToPdfFile(filePath string, pdf *gofpdf.Fpdf) error { + return pdf.OutputFileAndClose(filePath) +} diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go new file mode 100644 index 0000000..03bd69c --- /dev/null +++ b/pdf2d/graphiccontext.go @@ -0,0 +1,144 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +package pdf2d + +import ( + "fmt" + "image" + "image/color" + "log" + "os" + + "github.com/stanim/draw2d" + "github.com/stanim/gofpdf" +) + +const c255 = 254.0 / 65535.0 + +var ( + caps = map[draw2d.Cap]string{ + draw2d.RoundCap: "round", + draw2d.ButtCap: "butt", + draw2d.SquareCap: "square"} +) + +func notImplemented(method string) { + fmt.Printf("%s: not implemented\n", method) +} + +func rgb(c color.Color) (int, int, int) { + r, g, b, _ := c.RGBA() + return int(float64(r) * c255), int(float64(g) * c255), int(float64(b) * c255) +} + +// GraphicContext implements the draw2d.GraphicContext interface +// It provides draw2d with a pdf backend (based on gofpdf) +type GraphicContext struct { + *draw2d.StackGraphicContext + pdf *gofpdf.Fpdf + DPI int +} + +// NewGraphicContext creates a new pdf GraphicContext +func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { + dpi := 92 + return &GraphicContext{draw2d.NewStackGraphicContext(), pdf, dpi} +} + +func (gc *GraphicContext) DrawImage(image image.Image) { + notImplemented("DrawImage") +} +func (gc *GraphicContext) Clear() { + notImplemented("Clear") +} + +func (gc *GraphicContext) ClearRect(x1, y1, x2, y2 int) { + notImplemented("ClearRect") +} + +func (gc *GraphicContext) SetDPI(dpi int) { + gc.DPI = dpi +} + +func (gc *GraphicContext) GetDPI() int { + return gc.DPI +} + +func (gc *GraphicContext) GetStringBounds(s string) (left, top, right, bottom float64) { + notImplemented("GetStringBounds") + return 0, 0, 0, 0 +} + +func (gc *GraphicContext) CreateStringPath(text string, x, y float64) (cursor float64) { + notImplemented("CreateStringPath") + return 0 +} + +func (gc *GraphicContext) FillString(text string) (cursor float64) { + notImplemented("FillString") + return 0 +} + +func (gc *GraphicContext) FillStringAt(text string, x, y float64) (cursor float64) { + notImplemented("FillStringAt") + return 0 +} + +func (gc *GraphicContext) StrokeString(text string) (cursor float64) { + notImplemented("StrokeString") + return 0 +} + +func (gc *GraphicContext) StrokeStringAt(text string, x, y float64) (cursor float64) { + notImplemented("StrokeStringAt") + return 0 +} + +func (gc *GraphicContext) Stroke(paths ...*draw2d.PathStorage) { + gc.draw("D", paths...) +} + +func (gc *GraphicContext) Fill(paths ...*draw2d.PathStorage) { + gc.draw("F", paths...) +} + +func (gc *GraphicContext) FillStroke(paths ...*draw2d.PathStorage) { + gc.draw("FD", paths...) +} + +var logger *log.Logger = log.New(os.Stdout, "", log.Lshortfile) + +func (gc *GraphicContext) draw(style string, paths ...*draw2d.PathStorage) { + paths = append(paths, gc.Current.Path) + pathConverter := NewPathConverter( + NewVertexMatrixTransform(gc.Current.Tr, + NewPathLogger(logger, gc.pdf))) + pathConverter.Convert(paths...) + if gc.Current.FillRule.UseNonZeroWinding() { + style += "*" + } + gc.pdf.DrawPath(style) +} + +// overwrite StackGraphicContext methods + +func (gc *GraphicContext) SetStrokeColor(c color.Color) { + gc.StackGraphicContext.SetStrokeColor(c) + gc.pdf.SetDrawColor(rgb(c)) +} + +func (gc *GraphicContext) SetFillColor(c color.Color) { + gc.StackGraphicContext.SetFillColor(c) + gc.pdf.SetFillColor(rgb(c)) +} + +func (gc *GraphicContext) SetLineWidth(LineWidth float64) { + gc.StackGraphicContext.SetLineWidth(LineWidth) + gc.pdf.SetLineWidth(LineWidth) +} + +func (gc *GraphicContext) SetLineCap(Cap draw2d.Cap) { + gc.StackGraphicContext.SetLineCap(Cap) + gc.pdf.SetLineCapStyle(caps[Cap]) +} diff --git a/pdf2d/path_converter.go b/pdf2d/path_converter.go new file mode 100644 index 0000000..2f2ab36 --- /dev/null +++ b/pdf2d/path_converter.go @@ -0,0 +1,56 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +package pdf2d + +import ( + "math" + + "github.com/stanim/draw2d" +) + +const deg = 180 / math.Pi + +type PathConverter struct { + pdf Vectorizer +} + +func NewPathConverter(pdf Vectorizer) *PathConverter { + return &PathConverter{pdf: pdf} +} + +func (c *PathConverter) Convert(paths ...*draw2d.PathStorage) { + for _, path := range paths { + j := 0 + for _, cmd := range path.Commands { + j = j + c.ConvertCommand(cmd, path.Vertices[j:]...) + } + } +} + +func (c *PathConverter) ConvertCommand(cmd draw2d.PathCmd, vertices ...float64) int { + switch cmd { + case draw2d.MoveTo: + c.pdf.MoveTo(vertices[0], vertices[1]) + return 2 + case draw2d.LineTo: + c.pdf.LineTo(vertices[0], vertices[1]) + return 2 + case draw2d.QuadCurveTo: + c.pdf.CurveTo(vertices[0], vertices[1], vertices[2], vertices[3]) + return 4 + case draw2d.CubicCurveTo: + c.pdf.CurveBezierCubicTo(vertices[0], vertices[1], vertices[2], vertices[3], vertices[4], vertices[5]) + return 6 + case draw2d.ArcTo: + c.pdf.ArcTo(vertices[0], vertices[1], vertices[2], vertices[3], + 0, // degRotate + vertices[4]*deg, // degStart = startAngle + (vertices[4]-vertices[5])*deg) // degEnd = startAngle-angle + return 6 + case draw2d.Close: + c.pdf.ClosePath() + return 0 + } + return 0 +} diff --git a/pdf2d/path_logger.go b/pdf2d/path_logger.go new file mode 100644 index 0000000..24faf49 --- /dev/null +++ b/pdf2d/path_logger.go @@ -0,0 +1,70 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +package pdf2d + +import ( + "bytes" + "log" + "strconv" +) + +func ftoas(xs ...float64) string { + var buffer bytes.Buffer + for i, x := range xs { + if i > 0 { + buffer.WriteString(", ") + } + buffer.WriteString(strconv.FormatFloat(x, 'f', 2, 64)) + } + return buffer.String() +} + +// VertexMatrixTransform implements Vectorizer and applies the Matrix +// transformation tr. It is normally wrapped around gofpdf Fpdf. +type PathLogger struct { + logger *log.Logger + Next Vectorizer +} + +func NewPathLogger(logger *log.Logger, + vectorizer Vectorizer) *PathLogger { + return &PathLogger{logger, vectorizer} +} + +// MoveTo creates a new subpath that start at the specified point +func (pl *PathLogger) MoveTo(x, y float64) { + pl.logger.Printf("MoveTo(x=%.2f, y=%.2f)", x, y) + pl.Next.MoveTo(x, y) +} + +// LineTo adds a line to the current subpath +func (pl *PathLogger) LineTo(x, y float64) { + pl.logger.Printf("LineTo(x=%.2f, y=%.2f)", x, y) + pl.Next.LineTo(x, y) +} + +// CurveTo adds a quadratic bezier curve to the current subpath +func (pl *PathLogger) CurveTo(cx, cy, x, y float64) { + pl.logger.Printf("CurveTo(cx=%.2f, cy=%.2f, x=%.2f, y=%.2f)", cx, cy, x, y) + pl.Next.CurveTo(cx, cy, x, y) + +} + +// CurveTo adds a cubic bezier curve to the current subpath +func (pl *PathLogger) CurveBezierCubicTo(cx1, cy1, + cx2, cy2, x, y float64) { + pl.logger.Printf("CurveBezierCubicTo(cx1=%.2f, cy1=%.2f, cx2=%.2f, cy2=%.2f, x=%.2f, y=%.2f)", cx1, cy1, cx2, cy2, x, y) + pl.Next.CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y) +} + +// ArcTo adds an arc to the current subpath +func (pl *PathLogger) ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) { + pl.logger.Printf("ArcTo(x=%.2f, y=%.2f, rx=%.2f, ry=%.2f, degRotate=%.2f, degStart=%.2f, degEnd=%.2f)", x, y, rx, ry, degRotate, degStart, degEnd) + pl.Next.ArcTo(x, y, rx, ry, degRotate, degStart, degEnd) +} + +// ClosePath closes the subpath +func (pl *PathLogger) ClosePath() { + pl.Next.ClosePath() +} diff --git a/pdf2d/samples/android.go b/pdf2d/samples/android.go new file mode 100644 index 0000000..91c8f56 --- /dev/null +++ b/pdf2d/samples/android.go @@ -0,0 +1,79 @@ +// Copyright 2010 The draw2d Authors. All rights reserved. +// created: 21/11/2010 by Laurent Le Goff + +// Draw an android avatar to android.png +package main + +import ( + "fmt" + "image/color" + "math" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" + "github.com/stanim/gofpdf" +) + +func main() { + // Initialize the graphic context on a pdf document + pdf := gofpdf.New("P", "mm", "A4", "../font") + pdf.AddPage() + gc := pdf2d.NewGraphicContext(pdf) + + // set the fill and stroke color of the droid + gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) + gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) + + // Draw the droid + DrawDroid(gc, 10, 10) + + // Save to png + pdf2d.SaveToPdfFile("android.pdf", pdf) +} + +func DrawDroid(gc draw2d.GraphicContext, x, y float64) { + gc.SetLineCap(draw2d.RoundCap) + gc.SetLineWidth(5) + + fmt.Println("\nhead") + gc.MoveTo(x+30, y+70) + gc.ArcTo(x+80, y+70, 50, 50, 180*(math.Pi/180), 180*(math.Pi/180)) + gc.Close() + gc.FillStroke() + gc.MoveTo(x+60, y+25) + gc.LineTo(x+50, y+10) + gc.MoveTo(x+100, y+25) + gc.LineTo(x+110, y+10) + gc.Stroke() + + fmt.Println("\nleft eye") + draw2d.Circle(gc, x+60, y+45, 5) + gc.FillStroke() + + fmt.Println("\nright eye") + draw2d.Circle(gc, x+100, y+45, 5) + gc.FillStroke() + + fmt.Println("\nbody") + draw2d.RoundRect(gc, x+30, y+75, x+30+100, y+75+90, 10, 10) + gc.FillStroke() + draw2d.Rect(gc, x+30, y+75, x+30+100, y+75+80) + gc.FillStroke() + + fmt.Println("\nleft arm") + draw2d.RoundRect(gc, x+5, y+80, x+5+20, y+80+70, 10, 10) + gc.FillStroke() + + fmt.Println("\nright arm") + draw2d.RoundRect(gc, x+135, y+80, x+135+20, y+80+70, 10, 10) + gc.FillStroke() + + fmt.Println("\nleft leg") + draw2d.RoundRect(gc, x+50, y+150, x+50+20, y+150+50, 10, 10) + gc.FillStroke() + + fmt.Println("\nright leg") + draw2d.RoundRect(gc, x+90, y+150, x+90+20, y+150+50, 10, 10) + gc.FillStroke() + +} diff --git a/pdf2d/transform.go b/pdf2d/transform.go new file mode 100644 index 0000000..1da048d --- /dev/null +++ b/pdf2d/transform.go @@ -0,0 +1,55 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +package pdf2d + +import "github.com/stanim/draw2d" + +// VertexMatrixTransform implements Vectorizer and applies the Matrix +// transformation tr. It is normally wrapped around gofpdf Fpdf. +type VertexMatrixTransform struct { + tr draw2d.MatrixTransform + Next Vectorizer +} + +func NewVertexMatrixTransform(tr draw2d.MatrixTransform, + vectorizer Vectorizer) *VertexMatrixTransform { + return &VertexMatrixTransform{tr, vectorizer} +} + +// MoveTo creates a new subpath that start at the specified point +func (vmt *VertexMatrixTransform) MoveTo(x, y float64) { + vmt.tr.Transform(&x, &y) + vmt.Next.MoveTo(x, y) +} + +// LineTo adds a line to the current subpath +func (vmt *VertexMatrixTransform) LineTo(x, y float64) { + vmt.tr.Transform(&x, &y) + vmt.Next.LineTo(x, y) +} + +// CurveTo adds a quadratic bezier curve to the current subpath +func (vmt *VertexMatrixTransform) CurveTo(cx, cy, x, y float64) { + vmt.tr.Transform(&cx, &cy, &x, &y) + vmt.Next.CurveTo(cx, cy, x, y) + +} + +// CurveTo adds a cubic bezier curve to the current subpath +func (vmt *VertexMatrixTransform) CurveBezierCubicTo(cx1, cy1, + cx2, cy2, x, y float64) { + vmt.tr.Transform(&cx1, &cy1, &cx2, &cy2, &x, &y) + vmt.Next.CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y) +} + +// ArcTo adds an arc to the current subpath +func (vmt *VertexMatrixTransform) ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) { + vmt.tr.Transform(&x, &y) + vmt.Next.ArcTo(x, y, rx, ry, degRotate, degStart, degEnd) +} + +// ClosePath closes the subpath +func (vmt *VertexMatrixTransform) ClosePath() { + vmt.Next.ClosePath() +} diff --git a/pdf2d/vectorizer.go b/pdf2d/vectorizer.go new file mode 100644 index 0000000..c7cc5a3 --- /dev/null +++ b/pdf2d/vectorizer.go @@ -0,0 +1,21 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +package pdf2d + +// Vectorizer defines the minimal interface for gofpdf.Fpdf +// It is also implemented by for example VertexMatrixTransform +type Vectorizer interface { + // MoveTo creates a new subpath that start at the specified point + MoveTo(x, y float64) + // LineTo adds a line to the current subpath + LineTo(x, y float64) + // CurveTo adds a quadratic bezier curve to the current subpath + CurveTo(cx, cy, x, y float64) + // CurveTo adds a cubic bezier curve to the current subpath + CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y float64) + // ArcTo adds an arc to the current subpath + ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) + // ClosePath closes the subpath + ClosePath() +} From bbcbc3df5e2517e9362c9756feb62d667a915dd6 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 13:50:43 +0200 Subject: [PATCH 03/52] fix c255 for rgb conversion --- pdf2d/graphiccontext.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 03bd69c..70d4a88 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -14,8 +14,6 @@ import ( "github.com/stanim/gofpdf" ) -const c255 = 254.0 / 65535.0 - var ( caps = map[draw2d.Cap]string{ draw2d.RoundCap: "round", @@ -27,6 +25,8 @@ func notImplemented(method string) { fmt.Printf("%s: not implemented\n", method) } +const c255 = 255.0 / 65535.0 + func rgb(c color.Color) (int, int, int) { r, g, b, _ := c.RGBA() return int(float64(r) * c255), int(float64(g) * c255), int(float64(b) * c255) From 74e84c44932cbeb769e01470906239555366de38 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 16:21:13 +0200 Subject: [PATCH 04/52] implemented more methods for pdf graphic context, fixed the code for 100% golint and go vet --- pdf2d/fileutil.go | 2 +- pdf2d/graphiccontext.go | 99 ++++++++++++++++++++++++++++++++++------- pdf2d/path_converter.go | 4 ++ pdf2d/path_logger.go | 8 ++-- pdf2d/transform.go | 6 ++- pdf2d/vectorizer.go | 1 + 6 files changed, 98 insertions(+), 22 deletions(-) diff --git a/pdf2d/fileutil.go b/pdf2d/fileutil.go index 7df9da9..876dae3 100644 --- a/pdf2d/fileutil.go +++ b/pdf2d/fileutil.go @@ -2,7 +2,7 @@ package pdf2d import "github.com/stanim/gofpdf" -// SaveToPdfFile create and save a pdf document to a file +// SaveToPdfFile creates and saves a pdf document to a file func SaveToPdfFile(filePath string, pdf *gofpdf.Fpdf) error { return pdf.OutputFileAndClose(filePath) } diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 70d4a88..b53d532 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -1,14 +1,20 @@ // Copyright 2015 The draw2d Authors. All rights reserved. // created: 26/06/2015 by Stani Michiels +// TODO: fonts, dpi package pdf2d import ( + "bytes" "fmt" "image" "image/color" + "image/jpeg" "log" "os" + "strconv" + + "code.google.com/p/freetype-go/freetype/truetype" "github.com/stanim/draw2d" "github.com/stanim/gofpdf" @@ -27,11 +33,29 @@ func notImplemented(method string) { const c255 = 255.0 / 65535.0 +var ( + imageCount uint32 + white color.Color = color.RGBA{255, 255, 255, 255} +) + func rgb(c color.Color) (int, int, int) { r, g, b, _ := c.RGBA() return int(float64(r) * c255), int(float64(g) * c255), int(float64(b) * c255) } +func clearRect(gc *GraphicContext, x1, y1, x2, y2 float64) { + // save state + f := gc.Current.FillColor + x, y := gc.pdf.GetXY() + // cover page with white rectangle + gc.SetFillColor(white) + draw2d.Rect(gc, x1, y1, x2, y2) + gc.Fill() + // restore state + gc.SetFillColor(f) + gc.pdf.MoveTo(x, y) +} + // GraphicContext implements the draw2d.GraphicContext interface // It provides draw2d with a pdf backend (based on gofpdf) type GraphicContext struct { @@ -46,69 +70,93 @@ func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { return &GraphicContext{draw2d.NewStackGraphicContext(), pdf, dpi} } +// DrawImage draws an image as JPG at 96dpi func (gc *GraphicContext) DrawImage(image image.Image) { - notImplemented("DrawImage") + name := strconv.Itoa(int(imageCount)) + tp := "JPG" // "JPG", "JPEG", "PNG" and "GIF" + b := &bytes.Buffer{} + jpeg.Encode(b, image, nil) + gc.pdf.RegisterImageReader(name, tp, b) + gc.pdf.Image(name, 0, 0, 0, 0, false, tp, 0, "") + // bounds := image.Bounds() + // x, y, w, h := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Dx()), float64(bounds.Dy()) + //gc.pdf.Image(name, x, y, w, h, false, tp, 0, "") } + +// Clear draws a white rectangle over the whole page func (gc *GraphicContext) Clear() { - notImplemented("Clear") + width, height := gc.pdf.GetPageSize() + clearRect(gc, 0, 0, width, height) } +// ClearRect draws a white rectangle over the specified area func (gc *GraphicContext) ClearRect(x1, y1, x2, y2 int) { - notImplemented("ClearRect") + clearRect(gc, float64(x1), float64(y1), float64(x2), float64(y2)) } +// SetDPI is a dummy method to implement the GraphicContext interface func (gc *GraphicContext) SetDPI(dpi int) { gc.DPI = dpi + // gc.recalc() } +// GetDPI is a dummy method to implement the GraphicContext interface func (gc *GraphicContext) GetDPI() int { return gc.DPI } +// GetStringBounds returns the approximate pixel bounds of the string s at x, y. func (gc *GraphicContext) GetStringBounds(s string) (left, top, right, bottom float64) { - notImplemented("GetStringBounds") - return 0, 0, 0, 0 + _, h := gc.pdf.GetFontSize() + return 0, 0, gc.pdf.GetStringWidth(s), h } +// CreateStringPath creates a path from the string s at x, y, and returns the string width. func (gc *GraphicContext) CreateStringPath(text string, x, y float64) (cursor float64) { - notImplemented("CreateStringPath") - return 0 + gc.pdf.MoveTo(x, y) + _, _, w, h := gc.GetStringBounds(text) + gc.pdf.Cell(w, h, text) + return w } +// FillString draws a string at 0, 0 func (gc *GraphicContext) FillString(text string) (cursor float64) { - notImplemented("FillString") - return 0 + return gc.FillStringAt(text, 0, 0) } +// FillStringAt draws a string at x, y func (gc *GraphicContext) FillStringAt(text string, x, y float64) (cursor float64) { - notImplemented("FillStringAt") - return 0 + return gc.CreateStringPath(text, x, y) } +// StrokeString draws a string at 0, 0 func (gc *GraphicContext) StrokeString(text string) (cursor float64) { - notImplemented("StrokeString") - return 0 + return gc.StrokeStringAt(text, 0, 0) } +// StrokeStringAt draws a string at x, y func (gc *GraphicContext) StrokeStringAt(text string, x, y float64) (cursor float64) { - notImplemented("StrokeStringAt") - return 0 + return gc.CreateStringPath(text, x, y) } +// Stroke strokes the paths func (gc *GraphicContext) Stroke(paths ...*draw2d.PathStorage) { gc.draw("D", paths...) } +// Fill strokes the paths func (gc *GraphicContext) Fill(paths ...*draw2d.PathStorage) { gc.draw("F", paths...) } +// FillStroke first fills the paths and than strokes them func (gc *GraphicContext) FillStroke(paths ...*draw2d.PathStorage) { gc.draw("FD", paths...) } -var logger *log.Logger = log.New(os.Stdout, "", log.Lshortfile) +var logger = log.New(os.Stdout, "", log.Lshortfile) +// draw fills and/or strokes paths func (gc *GraphicContext) draw(style string, paths ...*draw2d.PathStorage) { paths = append(paths, gc.Current.Path) pathConverter := NewPathConverter( @@ -123,21 +171,40 @@ func (gc *GraphicContext) draw(style string, paths ...*draw2d.PathStorage) { // overwrite StackGraphicContext methods +// SetStrokeColor sets the stroke color func (gc *GraphicContext) SetStrokeColor(c color.Color) { gc.StackGraphicContext.SetStrokeColor(c) gc.pdf.SetDrawColor(rgb(c)) } +// SetFillColor sets the fill color func (gc *GraphicContext) SetFillColor(c color.Color) { gc.StackGraphicContext.SetFillColor(c) gc.pdf.SetFillColor(rgb(c)) } +// SetFont sets the font used to draw text. +// It is mandatory to call this method at least once before printing +// text or the resulting document will not be valid. +func (gc *GraphicContext) SetFont(font *truetype.Font) { + // TODO: this api conflict needs to be fixed + gc.pdf.SetFont("Helvetica", "", 12) +} + +// SetFontSize sets the font size in points (as in ``a 12 point font''). +func (gc *GraphicContext) SetFontSize(fontSize float64) { + gc.StackGraphicContext.SetFontSize(fontSize) + gc.pdf.SetFontSize(fontSize) + //gc.recalc() +} + +// SetLineWidth sets the line width func (gc *GraphicContext) SetLineWidth(LineWidth float64) { gc.StackGraphicContext.SetLineWidth(LineWidth) gc.pdf.SetLineWidth(LineWidth) } +// SetLineCap sets the line cap (round, but or square) func (gc *GraphicContext) SetLineCap(Cap draw2d.Cap) { gc.StackGraphicContext.SetLineCap(Cap) gc.pdf.SetLineCapStyle(caps[Cap]) diff --git a/pdf2d/path_converter.go b/pdf2d/path_converter.go index 2f2ab36..65213f2 100644 --- a/pdf2d/path_converter.go +++ b/pdf2d/path_converter.go @@ -11,14 +11,17 @@ import ( const deg = 180 / math.Pi +// PathConverter converts the paths to the pdf api type PathConverter struct { pdf Vectorizer } +// NewPathConverter constructs a PathConverter from a pdf vectorizer func NewPathConverter(pdf Vectorizer) *PathConverter { return &PathConverter{pdf: pdf} } +// Convert converts the paths to the pdf api func (c *PathConverter) Convert(paths ...*draw2d.PathStorage) { for _, path := range paths { j := 0 @@ -28,6 +31,7 @@ func (c *PathConverter) Convert(paths ...*draw2d.PathStorage) { } } +// ConvertCommand converts a single path segment to the pdf api func (c *PathConverter) ConvertCommand(cmd draw2d.PathCmd, vertices ...float64) int { switch cmd { case draw2d.MoveTo: diff --git a/pdf2d/path_logger.go b/pdf2d/path_logger.go index 24faf49..c87ea3b 100644 --- a/pdf2d/path_logger.go +++ b/pdf2d/path_logger.go @@ -20,13 +20,15 @@ func ftoas(xs ...float64) string { return buffer.String() } -// VertexMatrixTransform implements Vectorizer and applies the Matrix -// transformation tr. It is normally wrapped around gofpdf Fpdf. +// PathLogger implements Vectorizer and applies the Matrix +// transformation tr. It is used as debugging middleware. +// It should wrap gofpdf.Fpdf directly. type PathLogger struct { logger *log.Logger Next Vectorizer } +// NewPathLogger constructs a new PathLogger func NewPathLogger(logger *log.Logger, vectorizer Vectorizer) *PathLogger { return &PathLogger{logger, vectorizer} @@ -51,7 +53,7 @@ func (pl *PathLogger) CurveTo(cx, cy, x, y float64) { } -// CurveTo adds a cubic bezier curve to the current subpath +// CurveBezierCubicTo adds a cubic bezier curve to the current subpath func (pl *PathLogger) CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y float64) { pl.logger.Printf("CurveBezierCubicTo(cx1=%.2f, cy1=%.2f, cx2=%.2f, cy2=%.2f, x=%.2f, y=%.2f)", cx1, cy1, cx2, cy2, x, y) diff --git a/pdf2d/transform.go b/pdf2d/transform.go index 1da048d..6461aa6 100644 --- a/pdf2d/transform.go +++ b/pdf2d/transform.go @@ -6,12 +6,14 @@ package pdf2d import "github.com/stanim/draw2d" // VertexMatrixTransform implements Vectorizer and applies the Matrix -// transformation tr. It is normally wrapped around gofpdf Fpdf. +// transformation tr. It is normally wrapped around gofpdf Fpdf +// or PathLogger. type VertexMatrixTransform struct { tr draw2d.MatrixTransform Next Vectorizer } +// NewVertexMatrixTransform constructs an new VertexMatrixTransform func NewVertexMatrixTransform(tr draw2d.MatrixTransform, vectorizer Vectorizer) *VertexMatrixTransform { return &VertexMatrixTransform{tr, vectorizer} @@ -36,7 +38,7 @@ func (vmt *VertexMatrixTransform) CurveTo(cx, cy, x, y float64) { } -// CurveTo adds a cubic bezier curve to the current subpath +// CurveBezierCubicTo adds a cubic bezier curve to the current subpath func (vmt *VertexMatrixTransform) CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y float64) { vmt.tr.Transform(&cx1, &cy1, &cx2, &cy2, &x, &y) diff --git a/pdf2d/vectorizer.go b/pdf2d/vectorizer.go index c7cc5a3..dda2312 100644 --- a/pdf2d/vectorizer.go +++ b/pdf2d/vectorizer.go @@ -4,6 +4,7 @@ package pdf2d // Vectorizer defines the minimal interface for gofpdf.Fpdf +// to be passed to a PathConvertor. // It is also implemented by for example VertexMatrixTransform type Vectorizer interface { // MoveTo creates a new subpath that start at the specified point From 0d629a4957c44660e3c8d5278de14de1f812640b Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 16:34:30 +0200 Subject: [PATCH 05/52] fix typo --- pdf2d/samples/android.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdf2d/samples/android.go b/pdf2d/samples/android.go index 91c8f56..47d563b 100644 --- a/pdf2d/samples/android.go +++ b/pdf2d/samples/android.go @@ -27,7 +27,7 @@ func main() { // Draw the droid DrawDroid(gc, 10, 10) - // Save to png + // Save to pdf pdf2d.SaveToPdfFile("android.pdf", pdf) } From 5d1b0f33156420d118496f25fe34c41ad08ae489 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 16:47:27 +0200 Subject: [PATCH 06/52] added an example as documentation and test --- pdf2d/graphiccontext_test.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 pdf2d/graphiccontext_test.go diff --git a/pdf2d/graphiccontext_test.go b/pdf2d/graphiccontext_test.go new file mode 100644 index 0000000..09a8cba --- /dev/null +++ b/pdf2d/graphiccontext_test.go @@ -0,0 +1,35 @@ +package pdf2d + +import ( + "fmt" + "image/color" + + "github.com/stanim/draw2d" + "github.com/stanim/gofpdf" +) + +func ExampleGraphicContext() { + // Initialize the graphic context on a pdf document + pdf := gofpdf.New("P", "mm", "A4", "../font") + pdf.AddPage() + gc := NewGraphicContext(pdf) + + // some properties + gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) + gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) + gc.SetLineCap(draw2d.RoundCap) + gc.SetLineWidth(5) + + // draw something + gc.MoveTo(10, 10) // should always be called for a new path + gc.LineTo(100, 50) + gc.QuadCurveTo(100, 10, 10, 10) + gc.Close() + gc.FillStroke() + fmt.Println(gc.LastPoint()) + + // pdf2d.SaveToPdfFile("example.pdf", pdf) + + // Output: + // 10 10 +} From d140c2646511bbfd6247122ebe14763049c4afb0 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 16:51:37 +0200 Subject: [PATCH 07/52] disable PathLogger --- pdf2d/graphiccontext.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index b53d532..e323439 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -159,9 +159,8 @@ var logger = log.New(os.Stdout, "", log.Lshortfile) // draw fills and/or strokes paths func (gc *GraphicContext) draw(style string, paths ...*draw2d.PathStorage) { paths = append(paths, gc.Current.Path) - pathConverter := NewPathConverter( - NewVertexMatrixTransform(gc.Current.Tr, - NewPathLogger(logger, gc.pdf))) + pathConverter := NewPathConverter(NewVertexMatrixTransform(gc.Current.Tr, gc.pdf)) + // pathConverter := NewPathConverter(NewVertexMatrixTransform(gc.Current.Tr,NewPathLogger(logger, gc.pdf))) pathConverter.Convert(paths...) if gc.Current.FillRule.UseNonZeroWinding() { style += "*" From 464bc2488b38b8d9b49db3fb4ea7c7322b5e655c Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 17:18:36 +0200 Subject: [PATCH 08/52] improved comment --- pdf2d/graphiccontext_test.go | 2 +- pdf2d/samples/{ => android}/android.go | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename pdf2d/samples/{ => android}/android.go (100%) diff --git a/pdf2d/graphiccontext_test.go b/pdf2d/graphiccontext_test.go index 09a8cba..e2ccabf 100644 --- a/pdf2d/graphiccontext_test.go +++ b/pdf2d/graphiccontext_test.go @@ -21,7 +21,7 @@ func ExampleGraphicContext() { gc.SetLineWidth(5) // draw something - gc.MoveTo(10, 10) // should always be called for a new path + gc.MoveTo(10, 10) // should always be called first for a new path gc.LineTo(100, 50) gc.QuadCurveTo(100, 10, 10, 10) gc.Close() diff --git a/pdf2d/samples/android.go b/pdf2d/samples/android/android.go similarity index 100% rename from pdf2d/samples/android.go rename to pdf2d/samples/android/android.go From 66b0d915465269b5cc00ce20090e87dc049e73df Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 17:19:08 +0200 Subject: [PATCH 09/52] move android in its own folder --- pdf2d/samples/android/android.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdf2d/samples/android/android.go b/pdf2d/samples/android/android.go index 47d563b..1af1769 100644 --- a/pdf2d/samples/android/android.go +++ b/pdf2d/samples/android/android.go @@ -1,5 +1,5 @@ // Copyright 2010 The draw2d Authors. All rights reserved. -// created: 21/11/2010 by Laurent Le Goff +// created: 21/11/2010 by Laurent Le Goff, Stani Michiels // Draw an android avatar to android.png package main From 7ffd99f6bd80ef3fc5725a04bb5d771ff853bf78 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 17:46:03 +0200 Subject: [PATCH 10/52] fix GraphicContext.DrawImage and use PNG as default format --- pdf2d/graphiccontext.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index e323439..2250015 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -9,7 +9,7 @@ import ( "fmt" "image" "image/color" - "image/jpeg" + "image/png" "log" "os" "strconv" @@ -70,17 +70,20 @@ func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { return &GraphicContext{draw2d.NewStackGraphicContext(), pdf, dpi} } -// DrawImage draws an image as JPG at 96dpi +// DrawImage draws an image as PNG +// TODO: add type (tp) as parameter to argument list? func (gc *GraphicContext) DrawImage(image image.Image) { name := strconv.Itoa(int(imageCount)) - tp := "JPG" // "JPG", "JPEG", "PNG" and "GIF" + tp := "PNG" // "JPG", "JPEG", "PNG" and "GIF" b := &bytes.Buffer{} - jpeg.Encode(b, image, nil) + png.Encode(b, image) gc.pdf.RegisterImageReader(name, tp, b) - gc.pdf.Image(name, 0, 0, 0, 0, false, tp, 0, "") - // bounds := image.Bounds() - // x, y, w, h := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Dx()), float64(bounds.Dy()) - //gc.pdf.Image(name, x, y, w, h, false, tp, 0, "") + bounds := image.Bounds() + //x0, y0, x1, y1 := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Dx()), float64(bounds.Dy()) + x0, y0, x1, y1 := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Max.X), float64(bounds.Max.Y) + tr := gc.Current.Tr + tr.TransformRectangle(&x0, &y0, &x1, &y1) + gc.pdf.Image(name, x0, y0, x1-x0, y1-y0, false, tp, 0, "") } // Clear draws a white rectangle over the whole page From 5a3d7085a2d60200157b611c0572d3f995858726 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 17:47:29 +0200 Subject: [PATCH 11/52] added working frame-image sample --- pdf2d/samples/frame-image/frame-image.go | 51 +++++++++++++++++++++++ pdf2d/samples/frame-image/gopher.png | Bin 0 -> 114063 bytes 2 files changed, 51 insertions(+) create mode 100644 pdf2d/samples/frame-image/frame-image.go create mode 100644 pdf2d/samples/frame-image/gopher.png diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go new file mode 100644 index 0000000..495fd75 --- /dev/null +++ b/pdf2d/samples/frame-image/frame-image.go @@ -0,0 +1,51 @@ +// Copyright 2010 The draw2d Authors. All rights reserved. +// created: 21/11/2010 by Laurent Le Goff, Stani Michiels + +// Load a png image and rotate it +package main + +import ( + "image/color" + "math" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" + "github.com/stanim/gofpdf" +) + +func main() { + // Margin between the image and the frame + const margin = 30 + // Line width od the frame + const lineWidth = 3 + + // Initialize the graphic context on an RGBA image + dest := gofpdf.New("P", "mm", "A4", "../font") + dest.AddPage() + // Size of destination image + dw, dh := dest.GetPageSize() + gc := pdf2d.NewGraphicContext(dest) + // Draw frame + gc.SetFillColor(color.RGBA{0xff, 0xff, 0xff, 0xff}) + draw2d.RoundRect(gc, lineWidth, lineWidth, dw-lineWidth, dh-lineWidth, 100, 100) + gc.SetLineWidth(lineWidth) + gc.FillStroke() + + // load the source image + source, err := draw2d.LoadFromPngFile("gopher.png") + if err != nil { + panic(err) + } + // Size of source image + sw, sh := float64(source.Bounds().Dx()), float64(source.Bounds().Dy()) + // Draw image to fit in the frame + // TODO Seems to have a transform bug here on draw image + scale := math.Min((dw-margin*2)/sw, (dh-margin*2)/sh) + gc.Translate(margin, margin) + gc.Scale(scale, scale) + + gc.DrawImage(source) + + // Save to pdf + pdf2d.SaveToPdfFile("frame-image.pdf", dest) +} diff --git a/pdf2d/samples/frame-image/gopher.png b/pdf2d/samples/frame-image/gopher.png new file mode 100644 index 0000000000000000000000000000000000000000..26b98931ab6f42d5892f22cba85f93b90ad9fc4c GIT binary patch literal 114063 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
  • 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

    *%7Sz>YQ%ervakfN8a(dlHZFTp{Uq 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�{g@0M|>Ic28Kegm}!Q{k}PaP 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≥_ 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 Date: Sat, 27 Jun 2015 17:55:01 +0200 Subject: [PATCH 12/52] moved line in frame-image --- pdf2d/samples/frame-image/frame-image.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go index 495fd75..a582de7 100644 --- a/pdf2d/samples/frame-image/frame-image.go +++ b/pdf2d/samples/frame-image/frame-image.go @@ -22,9 +22,9 @@ func main() { // Initialize the graphic context on an RGBA image dest := gofpdf.New("P", "mm", "A4", "../font") dest.AddPage() + gc := pdf2d.NewGraphicContext(dest) // Size of destination image dw, dh := dest.GetPageSize() - gc := pdf2d.NewGraphicContext(dest) // Draw frame gc.SetFillColor(color.RGBA{0xff, 0xff, 0xff, 0xff}) draw2d.RoundRect(gc, lineWidth, lineWidth, dw-lineWidth, dh-lineWidth, 100, 100) From 01150ac981233dacf6298f95671370f14c48ea93 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 17:55:34 +0200 Subject: [PATCH 13/52] add gopher sample --- pdf2d/samples/gopher/gopher.go | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 pdf2d/samples/gopher/gopher.go diff --git a/pdf2d/samples/gopher/gopher.go b/pdf2d/samples/gopher/gopher.go new file mode 100644 index 0000000..39bff1b --- /dev/null +++ b/pdf2d/samples/gopher/gopher.go @@ -0,0 +1,62 @@ +// Copyright 2010 The draw2d Authors. All rights reserved. +// created: 21/11/2010 by Laurent Le Goff, Stani Michiels + +// Draw a gopher avatar to gopher.png translating from this svg https://github.com/golang-samples/gopher-vector/ +package main + +import ( + "image/color" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" + "github.com/stanim/gofpdf" +) + +func main() { + // Initialize the graphic context on an RGBA image + dest := gofpdf.New("P", "mm", "A3", "../font") + dest.AddPage() + gc := pdf2d.NewGraphicContext(dest) + + // Draw a gopher + Gopher(gc, 48, 48, 240, 72) + + // Save to pdf + pdf2d.SaveToPdfFile("gopher.pdf", dest) +} + +// Gopher draw a gopher using a gc thanks to https://github.com/golang-samples/gopher-vector/ +func Gopher(gc draw2d.GraphicContext, x, y, w, h float64) { + // Initialize Stroke Attribute + gc.SetLineWidth(3) + gc.SetLineCap(draw2d.RoundCap) + gc.SetStrokeColor(color.Black) + + // Left hand + // + gc.SetFillColor(color.RGBA{0xF6, 0xD2, 0xA2, 0xff}) + gc.MoveTo(10.634, 300.493) + gc.RCubicCurveTo(0.764, 15.751, 16.499, 8.463, 23.626, 3.539) + gc.RCubicCurveTo(6.765, -4.675, 8.743, -0.789, 9.337, -10.015) + gc.RCubicCurveTo(0.389, -6.064, 1.088, -12.128, 0.744, -18.216) + gc.RCubicCurveTo(-10.23, -0.927, -21.357, 1.509, -29.744, 7.602) + gc.CubicCurveTo(10.277, 286.542, 2.177, 296.561, 10.634, 300.493) + gc.FillStroke() + + // + gc.MoveTo(10.634, 300.493) + gc.RCubicCurveTo(2.29, -0.852, 4.717, -1.457, 6.271, -3.528) + gc.Stroke() + + // Left Ear + // + gc.MoveTo(46.997, 112.853) + gc.CubicCurveTo(-13.3, 95.897, 31.536, 19.189, 79.956, 50.74) + gc.LineTo(46.997, 112.853) + gc.Close() + gc.Stroke() +} From 2905171a222373f6b4087bb2d74b97f0a1959046 Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 18:24:16 +0200 Subject: [PATCH 14/52] added a NewPdf constructor for convenience --- pdf2d/graphiccontext.go | 15 +++++++++----- pdf2d/samples/android/android.go | 26 ++++++++++-------------- pdf2d/samples/frame-image/frame-image.go | 6 ++---- pdf2d/samples/gopher/gopher.go | 4 +--- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 2250015..cbd6b3b 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -6,7 +6,6 @@ package pdf2d import ( "bytes" - "fmt" "image" "image/color" "image/png" @@ -27,10 +26,6 @@ var ( draw2d.SquareCap: "square"} ) -func notImplemented(method string) { - fmt.Printf("%s: not implemented\n", method) -} - const c255 = 255.0 / 65535.0 var ( @@ -38,11 +33,21 @@ var ( white color.Color = color.RGBA{255, 255, 255, 255} ) +// NewPdf creates a new pdf document with the draw2d fontfolder and +// already a page added. +func NewPdf(orientationStr, unitStr, sizeStr string) *gofpdf.Fpdf { + pdf := gofpdf.New(orientationStr, unitStr, sizeStr, draw2d.GetFontFolder()) + pdf.AddPage() + return pdf +} + +// rgb converts a color (used by draw2d) into 3 int (used by gofpdf) func rgb(c color.Color) (int, int, int) { r, g, b, _ := c.RGBA() return int(float64(r) * c255), int(float64(g) * c255), int(float64(b) * c255) } +// clearRect draws a white rectangle func clearRect(gc *GraphicContext, x1, y1, x2, y2 float64) { // save state f := gc.Current.FillColor diff --git a/pdf2d/samples/android/android.go b/pdf2d/samples/android/android.go index 1af1769..600e080 100644 --- a/pdf2d/samples/android/android.go +++ b/pdf2d/samples/android/android.go @@ -5,20 +5,17 @@ package main import ( - "fmt" "image/color" "math" "github.com/stanim/draw2d" "github.com/stanim/draw2d/pdf2d" - "github.com/stanim/gofpdf" ) func main() { // Initialize the graphic context on a pdf document - pdf := gofpdf.New("P", "mm", "A4", "../font") - pdf.AddPage() - gc := pdf2d.NewGraphicContext(pdf) + dest := pdf2d.NewPdf("P", "mm", "A4") + gc := pdf2d.NewGraphicContext(dest) // set the fill and stroke color of the droid gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) @@ -28,14 +25,14 @@ func main() { DrawDroid(gc, 10, 10) // Save to pdf - pdf2d.SaveToPdfFile("android.pdf", pdf) + pdf2d.SaveToPdfFile("android.pdf", dest) } func DrawDroid(gc draw2d.GraphicContext, x, y float64) { gc.SetLineCap(draw2d.RoundCap) gc.SetLineWidth(5) - fmt.Println("\nhead") + // head gc.MoveTo(x+30, y+70) gc.ArcTo(x+80, y+70, 50, 50, 180*(math.Pi/180), 180*(math.Pi/180)) gc.Close() @@ -46,34 +43,33 @@ func DrawDroid(gc draw2d.GraphicContext, x, y float64) { gc.LineTo(x+110, y+10) gc.Stroke() - fmt.Println("\nleft eye") + // left eye draw2d.Circle(gc, x+60, y+45, 5) gc.FillStroke() - fmt.Println("\nright eye") + // right eye draw2d.Circle(gc, x+100, y+45, 5) gc.FillStroke() - fmt.Println("\nbody") + // body draw2d.RoundRect(gc, x+30, y+75, x+30+100, y+75+90, 10, 10) gc.FillStroke() draw2d.Rect(gc, x+30, y+75, x+30+100, y+75+80) gc.FillStroke() - fmt.Println("\nleft arm") + // left arm draw2d.RoundRect(gc, x+5, y+80, x+5+20, y+80+70, 10, 10) gc.FillStroke() - fmt.Println("\nright arm") + // right arm draw2d.RoundRect(gc, x+135, y+80, x+135+20, y+80+70, 10, 10) gc.FillStroke() - fmt.Println("\nleft leg") + // left leg draw2d.RoundRect(gc, x+50, y+150, x+50+20, y+150+50, 10, 10) gc.FillStroke() - fmt.Println("\nright leg") + // right leg draw2d.RoundRect(gc, x+90, y+150, x+90+20, y+150+50, 10, 10) gc.FillStroke() - } diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go index a582de7..5956b6f 100644 --- a/pdf2d/samples/frame-image/frame-image.go +++ b/pdf2d/samples/frame-image/frame-image.go @@ -10,7 +10,6 @@ import ( "github.com/stanim/draw2d" "github.com/stanim/draw2d/pdf2d" - "github.com/stanim/gofpdf" ) func main() { @@ -19,9 +18,8 @@ func main() { // Line width od the frame const lineWidth = 3 - // Initialize the graphic context on an RGBA image - dest := gofpdf.New("P", "mm", "A4", "../font") - dest.AddPage() + // Initialize the graphic context on a pdf document + dest := pdf2d.NewPdf("P", "mm", "A3") gc := pdf2d.NewGraphicContext(dest) // Size of destination image dw, dh := dest.GetPageSize() diff --git a/pdf2d/samples/gopher/gopher.go b/pdf2d/samples/gopher/gopher.go index 39bff1b..cb6696c 100644 --- a/pdf2d/samples/gopher/gopher.go +++ b/pdf2d/samples/gopher/gopher.go @@ -9,13 +9,11 @@ import ( "github.com/stanim/draw2d" "github.com/stanim/draw2d/pdf2d" - "github.com/stanim/gofpdf" ) func main() { // Initialize the graphic context on an RGBA image - dest := gofpdf.New("P", "mm", "A3", "../font") - dest.AddPage() + dest := pdf2d.NewPdf("P", "mm", "A4") gc := pdf2d.NewGraphicContext(dest) // Draw a gopher From 13f1147b90293c045f6b8048a2fe4c10be389abb Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 18:33:15 +0200 Subject: [PATCH 15/52] set default fill color to white for NewPdf --- pdf2d/graphiccontext.go | 5 +++-- pdf2d/samples/frame-image/frame-image.go | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index cbd6b3b..1ded040 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -33,11 +33,12 @@ var ( white color.Color = color.RGBA{255, 255, 255, 255} ) -// NewPdf creates a new pdf document with the draw2d fontfolder and -// already a page added. +// NewPdf creates a new pdf document with the draw2d fontfolder, adds +// a page and set fill color to white. func NewPdf(orientationStr, unitStr, sizeStr string) *gofpdf.Fpdf { pdf := gofpdf.New(orientationStr, unitStr, sizeStr, draw2d.GetFontFolder()) pdf.AddPage() + pdf.SetFillColor(255, 255, 255) // to be compatible with draw2d return pdf } diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go index 5956b6f..9234e04 100644 --- a/pdf2d/samples/frame-image/frame-image.go +++ b/pdf2d/samples/frame-image/frame-image.go @@ -5,7 +5,6 @@ package main import ( - "image/color" "math" "github.com/stanim/draw2d" @@ -24,7 +23,6 @@ func main() { // Size of destination image dw, dh := dest.GetPageSize() // Draw frame - gc.SetFillColor(color.RGBA{0xff, 0xff, 0xff, 0xff}) draw2d.RoundRect(gc, lineWidth, lineWidth, dw-lineWidth, dh-lineWidth, 100, 100) gc.SetLineWidth(lineWidth) gc.FillStroke() From be91a632c9466a0f142e2c821de37d9653a35bfe Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 19:41:34 +0200 Subject: [PATCH 16/52] fixed the SetFontData method --- font.go | 6 +++--- pdf2d/graphiccontext.go | 29 +++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/font.go b/font.go index b02de34..e62ef28 100644 --- a/font.go +++ b/font.go @@ -38,7 +38,7 @@ type FontData struct { Style FontStyle } -func fontFileName(fontData FontData) string { +func FontFileName(fontData FontData) string { fontFileName := fontData.Name switch fontData.Family { case FontFamilySans: @@ -62,11 +62,11 @@ func fontFileName(fontData FontData) string { } func RegisterFont(fontData FontData, font *truetype.Font) { - fonts[fontFileName(fontData)] = font + fonts[FontFileName(fontData)] = font } func GetFont(fontData FontData) *truetype.Font { - fontFileName := fontFileName(fontData) + fontFileName := FontFileName(fontData) font := fonts[fontFileName] if font != nil { return font diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 1ded040..ec1ae28 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -191,12 +191,33 @@ func (gc *GraphicContext) SetFillColor(c color.Color) { gc.pdf.SetFillColor(rgb(c)) } -// SetFont sets the font used to draw text. +// SetFont is unsupported by the pdf graphic context, use SetFontData +// instead. +func (gc *GraphicContext) SetFont(font *truetype.Font) { + // TODO: what to do with this api conflict between draw2d and gofpdf?! +} + +// SetFontData sets the current font used to draw text. Always use +// this method, as SetFont is unsupported by the pdf graphic context. // It is mandatory to call this method at least once before printing // text or the resulting document will not be valid. -func (gc *GraphicContext) SetFont(font *truetype.Font) { - // TODO: this api conflict needs to be fixed - gc.pdf.SetFont("Helvetica", "", 12) +// It is necessary to generate a font definition file first with the +// makefont utility. It is not necessary to call this function for the +// core PDF fonts (courier, helvetica, times, zapfdingbats). +// go get github.com/jung-kurt/gofpdf/makefont +// http://godoc.org/github.com/jung-kurt/gofpdf#Fpdf.AddFont +func (gc *GraphicContext) SetFontData(fontData draw2d.FontData) { + gc.StackGraphicContext.SetFontData(fontData) + var style string + if fontData.Style&draw2d.FontStyleBold != 0 { + style += "B" + } + if fontData.Style&draw2d.FontStyleItalic != 0 { + style += "I" + } + fn := draw2d.FontFileName(fontData) + fn = fn[:len(fn)-4] + gc.pdf.AddFont(fn, style, fn+".json") } // SetFontSize sets the font size in points (as in ``a 12 point font''). From 244893c6abb5ab7cfff8fafde8bffcfb3138541e Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 19:42:59 +0200 Subject: [PATCH 17/52] added helloworld sample --- pdf2d/samples/helloworld/helloworld.go | 38 +++++++++++++++++++++++++ pdf2d/samples/helloworld/luximbi.json | 1 + pdf2d/samples/helloworld/luximbi.ttf | Bin 0 -> 69872 bytes 3 files changed, 39 insertions(+) create mode 100644 pdf2d/samples/helloworld/helloworld.go create mode 100644 pdf2d/samples/helloworld/luximbi.json create mode 100644 pdf2d/samples/helloworld/luximbi.ttf diff --git a/pdf2d/samples/helloworld/helloworld.go b/pdf2d/samples/helloworld/helloworld.go new file mode 100644 index 0000000..42263f4 --- /dev/null +++ b/pdf2d/samples/helloworld/helloworld.go @@ -0,0 +1,38 @@ +// Copyright 2010 The draw2d Authors. All rights reserved. +// created: 21/11/2010 by Laurent Le Goff, Stani Michiels + +// Display Hello world in a Rectangle save it to a png +package main + +import ( + "image" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" +) + +func main() { + // Set the global folder for searching fonts + // The pdf backend needs for every ttf file its corresponding json + // file which is generated by gofpdf/makefont. + draw2d.SetFontFolder(".") + + // Initialize the graphic context on a pdf document + dest := pdf2d.NewPdf("P", "mm", "A4") + gc := pdf2d.NewGraphicContext(dest) + + // Draw a rounded rectangle using default colors + draw2d.RoundRect(gc, 5, 5, 135, 95, 10, 10) + gc.FillStroke() + + // Set the font luximbi.ttf + gc.SetFontData(draw2d.FontData{"luxi", draw2d.FontFamilyMono, draw2d.FontStyleBold | draw2d.FontStyleItalic}) + // Set the fill text color to black + gc.SetFillColor(image.Black) + gc.SetFontSize(14) + // Display Hello World + gc.FillStringAt("Hello World", 8, 52) + + // Save to pdf + pdf2d.SaveToPdfFile("helloworld.pdf", dest) +} diff --git a/pdf2d/samples/helloworld/luximbi.json b/pdf2d/samples/helloworld/luximbi.json new file mode 100644 index 0000000..a03565e --- /dev/null +++ b/pdf2d/samples/helloworld/luximbi.json @@ -0,0 +1 @@ +{"Tp":"TrueType","Name":"LuxiMono-BoldOblique","Desc":{"Ascent":783,"Descent":-205,"CapHeight":783,"Flags":97,"FontBBox":{"Xmin":-29,"Ymin":-211,"Xmax":764,"Ymax":1012},"ItalicAngle":-8,"StemV":120,"MissingWidth":600},"Up":0,"Ut":0,"Cw":[600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,653,600,653,600,600,653,600,653,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600],"Enc":"cp1252","Diff":"","File":"","Size1":0,"Size2":0,"OriginalSize":0,"I":0,"N":0,"DiffN":0} \ No newline at end of file diff --git a/pdf2d/samples/helloworld/luximbi.ttf b/pdf2d/samples/helloworld/luximbi.ttf new file mode 100644 index 0000000000000000000000000000000000000000..734201bed16677bc6494af52a15b4c842bb60184 GIT binary patch literal 69872 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 z

    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 literal 0 HcmV?d00001 From 4d393c10352e20154b3cfb68d694398971eb558c Mon Sep 17 00:00:00 2001 From: Stani Date: Sat, 27 Jun 2015 20:06:06 +0200 Subject: [PATCH 18/52] add transformation to text and images --- pdf2d/graphiccontext.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index ec1ae28..8a6777a 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -79,6 +79,7 @@ func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { // DrawImage draws an image as PNG // TODO: add type (tp) as parameter to argument list? func (gc *GraphicContext) DrawImage(image image.Image) { + // TODO: fix rotation gc.Current.Tr name := strconv.Itoa(int(imageCount)) tp := "PNG" // "JPG", "JPEG", "PNG" and "GIF" b := &bytes.Buffer{} @@ -122,9 +123,13 @@ func (gc *GraphicContext) GetStringBounds(s string) (left, top, right, bottom fl // CreateStringPath creates a path from the string s at x, y, and returns the string width. func (gc *GraphicContext) CreateStringPath(text string, x, y float64) (cursor float64) { - gc.pdf.MoveTo(x, y) + // TODO: fix rotation of gc.Current.Tr _, _, w, h := gc.GetStringBounds(text) - gc.pdf.Cell(w, h, text) + x1, y1 := x+w, y+h + tr := gc.Current.Tr + tr.TransformRectangle(&x, &y, &x1, &y1) + gc.pdf.MoveTo(x, y) + gc.pdf.Cell(x1-x, y1-y, text) return w } @@ -138,12 +143,14 @@ func (gc *GraphicContext) FillStringAt(text string, x, y float64) (cursor float6 return gc.CreateStringPath(text, x, y) } -// StrokeString draws a string at 0, 0 +// StrokeString draws a string at 0, 0 (stroking is unsupported, +// string will be filled) func (gc *GraphicContext) StrokeString(text string) (cursor float64) { return gc.StrokeStringAt(text, 0, 0) } -// StrokeStringAt draws a string at x, y +// StrokeStringAt draws a string at x, y (stroking is unsupported, +// string will be filled) func (gc *GraphicContext) StrokeStringAt(text string, x, y float64) (cursor float64) { return gc.CreateStringPath(text, x, y) } From 458c46b28ca60c73c862c834089e31e5688813de Mon Sep 17 00:00:00 2001 From: Stani Date: Sun, 28 Jun 2015 01:41:06 +0200 Subject: [PATCH 19/52] add file for pdf2d package documentation --- pdf2d/doc.go | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 pdf2d/doc.go diff --git a/pdf2d/doc.go b/pdf2d/doc.go new file mode 100644 index 0000000..87a95ee --- /dev/null +++ b/pdf2d/doc.go @@ -0,0 +1,5 @@ +// Copyright 2015 The draw2d Authors. All rights reserved. +// created: 26/06/2015 by Stani Michiels + +// Package pdf2d provides a Graphic Context that can draw vector form on pdf file. +package pdf2d From b3bea4f206e01a8106d7dfbf9bb4b11f5c66d26d Mon Sep 17 00:00:00 2001 From: Stani Date: Mon, 29 Jun 2015 01:29:04 +0200 Subject: [PATCH 20/52] use pdf native transforms --- pdf2d/graphiccontext.go | 76 ++++++++++++++++++++---- pdf2d/samples/frame-image/frame-image.go | 2 + pdf2d/transform.go | 57 ------------------ 3 files changed, 65 insertions(+), 70 deletions(-) delete mode 100644 pdf2d/transform.go diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 8a6777a..d4848b4 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -10,6 +10,7 @@ import ( "image/color" "image/png" "log" + "math" "os" "strconv" @@ -79,18 +80,15 @@ func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { // DrawImage draws an image as PNG // TODO: add type (tp) as parameter to argument list? func (gc *GraphicContext) DrawImage(image image.Image) { - // TODO: fix rotation gc.Current.Tr name := strconv.Itoa(int(imageCount)) tp := "PNG" // "JPG", "JPEG", "PNG" and "GIF" b := &bytes.Buffer{} png.Encode(b, image) gc.pdf.RegisterImageReader(name, tp, b) bounds := image.Bounds() - //x0, y0, x1, y1 := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Dx()), float64(bounds.Dy()) - x0, y0, x1, y1 := float64(bounds.Min.X), float64(bounds.Min.Y), float64(bounds.Max.X), float64(bounds.Max.Y) - tr := gc.Current.Tr - tr.TransformRectangle(&x0, &y0, &x1, &y1) - gc.pdf.Image(name, x0, y0, x1-x0, y1-y0, false, tp, 0, "") + x0, y0 := float64(bounds.Min.X), float64(bounds.Min.Y) + w, h := float64(bounds.Dx()), float64(bounds.Dy()) + gc.pdf.Image(name, x0, y0, w, h, false, tp, 0, "") } // Clear draws a white rectangle over the whole page @@ -123,13 +121,9 @@ func (gc *GraphicContext) GetStringBounds(s string) (left, top, right, bottom fl // CreateStringPath creates a path from the string s at x, y, and returns the string width. func (gc *GraphicContext) CreateStringPath(text string, x, y float64) (cursor float64) { - // TODO: fix rotation of gc.Current.Tr _, _, w, h := gc.GetStringBounds(text) - x1, y1 := x+w, y+h - tr := gc.Current.Tr - tr.TransformRectangle(&x, &y, &x1, &y1) gc.pdf.MoveTo(x, y) - gc.pdf.Cell(x1-x, y1-y, text) + gc.pdf.Cell(w, h, text) return w } @@ -175,8 +169,8 @@ var logger = log.New(os.Stdout, "", log.Lshortfile) // draw fills and/or strokes paths func (gc *GraphicContext) draw(style string, paths ...*draw2d.PathStorage) { paths = append(paths, gc.Current.Path) - pathConverter := NewPathConverter(NewVertexMatrixTransform(gc.Current.Tr, gc.pdf)) - // pathConverter := NewPathConverter(NewVertexMatrixTransform(gc.Current.Tr,NewPathLogger(logger, gc.pdf))) + pathConverter := NewPathConverter(gc.pdf) + // pathConverter := NewPathConverter(NewPathLogger(logger, gc.pdf)) pathConverter.Convert(paths...) if gc.Current.FillRule.UseNonZeroWinding() { style += "*" @@ -245,3 +239,59 @@ func (gc *GraphicContext) SetLineCap(Cap draw2d.Cap) { gc.StackGraphicContext.SetLineCap(Cap) gc.pdf.SetLineCapStyle(caps[Cap]) } + +// Transformations + +// Scale generally scales the following text, drawings and images. +// sx and sy are the scaling factors for width and height. +// This must be placed between gc.Save() and gc.Restore(), otherwise +// the pdf is invalid. +func (gc *GraphicContext) Scale(sx, sy float64) { + gc.StackGraphicContext.Scale(sx, sy) + gc.pdf.TransformScale(sx*100, sy*100, 0, 0) +} + +// Rotate rotates the following text, drawings and images. +// Angle is specified in radians and measured clockwise from the +// 3 o'clock position. +// This must be placed between gc.Save() and gc.Restore(), otherwise +// the pdf is invalid. +func (gc *GraphicContext) Rotate(angle float64) { + gc.StackGraphicContext.Rotate(angle) + gc.pdf.TransformRotate(-angle*180/math.Pi, 0, 0) +} + +// Translate moves the following text, drawings and images +// horizontally and vertically by the amounts specified by tx and ty. +// This must be placed between gc.Save() and gc.Restore(), otherwise +// the pdf is invalid. +func (gc *GraphicContext) Translate(tx, ty float64) { + gc.StackGraphicContext.Translate(tx, ty) + gc.pdf.TransformTranslate(tx, ty) +} + +// Save saves the current context stack +// (transformation, font, color,...). +func (gc *GraphicContext) Save() { + gc.StackGraphicContext.Save() + gc.pdf.TransformBegin() +} + +// Restore restores the current context stack +// (transformation, color,...). Restoring the font is not supported. +func (gc *GraphicContext) Restore() { + gc.pdf.TransformEnd() + gc.StackGraphicContext.Restore() + c := gc.Current + gc.SetFontSize(c.FontSize) + // gc.SetFontData(c.FontData) unsupported, causes bug (do not enable) + gc.SetLineWidth(c.LineWidth) + gc.SetStrokeColor(c.StrokeColor) + gc.SetFillColor(c.FillColor) + gc.SetFillRule(c.FillRule) + // gc.SetLineDash(c.Dash, c.DashOffset) // TODO + gc.SetLineCap(c.Cap) + // gc.SetLineJoin(c.Join) // TODO + // c.Path unsupported + // c.Font unsupported +} diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go index 9234e04..728a88a 100644 --- a/pdf2d/samples/frame-image/frame-image.go +++ b/pdf2d/samples/frame-image/frame-image.go @@ -37,10 +37,12 @@ func main() { // Draw image to fit in the frame // TODO Seems to have a transform bug here on draw image scale := math.Min((dw-margin*2)/sw, (dh-margin*2)/sh) + gc.Save() gc.Translate(margin, margin) gc.Scale(scale, scale) gc.DrawImage(source) + gc.Restore() // Save to pdf pdf2d.SaveToPdfFile("frame-image.pdf", dest) diff --git a/pdf2d/transform.go b/pdf2d/transform.go deleted file mode 100644 index 6461aa6..0000000 --- a/pdf2d/transform.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 The draw2d Authors. All rights reserved. -// created: 26/06/2015 by Stani Michiels - -package pdf2d - -import "github.com/stanim/draw2d" - -// VertexMatrixTransform implements Vectorizer and applies the Matrix -// transformation tr. It is normally wrapped around gofpdf Fpdf -// or PathLogger. -type VertexMatrixTransform struct { - tr draw2d.MatrixTransform - Next Vectorizer -} - -// NewVertexMatrixTransform constructs an new VertexMatrixTransform -func NewVertexMatrixTransform(tr draw2d.MatrixTransform, - vectorizer Vectorizer) *VertexMatrixTransform { - return &VertexMatrixTransform{tr, vectorizer} -} - -// MoveTo creates a new subpath that start at the specified point -func (vmt *VertexMatrixTransform) MoveTo(x, y float64) { - vmt.tr.Transform(&x, &y) - vmt.Next.MoveTo(x, y) -} - -// LineTo adds a line to the current subpath -func (vmt *VertexMatrixTransform) LineTo(x, y float64) { - vmt.tr.Transform(&x, &y) - vmt.Next.LineTo(x, y) -} - -// CurveTo adds a quadratic bezier curve to the current subpath -func (vmt *VertexMatrixTransform) CurveTo(cx, cy, x, y float64) { - vmt.tr.Transform(&cx, &cy, &x, &y) - vmt.Next.CurveTo(cx, cy, x, y) - -} - -// CurveBezierCubicTo adds a cubic bezier curve to the current subpath -func (vmt *VertexMatrixTransform) CurveBezierCubicTo(cx1, cy1, - cx2, cy2, x, y float64) { - vmt.tr.Transform(&cx1, &cy1, &cx2, &cy2, &x, &y) - vmt.Next.CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y) -} - -// ArcTo adds an arc to the current subpath -func (vmt *VertexMatrixTransform) ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) { - vmt.tr.Transform(&x, &y) - vmt.Next.ArcTo(x, y, rx, ry, degRotate, degStart, degEnd) -} - -// ClosePath closes the subpath -func (vmt *VertexMatrixTransform) ClosePath() { - vmt.Next.ClosePath() -} From 6608ccca671bdab0b6d6782ed9f051d34a2de5b5 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 00:44:33 +0200 Subject: [PATCH 21/52] update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e71e995..a6b7610 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ **/*.exe **/*~ **/*.orig +**/*.out +**/*.test core _obj _test From 2f2bd1937a199c384dddcda127c39a216a80f2f3 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:06:53 +0200 Subject: [PATCH 22/52] - fix font size - make ContextStack Font and Scale public - make ContextStack.Scale float64, so it can also be used for pdf --- gc.go | 2 ++ image.go | 16 ++++++------- pdf2d/graphiccontext.go | 50 +++++++++++++++++++++++++++-------------- stack_gc.go | 8 +++---- 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/gc.go b/gc.go index 66dc508..8248cdc 100644 --- a/gc.go +++ b/gc.go @@ -15,6 +15,8 @@ const ( FillRuleWinding ) +type Sample func(gc GraphicContext, ext string) (string, error) + type GraphicContext interface { Path // Create a new path diff --git a/image.go b/image.go index 9f2ee20..c52bb0a 100644 --- a/image.go +++ b/image.go @@ -164,7 +164,7 @@ func (gc *ImageGraphicContext) drawContour(ps []truetype.Point, dx, dy float64) } func (gc *ImageGraphicContext) drawGlyph(glyph truetype.Index, dx, dy float64) error { - if err := gc.glyphBuf.Load(gc.Current.font, gc.Current.scale, glyph, truetype.NoHinting); err != nil { + if err := gc.glyphBuf.Load(gc.Current.Font, int32(gc.Current.Scale), glyph, truetype.NoHinting); err != nil { return err } e0 := 0 @@ -192,14 +192,14 @@ func (gc *ImageGraphicContext) CreateStringPath(s string, x, y float64) float64 for _, rune := range s { index := font.Index(rune) if hasPrev { - x += fUnitsToFloat64(font.Kerning(gc.Current.scale, prev, index)) + x += fUnitsToFloat64(font.Kerning(int32(gc.Current.Scale), prev, index)) } err := gc.drawGlyph(index, x, y) if err != nil { log.Println(err) return startx - x } - x += fUnitsToFloat64(font.HMetric(gc.Current.scale, index).AdvanceWidth) + x += fUnitsToFloat64(font.HMetric(int32(gc.Current.Scale), index).AdvanceWidth) prev, hasPrev = index, true } return x - startx @@ -221,9 +221,9 @@ func (gc *ImageGraphicContext) GetStringBounds(s string) (left, top, right, bott for _, rune := range s { index := font.Index(rune) if hasPrev { - cursor += fUnitsToFloat64(font.Kerning(gc.Current.scale, prev, index)) + cursor += fUnitsToFloat64(font.Kerning(int32(gc.Current.Scale), prev, index)) } - if err := gc.glyphBuf.Load(gc.Current.font, gc.Current.scale, index, truetype.NoHinting); err != nil { + if err := gc.glyphBuf.Load(gc.Current.Font, int32(gc.Current.Scale), index, truetype.NoHinting); err != nil { log.Println(err) return 0, 0, 0, 0 } @@ -238,7 +238,7 @@ func (gc *ImageGraphicContext) GetStringBounds(s string) (left, top, right, bott right = math.Max(right, x+cursor) } } - cursor += fUnitsToFloat64(font.HMetric(gc.Current.scale, index).AdvanceWidth) + cursor += fUnitsToFloat64(font.HMetric(int32(gc.Current.Scale), index).AdvanceWidth) prev, hasPrev = index, true } return left, top, right, bottom @@ -247,7 +247,7 @@ func (gc *ImageGraphicContext) GetStringBounds(s string) (left, top, right, bott // recalc recalculates scale and bounds values from the font size, screen // resolution and font metrics, and invalidates the glyph cache. func (gc *ImageGraphicContext) recalc() { - gc.Current.scale = int32(gc.Current.FontSize * float64(gc.DPI) * (64.0 / 72.0)) + int32(gc.Current.Scale) = int32(gc.Current.FontSize * float64(gc.DPI) * (64.0 / 72.0)) } // SetDPI sets the screen resolution in dots per inch. @@ -258,7 +258,7 @@ func (gc *ImageGraphicContext) SetDPI(dpi int) { // SetFont sets the font used to draw text. func (gc *ImageGraphicContext) SetFont(font *truetype.Font) { - gc.Current.font = font + gc.Current.Font = font } // SetFontSize sets the font size in points (as in ``a 12 point font''). diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index d4848b4..fa1a2df 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -12,6 +12,7 @@ import ( "log" "math" "os" + "path/filepath" "strconv" "code.google.com/p/freetype-go/freetype/truetype" @@ -20,16 +21,16 @@ import ( "github.com/stanim/gofpdf" ) +const ( + c255 = 255.0 / 65535.0 + DPI = 72 +) + var ( caps = map[draw2d.Cap]string{ draw2d.RoundCap: "round", draw2d.ButtCap: "butt", draw2d.SquareCap: "square"} -) - -const c255 = 255.0 / 65535.0 - -var ( imageCount uint32 white color.Color = color.RGBA{255, 255, 255, 255} ) @@ -73,8 +74,9 @@ type GraphicContext struct { // NewGraphicContext creates a new pdf GraphicContext func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { - dpi := 92 - return &GraphicContext{draw2d.NewStackGraphicContext(), pdf, dpi} + gc := &GraphicContext{draw2d.NewStackGraphicContext(), pdf, DPI} + gc.SetDPI(DPI) + return gc } // DrawImage draws an image as PNG @@ -102,13 +104,22 @@ func (gc *GraphicContext) ClearRect(x1, y1, x2, y2 int) { clearRect(gc, float64(x1), float64(y1), float64(x2), float64(y2)) } -// SetDPI is a dummy method to implement the GraphicContext interface -func (gc *GraphicContext) SetDPI(dpi int) { - gc.DPI = dpi - // gc.recalc() +// recalc recalculates scale and bounds values from the font size, screen +// resolution and font metrics, and invalidates the glyph cache. +func (gc *GraphicContext) recalc() { + // TODO: resolve properly the font size for pdf and bitmap + gc.Current.Scale = 3 * float64(gc.DPI) / 72 } -// GetDPI is a dummy method to implement the GraphicContext interface +// SetDPI sets the DPI which influences the font size. +func (gc *GraphicContext) SetDPI(dpi int) { + gc.DPI = dpi + gc.recalc() +} + +// GetDPI returns the DPI which influences the font size. +// (Note that gofpdf uses a fixed dpi of 72: +// https://godoc.org/code.google.com/p/gofpdf#Fpdf.PointConvert) func (gc *GraphicContext) GetDPI() int { return gc.DPI } @@ -122,8 +133,10 @@ func (gc *GraphicContext) GetStringBounds(s string) (left, top, right, bottom fl // CreateStringPath creates a path from the string s at x, y, and returns the string width. func (gc *GraphicContext) CreateStringPath(text string, x, y float64) (cursor float64) { _, _, w, h := gc.GetStringBounds(text) - gc.pdf.MoveTo(x, y) - gc.pdf.Cell(w, h, text) + margin := gc.pdf.GetCellMargin() + gc.pdf.MoveTo(x-margin, y+margin-0.82*h) + gc.pdf.CellFormat(w, h, text, "", 0, "BL", false, 0, "") + // gc.pdf.Cell(w, h, text) return w } @@ -208,6 +221,7 @@ func (gc *GraphicContext) SetFont(font *truetype.Font) { // go get github.com/jung-kurt/gofpdf/makefont // http://godoc.org/github.com/jung-kurt/gofpdf#Fpdf.AddFont func (gc *GraphicContext) SetFontData(fontData draw2d.FontData) { + // TODO: call Makefont embed if json file does not exist yet gc.StackGraphicContext.SetFontData(fontData) var style string if fontData.Style&draw2d.FontStyleBold != 0 { @@ -218,14 +232,16 @@ func (gc *GraphicContext) SetFontData(fontData draw2d.FontData) { } fn := draw2d.FontFileName(fontData) fn = fn[:len(fn)-4] - gc.pdf.AddFont(fn, style, fn+".json") + jfn := filepath.Join(draw2d.GetFontFolder(), fn+".json") + gc.pdf.AddFont(fn, style, jfn) } // SetFontSize sets the font size in points (as in ``a 12 point font''). +// TODO: resolve this with ImgGraphicContext (now done with gc.scale) func (gc *GraphicContext) SetFontSize(fontSize float64) { gc.StackGraphicContext.SetFontSize(fontSize) - gc.pdf.SetFontSize(fontSize) - //gc.recalc() + gc.recalc() + gc.pdf.SetFontSize(fontSize * gc.scale) } // SetLineWidth sets the line width diff --git a/stack_gc.go b/stack_gc.go index 3741328..c1ac309 100644 --- a/stack_gc.go +++ b/stack_gc.go @@ -28,10 +28,10 @@ type ContextStack struct { FontSize float64 FontData FontData - font *truetype.Font + Font *truetype.Font // fontSize and dpi are used to calculate scale. scale is the number of // 26.6 fixed point units in 1 em. - scale int32 + Scale float64 previous *ContextStack } @@ -193,8 +193,8 @@ func (gc *StackGraphicContext) Save() { context.Cap = gc.Current.Cap context.Join = gc.Current.Join context.Path = gc.Current.Path.Copy() - context.font = gc.Current.font - context.scale = gc.Current.scale + context.Font = gc.Current.Font + context.Scale = gc.Current.Scale copy(context.Tr[:], gc.Current.Tr[:]) context.previous = gc.Current gc.Current = context From a3866cec522e266a6b762b64c3f0388caccaba77 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:10:32 +0200 Subject: [PATCH 23/52] refactor ImgGraphicContext samples, so they can be used for test coverage --- samples_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 samples_test.go diff --git a/samples_test.go b/samples_test.go new file mode 100644 index 0000000..9eb56b6 --- /dev/null +++ b/samples_test.go @@ -0,0 +1,49 @@ +package draw2d_test + +import ( + "image" + "testing" + + "github.com/stanim/draw2d" + + "github.com/stanim/draw2d.samples" + "github.com/stanim/draw2d.samples/android" + "github.com/stanim/draw2d.samples/frameimage" + "github.com/stanim/draw2d.samples/gopher" + "github.com/stanim/draw2d.samples/helloworld" +) + +func test(t *testing.T, draw draw2d.Sample) { + // Initialize the graphic context on an RGBA image + dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) + gc := draw2d.NewGraphicContext(dest) + // Draw Android logo + fn, err := draw(gc, "png") + if err != nil { + t.Errorf("Drawing %q failed: %v", fn, err) + return + } + // Save to png + err = draw2d.SaveToPngFile(fn, dest) + if err != nil { + t.Errorf("Saving %q failed: %v", fn, err) + } +} + +func TestSampleAndroid(t *testing.T) { + test(t, android.Main) +} + +func TestSampleGopher(t *testing.T) { + test(t, gopher.Main) +} + +func TestSampleHelloWorld(t *testing.T) { + // Set the global folder for searching fonts + draw2d.SetFontFolder(samples.Dir("helloworld", "")) + test(t, helloworld.Main) +} + +func TestSampleFrameImage(t *testing.T) { + test(t, frameimage.Main) +} From 5e8829cc266118e1f65170c7b0dfcab343734dd3 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:11:20 +0200 Subject: [PATCH 24/52] refactor pdf2d.GraphicContext samples, so they can be used for test coverage --- pdf2d/samples_test.go | 51 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 pdf2d/samples_test.go diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go new file mode 100644 index 0000000..9772ef6 --- /dev/null +++ b/pdf2d/samples_test.go @@ -0,0 +1,51 @@ +package pdf2d_test + +import ( + "testing" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" + + "github.com/stanim/draw2d.samples" + "github.com/stanim/draw2d.samples/android" + "github.com/stanim/draw2d.samples/frameimage" + "github.com/stanim/draw2d.samples/gopher" + "github.com/stanim/draw2d.samples/helloworld" +) + +func test(t *testing.T, sample draw2d.Sample) { + // Initialize the graphic context on an RGBA image + dest := pdf2d.NewPdf("L", "mm", "A4") + gc := pdf2d.NewGraphicContext(dest) + // Draw Android logo + fn, err := sample(gc, "pdf") + if err != nil { + t.Errorf("Drawing %q failed: %v", fn, err) + return + } + // Save to png + err = pdf2d.SaveToPdfFile(fn, dest) + if err != nil { + t.Errorf("Saving %q failed: %v", fn, err) + } +} + +func TestSampleAndroid(t *testing.T) { + test(t, android.Main) +} + +func TestSampleGopher(t *testing.T) { + test(t, gopher.Main) +} + +func TestSampleHelloWorld(t *testing.T) { + // Set the global folder for searching fonts + // The pdf backend needs for every ttf file its corresponding json + // file which is generated by gofpdf/makefont. + draw2d.SetFontFolder(samples.Dir("helloworld", "../")) + test(t, helloworld.Main) +} + +func TestSampleFrameImage(t *testing.T) { + test(t, frameimage.Main) +} From 39bb5b6cf65a2c3dcc4819765023653ba0556d2a Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:28:00 +0200 Subject: [PATCH 25/52] removed samples folder --- pdf2d/samples/android/android.go | 75 ----------------------- pdf2d/samples/frame-image/frame-image.go | 49 --------------- pdf2d/samples/frame-image/gopher.png | Bin 114063 -> 0 bytes pdf2d/samples/gopher/gopher.go | 60 ------------------ pdf2d/samples/helloworld/helloworld.go | 38 ------------ pdf2d/samples/helloworld/luximbi.json | 1 - pdf2d/samples/helloworld/luximbi.ttf | Bin 69872 -> 0 bytes 7 files changed, 223 deletions(-) delete mode 100644 pdf2d/samples/android/android.go delete mode 100644 pdf2d/samples/frame-image/frame-image.go delete mode 100644 pdf2d/samples/frame-image/gopher.png delete mode 100644 pdf2d/samples/gopher/gopher.go delete mode 100644 pdf2d/samples/helloworld/helloworld.go delete mode 100644 pdf2d/samples/helloworld/luximbi.json delete mode 100644 pdf2d/samples/helloworld/luximbi.ttf diff --git a/pdf2d/samples/android/android.go b/pdf2d/samples/android/android.go deleted file mode 100644 index 600e080..0000000 --- a/pdf2d/samples/android/android.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2010 The draw2d Authors. All rights reserved. -// created: 21/11/2010 by Laurent Le Goff, Stani Michiels - -// Draw an android avatar to android.png -package main - -import ( - "image/color" - "math" - - "github.com/stanim/draw2d" - "github.com/stanim/draw2d/pdf2d" -) - -func main() { - // Initialize the graphic context on a pdf document - dest := pdf2d.NewPdf("P", "mm", "A4") - gc := pdf2d.NewGraphicContext(dest) - - // set the fill and stroke color of the droid - gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) - gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) - - // Draw the droid - DrawDroid(gc, 10, 10) - - // Save to pdf - pdf2d.SaveToPdfFile("android.pdf", dest) -} - -func DrawDroid(gc draw2d.GraphicContext, x, y float64) { - gc.SetLineCap(draw2d.RoundCap) - gc.SetLineWidth(5) - - // head - gc.MoveTo(x+30, y+70) - gc.ArcTo(x+80, y+70, 50, 50, 180*(math.Pi/180), 180*(math.Pi/180)) - gc.Close() - gc.FillStroke() - gc.MoveTo(x+60, y+25) - gc.LineTo(x+50, y+10) - gc.MoveTo(x+100, y+25) - gc.LineTo(x+110, y+10) - gc.Stroke() - - // left eye - draw2d.Circle(gc, x+60, y+45, 5) - gc.FillStroke() - - // right eye - draw2d.Circle(gc, x+100, y+45, 5) - gc.FillStroke() - - // body - draw2d.RoundRect(gc, x+30, y+75, x+30+100, y+75+90, 10, 10) - gc.FillStroke() - draw2d.Rect(gc, x+30, y+75, x+30+100, y+75+80) - gc.FillStroke() - - // left arm - draw2d.RoundRect(gc, x+5, y+80, x+5+20, y+80+70, 10, 10) - gc.FillStroke() - - // right arm - draw2d.RoundRect(gc, x+135, y+80, x+135+20, y+80+70, 10, 10) - gc.FillStroke() - - // left leg - draw2d.RoundRect(gc, x+50, y+150, x+50+20, y+150+50, 10, 10) - gc.FillStroke() - - // right leg - draw2d.RoundRect(gc, x+90, y+150, x+90+20, y+150+50, 10, 10) - gc.FillStroke() -} diff --git a/pdf2d/samples/frame-image/frame-image.go b/pdf2d/samples/frame-image/frame-image.go deleted file mode 100644 index 728a88a..0000000 --- a/pdf2d/samples/frame-image/frame-image.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2010 The draw2d Authors. All rights reserved. -// created: 21/11/2010 by Laurent Le Goff, Stani Michiels - -// Load a png image and rotate it -package main - -import ( - "math" - - "github.com/stanim/draw2d" - "github.com/stanim/draw2d/pdf2d" -) - -func main() { - // Margin between the image and the frame - const margin = 30 - // Line width od the frame - const lineWidth = 3 - - // Initialize the graphic context on a pdf document - dest := pdf2d.NewPdf("P", "mm", "A3") - gc := pdf2d.NewGraphicContext(dest) - // Size of destination image - dw, dh := dest.GetPageSize() - // Draw frame - draw2d.RoundRect(gc, lineWidth, lineWidth, dw-lineWidth, dh-lineWidth, 100, 100) - gc.SetLineWidth(lineWidth) - gc.FillStroke() - - // load the source image - source, err := draw2d.LoadFromPngFile("gopher.png") - if err != nil { - panic(err) - } - // Size of source image - sw, sh := float64(source.Bounds().Dx()), float64(source.Bounds().Dy()) - // Draw image to fit in the frame - // TODO Seems to have a transform bug here on draw image - scale := math.Min((dw-margin*2)/sw, (dh-margin*2)/sh) - gc.Save() - gc.Translate(margin, margin) - gc.Scale(scale, scale) - - gc.DrawImage(source) - gc.Restore() - - // Save to pdf - pdf2d.SaveToPdfFile("frame-image.pdf", dest) -} diff --git a/pdf2d/samples/frame-image/gopher.png b/pdf2d/samples/frame-image/gopher.png deleted file mode 100644 index 26b98931ab6f42d5892f22cba85f93b90ad9fc4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114063 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
  • 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 From 0acdcf4fffdc2755a5b81d3a55db6b397eb11b0c Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:36:27 +0200 Subject: [PATCH 26/52] fix recalc --- image.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image.go b/image.go index c52bb0a..9e50d32 100644 --- a/image.go +++ b/image.go @@ -247,7 +247,7 @@ func (gc *ImageGraphicContext) GetStringBounds(s string) (left, top, right, bott // recalc recalculates scale and bounds values from the font size, screen // resolution and font metrics, and invalidates the glyph cache. func (gc *ImageGraphicContext) recalc() { - int32(gc.Current.Scale) = int32(gc.Current.FontSize * float64(gc.DPI) * (64.0 / 72.0)) + gc.Current.Scale = gc.Current.FontSize * float64(gc.DPI) * (64.0 / 72.0) } // SetDPI sets the screen resolution in dots per inch. From 225f790d4084401a9c930d36ee8ed9af478489b9 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:37:19 +0200 Subject: [PATCH 27/52] replace gc.scale with gc.Current.Scale --- pdf2d/graphiccontext.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index fa1a2df..66fa6cc 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -237,11 +237,11 @@ func (gc *GraphicContext) SetFontData(fontData draw2d.FontData) { } // SetFontSize sets the font size in points (as in ``a 12 point font''). -// TODO: resolve this with ImgGraphicContext (now done with gc.scale) +// TODO: resolve this with ImgGraphicContext (now done with gc.Current.Scale) func (gc *GraphicContext) SetFontSize(fontSize float64) { gc.StackGraphicContext.SetFontSize(fontSize) gc.recalc() - gc.pdf.SetFontSize(fontSize * gc.scale) + gc.pdf.SetFontSize(fontSize * gc.Current.Scale) } // SetLineWidth sets the line width From 0144ae516b135befe7412c4df7463c1f0259d9ef Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 01:39:01 +0200 Subject: [PATCH 28/52] added docstring to package draw2d_test --- samples_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples_test.go b/samples_test.go index 9eb56b6..cf8bf78 100644 --- a/samples_test.go +++ b/samples_test.go @@ -1,3 +1,5 @@ +// Package draw2d_test gives test coverage with the command: +// go test -cover ./... | grep -v "no test" package draw2d_test import ( From 71c1aba4fe34ce97fc9ea7523d747f3a590016bc Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 10:34:23 +0200 Subject: [PATCH 29/52] separate out test function and refactor line sample --- pdf2d/samples_test.go | 26 +++++++------------------- pdf2d/test_test.go | 28 ++++++++++++++++++++++++++++ samples_test.go | 28 +++++++--------------------- test_test.go | 27 +++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 pdf2d/test_test.go create mode 100644 test_test.go diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go index 9772ef6..302c78e 100644 --- a/pdf2d/samples_test.go +++ b/pdf2d/samples_test.go @@ -1,35 +1,19 @@ +// See also test_test.go + package pdf2d_test import ( "testing" "github.com/stanim/draw2d" - "github.com/stanim/draw2d/pdf2d" - "github.com/stanim/draw2d.samples" "github.com/stanim/draw2d.samples/android" "github.com/stanim/draw2d.samples/frameimage" "github.com/stanim/draw2d.samples/gopher" "github.com/stanim/draw2d.samples/helloworld" + "github.com/stanim/draw2d.samples/line" ) -func test(t *testing.T, sample draw2d.Sample) { - // Initialize the graphic context on an RGBA image - dest := pdf2d.NewPdf("L", "mm", "A4") - gc := pdf2d.NewGraphicContext(dest) - // Draw Android logo - fn, err := sample(gc, "pdf") - if err != nil { - t.Errorf("Drawing %q failed: %v", fn, err) - return - } - // Save to png - err = pdf2d.SaveToPdfFile(fn, dest) - if err != nil { - t.Errorf("Saving %q failed: %v", fn, err) - } -} - func TestSampleAndroid(t *testing.T) { test(t, android.Main) } @@ -49,3 +33,7 @@ func TestSampleHelloWorld(t *testing.T) { func TestSampleFrameImage(t *testing.T) { test(t, frameimage.Main) } + +func TestSampleLine(t *testing.T) { + test(t, line.Main) +} diff --git a/pdf2d/test_test.go b/pdf2d/test_test.go new file mode 100644 index 0000000..609cd35 --- /dev/null +++ b/pdf2d/test_test.go @@ -0,0 +1,28 @@ +// Package pdf2d_test gives test coverage with the command: +// go test -cover ./... | grep -v "no test" +// (It should be run from its parent draw2d directory.) +package pdf2d_test + +import ( + "testing" + + "github.com/stanim/draw2d" + "github.com/stanim/draw2d/pdf2d" +) + +func test(t *testing.T, sample draw2d.Sample) { + // Initialize the graphic context on an pdf document + dest := pdf2d.NewPdf("L", "mm", "A4") + gc := pdf2d.NewGraphicContext(dest) + // Draw Android logo + fn, err := sample(gc, "pdf") + if err != nil { + t.Errorf("Drawing %q failed: %v", fn, err) + return + } + // Save to png + err = pdf2d.SaveToPdfFile(fn, dest) + if err != nil { + t.Errorf("Saving %q failed: %v", fn, err) + } +} diff --git a/samples_test.go b/samples_test.go index cf8bf78..ae68c14 100644 --- a/samples_test.go +++ b/samples_test.go @@ -1,37 +1,19 @@ -// Package draw2d_test gives test coverage with the command: -// go test -cover ./... | grep -v "no test" +// See also test_test.go + package draw2d_test import ( - "image" "testing" "github.com/stanim/draw2d" - "github.com/stanim/draw2d.samples" "github.com/stanim/draw2d.samples/android" "github.com/stanim/draw2d.samples/frameimage" "github.com/stanim/draw2d.samples/gopher" "github.com/stanim/draw2d.samples/helloworld" + "github.com/stanim/draw2d.samples/line" ) -func test(t *testing.T, draw draw2d.Sample) { - // Initialize the graphic context on an RGBA image - dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) - gc := draw2d.NewGraphicContext(dest) - // Draw Android logo - fn, err := draw(gc, "png") - if err != nil { - t.Errorf("Drawing %q failed: %v", fn, err) - return - } - // Save to png - err = draw2d.SaveToPngFile(fn, dest) - if err != nil { - t.Errorf("Saving %q failed: %v", fn, err) - } -} - func TestSampleAndroid(t *testing.T) { test(t, android.Main) } @@ -49,3 +31,7 @@ func TestSampleHelloWorld(t *testing.T) { func TestSampleFrameImage(t *testing.T) { test(t, frameimage.Main) } + +func TestSampleLine(t *testing.T) { + test(t, line.Main) +} diff --git a/test_test.go b/test_test.go new file mode 100644 index 0000000..8d6d674 --- /dev/null +++ b/test_test.go @@ -0,0 +1,27 @@ +// Package draw2d_test gives test coverage with the command: +// go test -cover ./... | grep -v "no test" +package draw2d_test + +import ( + "image" + "testing" + + "github.com/stanim/draw2d" +) + +func test(t *testing.T, draw draw2d.Sample) { + // Initialize the graphic context on an RGBA image + dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) + gc := draw2d.NewGraphicContext(dest) + // Draw Android logo + fn, err := draw(gc, "png") + if err != nil { + t.Errorf("Drawing %q failed: %v", fn, err) + return + } + // Save to png + err = draw2d.SaveToPngFile(fn, dest) + if err != nil { + t.Errorf("Saving %q failed: %v", fn, err) + } +} From f6e57f4712161b04ed675acb61973ca422c292be Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 14:13:54 +0200 Subject: [PATCH 30/52] let fill color define text color for pdf and implement SetLineJoin --- pdf2d/graphiccontext.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 66fa6cc..e7b3453 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -31,6 +31,11 @@ var ( draw2d.RoundCap: "round", draw2d.ButtCap: "butt", draw2d.SquareCap: "square"} + joins = map[draw2d.Join]string{ + draw2d.RoundJoin: "round", + draw2d.BevelJoin: "bevel", + draw2d.MiterJoin: "miter", + } imageCount uint32 white color.Color = color.RGBA{255, 255, 255, 255} ) @@ -199,10 +204,11 @@ func (gc *GraphicContext) SetStrokeColor(c color.Color) { gc.pdf.SetDrawColor(rgb(c)) } -// SetFillColor sets the fill color +// SetFillColor sets the fill and text color func (gc *GraphicContext) SetFillColor(c color.Color) { gc.StackGraphicContext.SetFillColor(c) gc.pdf.SetFillColor(rgb(c)) + gc.pdf.SetTextColor(rgb(c)) } // SetFont is unsupported by the pdf graphic context, use SetFontData @@ -256,6 +262,12 @@ func (gc *GraphicContext) SetLineCap(Cap draw2d.Cap) { gc.pdf.SetLineCapStyle(caps[Cap]) } +// SetLineJoin sets the line cap (round, bevel or miter) +func (gc *GraphicContext) SetLineJoin(Join draw2d.Join) { + gc.StackGraphicContext.SetLineJoin(Join) + gc.pdf.SetLineJoinStyle(joins[Join]) +} + // Transformations // Scale generally scales the following text, drawings and images. @@ -307,7 +319,7 @@ func (gc *GraphicContext) Restore() { gc.SetFillRule(c.FillRule) // gc.SetLineDash(c.Dash, c.DashOffset) // TODO gc.SetLineCap(c.Cap) - // gc.SetLineJoin(c.Join) // TODO + gc.SetLineJoin(c.Join) // c.Path unsupported // c.Font unsupported } From 19b20e1fba68966ba6f5af8aa1d976e531010d57 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 14:44:01 +0200 Subject: [PATCH 31/52] skip overwriting pdfs during tests --- pdf2d/test_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pdf2d/test_test.go b/pdf2d/test_test.go index 609cd35..7435e39 100644 --- a/pdf2d/test_test.go +++ b/pdf2d/test_test.go @@ -4,6 +4,7 @@ package pdf2d_test import ( + "os" "testing" "github.com/stanim/draw2d" @@ -20,7 +21,11 @@ func test(t *testing.T, sample draw2d.Sample) { t.Errorf("Drawing %q failed: %v", fn, err) return } - // Save to png + // Save to pdf only if it doesn't exist because of git + if _, err = os.Stat(fn); err == nil { + t.Skipf("Saving %q skipped, as it exists already. (Git would consider it modified.)", fn) + return + } err = pdf2d.SaveToPdfFile(fn, dest) if err != nil { t.Errorf("Saving %q failed: %v", fn, err) From 8e69b2d8d6ee768310deb4dc73fc39770ae93bd5 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 14:44:51 +0200 Subject: [PATCH 32/52] add linecapsjoin sample test --- pdf2d/samples_test.go | 5 +++++ samples_test.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go index 302c78e..77f0d44 100644 --- a/pdf2d/samples_test.go +++ b/pdf2d/samples_test.go @@ -12,6 +12,7 @@ import ( "github.com/stanim/draw2d.samples/gopher" "github.com/stanim/draw2d.samples/helloworld" "github.com/stanim/draw2d.samples/line" + "github.com/stanim/draw2d.samples/linecapjoin" ) func TestSampleAndroid(t *testing.T) { @@ -37,3 +38,7 @@ func TestSampleFrameImage(t *testing.T) { func TestSampleLine(t *testing.T) { test(t, line.Main) } + +func TestSampleLineCap(t *testing.T) { + test(t, linecapjoin.Main) +} diff --git a/samples_test.go b/samples_test.go index ae68c14..4b3d749 100644 --- a/samples_test.go +++ b/samples_test.go @@ -12,6 +12,7 @@ import ( "github.com/stanim/draw2d.samples/gopher" "github.com/stanim/draw2d.samples/helloworld" "github.com/stanim/draw2d.samples/line" + "github.com/stanim/draw2d.samples/linecapjoin" ) func TestSampleAndroid(t *testing.T) { @@ -35,3 +36,7 @@ func TestSampleFrameImage(t *testing.T) { func TestSampleLine(t *testing.T) { test(t, line.Main) } + +func TestSampleLineCap(t *testing.T) { + test(t, linecapjoin.Main) +} From a861276f40ded4adae296e3f42ae77efbdb7a0f7 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 15:15:37 +0200 Subject: [PATCH 33/52] add postscript sample test --- pdf2d/samples_test.go | 5 +++++ samples_test.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go index 77f0d44..8d4f061 100644 --- a/pdf2d/samples_test.go +++ b/pdf2d/samples_test.go @@ -13,6 +13,7 @@ import ( "github.com/stanim/draw2d.samples/helloworld" "github.com/stanim/draw2d.samples/line" "github.com/stanim/draw2d.samples/linecapjoin" + "github.com/stanim/draw2d.samples/postscript" ) func TestSampleAndroid(t *testing.T) { @@ -42,3 +43,7 @@ func TestSampleLine(t *testing.T) { func TestSampleLineCap(t *testing.T) { test(t, linecapjoin.Main) } + +func TestSamplePostscript(t *testing.T) { + test(t, postscript.Main) +} diff --git a/samples_test.go b/samples_test.go index 4b3d749..39ac563 100644 --- a/samples_test.go +++ b/samples_test.go @@ -13,6 +13,7 @@ import ( "github.com/stanim/draw2d.samples/helloworld" "github.com/stanim/draw2d.samples/line" "github.com/stanim/draw2d.samples/linecapjoin" + "github.com/stanim/draw2d.samples/postscript" ) func TestSampleAndroid(t *testing.T) { @@ -40,3 +41,7 @@ func TestSampleLine(t *testing.T) { func TestSampleLineCap(t *testing.T) { test(t, linecapjoin.Main) } + +func TestSamplePostscript(t *testing.T) { + test(t, postscript.Main) +} From 99dce0226339699ffa8ff5bd7682de40e08d9118 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 15:37:27 +0200 Subject: [PATCH 34/52] remove path_logger --- pdf2d/path_logger.go | 72 -------------------------------------------- 1 file changed, 72 deletions(-) delete mode 100644 pdf2d/path_logger.go diff --git a/pdf2d/path_logger.go b/pdf2d/path_logger.go deleted file mode 100644 index c87ea3b..0000000 --- a/pdf2d/path_logger.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2015 The draw2d Authors. All rights reserved. -// created: 26/06/2015 by Stani Michiels - -package pdf2d - -import ( - "bytes" - "log" - "strconv" -) - -func ftoas(xs ...float64) string { - var buffer bytes.Buffer - for i, x := range xs { - if i > 0 { - buffer.WriteString(", ") - } - buffer.WriteString(strconv.FormatFloat(x, 'f', 2, 64)) - } - return buffer.String() -} - -// PathLogger implements Vectorizer and applies the Matrix -// transformation tr. It is used as debugging middleware. -// It should wrap gofpdf.Fpdf directly. -type PathLogger struct { - logger *log.Logger - Next Vectorizer -} - -// NewPathLogger constructs a new PathLogger -func NewPathLogger(logger *log.Logger, - vectorizer Vectorizer) *PathLogger { - return &PathLogger{logger, vectorizer} -} - -// MoveTo creates a new subpath that start at the specified point -func (pl *PathLogger) MoveTo(x, y float64) { - pl.logger.Printf("MoveTo(x=%.2f, y=%.2f)", x, y) - pl.Next.MoveTo(x, y) -} - -// LineTo adds a line to the current subpath -func (pl *PathLogger) LineTo(x, y float64) { - pl.logger.Printf("LineTo(x=%.2f, y=%.2f)", x, y) - pl.Next.LineTo(x, y) -} - -// CurveTo adds a quadratic bezier curve to the current subpath -func (pl *PathLogger) CurveTo(cx, cy, x, y float64) { - pl.logger.Printf("CurveTo(cx=%.2f, cy=%.2f, x=%.2f, y=%.2f)", cx, cy, x, y) - pl.Next.CurveTo(cx, cy, x, y) - -} - -// CurveBezierCubicTo adds a cubic bezier curve to the current subpath -func (pl *PathLogger) CurveBezierCubicTo(cx1, cy1, - cx2, cy2, x, y float64) { - pl.logger.Printf("CurveBezierCubicTo(cx1=%.2f, cy1=%.2f, cx2=%.2f, cy2=%.2f, x=%.2f, y=%.2f)", cx1, cy1, cx2, cy2, x, y) - pl.Next.CurveBezierCubicTo(cx1, cy1, cx2, cy2, x, y) -} - -// ArcTo adds an arc to the current subpath -func (pl *PathLogger) ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) { - pl.logger.Printf("ArcTo(x=%.2f, y=%.2f, rx=%.2f, ry=%.2f, degRotate=%.2f, degStart=%.2f, degEnd=%.2f)", x, y, rx, ry, degRotate, degStart, degEnd) - pl.Next.ArcTo(x, y, rx, ry, degRotate, degStart, degEnd) -} - -// ClosePath closes the subpath -func (pl *PathLogger) ClosePath() { - pl.Next.ClosePath() -} From 4262ff5718cefa006f27ab5d234b84481a6a249f Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 15:38:14 +0200 Subject: [PATCH 35/52] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a6b7610..2736c60 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ _test* **/*.dll **/core*[0-9] +.private From 1841a3e90ffccf20eac42477d937018e12bc64f9 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 17:13:33 +0200 Subject: [PATCH 36/52] golint fix --- pdf2d/graphiccontext.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index e7b3453..edb2e04 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -23,7 +23,8 @@ import ( const ( c255 = 255.0 / 65535.0 - DPI = 72 + // DPI of a pdf document is fixed at 72. + DPI = 72 ) var ( From 8ca9a0bbe337bbde73e59e79b98dbdeebb93f281 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 1 Jul 2015 20:27:41 +0200 Subject: [PATCH 37/52] fix comment --- pdf2d/test_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdf2d/test_test.go b/pdf2d/test_test.go index 7435e39..a16382d 100644 --- a/pdf2d/test_test.go +++ b/pdf2d/test_test.go @@ -15,7 +15,7 @@ func test(t *testing.T, sample draw2d.Sample) { // Initialize the graphic context on an pdf document dest := pdf2d.NewPdf("L", "mm", "A4") gc := pdf2d.NewGraphicContext(dest) - // Draw Android logo + // Draw sample fn, err := sample(gc, "pdf") if err != nil { t.Errorf("Drawing %q failed: %v", fn, err) From 96e73eab52262379811a9275378eabe9e905077a Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 00:07:44 +0200 Subject: [PATCH 38/52] updated repository names --- pdf2d/fileutil.go | 2 +- pdf2d/graphiccontext.go | 4 ++-- pdf2d/graphiccontext_test.go | 4 ++-- pdf2d/path_converter.go | 2 +- pdf2d/samples_test.go | 18 +++++++++--------- pdf2d/test_test.go | 4 ++-- samples_test.go | 18 +++++++++--------- test_test.go | 2 +- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pdf2d/fileutil.go b/pdf2d/fileutil.go index 876dae3..4e4fcfd 100644 --- a/pdf2d/fileutil.go +++ b/pdf2d/fileutil.go @@ -1,6 +1,6 @@ package pdf2d -import "github.com/stanim/gofpdf" +import "github.com/jung-kurt/gofpdf" // SaveToPdfFile creates and saves a pdf document to a file func SaveToPdfFile(filePath string, pdf *gofpdf.Fpdf) error { diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index edb2e04..1b4c7b5 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -17,8 +17,8 @@ import ( "code.google.com/p/freetype-go/freetype/truetype" - "github.com/stanim/draw2d" - "github.com/stanim/gofpdf" + "github.com/llgcode/draw2d" + "github.com/jung-kurt/gofpdf" ) const ( diff --git a/pdf2d/graphiccontext_test.go b/pdf2d/graphiccontext_test.go index e2ccabf..3aa1539 100644 --- a/pdf2d/graphiccontext_test.go +++ b/pdf2d/graphiccontext_test.go @@ -4,8 +4,8 @@ import ( "fmt" "image/color" - "github.com/stanim/draw2d" - "github.com/stanim/gofpdf" + "github.com/llgcode/draw2d" + "github.com/jung-kurt/gofpdf" ) func ExampleGraphicContext() { diff --git a/pdf2d/path_converter.go b/pdf2d/path_converter.go index 65213f2..662d72b 100644 --- a/pdf2d/path_converter.go +++ b/pdf2d/path_converter.go @@ -6,7 +6,7 @@ package pdf2d import ( "math" - "github.com/stanim/draw2d" + "github.com/llgcode/draw2d" ) const deg = 180 / math.Pi diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go index 8d4f061..4a6a6f3 100644 --- a/pdf2d/samples_test.go +++ b/pdf2d/samples_test.go @@ -5,15 +5,15 @@ package pdf2d_test import ( "testing" - "github.com/stanim/draw2d" - "github.com/stanim/draw2d.samples" - "github.com/stanim/draw2d.samples/android" - "github.com/stanim/draw2d.samples/frameimage" - "github.com/stanim/draw2d.samples/gopher" - "github.com/stanim/draw2d.samples/helloworld" - "github.com/stanim/draw2d.samples/line" - "github.com/stanim/draw2d.samples/linecapjoin" - "github.com/stanim/draw2d.samples/postscript" + "github.com/llgcode/draw2d" + "github.com/llgcode/draw2d.samples" + "github.com/llgcode/draw2d.samples/android" + "github.com/llgcode/draw2d.samples/frameimage" + "github.com/llgcode/draw2d.samples/gopher" + "github.com/llgcode/draw2d.samples/helloworld" + "github.com/llgcode/draw2d.samples/line" + "github.com/llgcode/draw2d.samples/linecapjoin" + "github.com/llgcode/draw2d.samples/postscript" ) func TestSampleAndroid(t *testing.T) { diff --git a/pdf2d/test_test.go b/pdf2d/test_test.go index a16382d..d8a9364 100644 --- a/pdf2d/test_test.go +++ b/pdf2d/test_test.go @@ -7,8 +7,8 @@ import ( "os" "testing" - "github.com/stanim/draw2d" - "github.com/stanim/draw2d/pdf2d" + "github.com/llgcode/draw2d" + "github.com/llgcode/draw2d/pdf2d" ) func test(t *testing.T, sample draw2d.Sample) { diff --git a/samples_test.go b/samples_test.go index 39ac563..2d49caf 100644 --- a/samples_test.go +++ b/samples_test.go @@ -5,15 +5,15 @@ package draw2d_test import ( "testing" - "github.com/stanim/draw2d" - "github.com/stanim/draw2d.samples" - "github.com/stanim/draw2d.samples/android" - "github.com/stanim/draw2d.samples/frameimage" - "github.com/stanim/draw2d.samples/gopher" - "github.com/stanim/draw2d.samples/helloworld" - "github.com/stanim/draw2d.samples/line" - "github.com/stanim/draw2d.samples/linecapjoin" - "github.com/stanim/draw2d.samples/postscript" + "github.com/llgcode/draw2d" + "github.com/llgcode/draw2d.samples" + "github.com/llgcode/draw2d.samples/android" + "github.com/llgcode/draw2d.samples/frameimage" + "github.com/llgcode/draw2d.samples/gopher" + "github.com/llgcode/draw2d.samples/helloworld" + "github.com/llgcode/draw2d.samples/line" + "github.com/llgcode/draw2d.samples/linecapjoin" + "github.com/llgcode/draw2d.samples/postscript" ) func TestSampleAndroid(t *testing.T) { diff --git a/test_test.go b/test_test.go index 8d6d674..33cbfac 100644 --- a/test_test.go +++ b/test_test.go @@ -6,7 +6,7 @@ import ( "image" "testing" - "github.com/stanim/draw2d" + "github.com/llgcode/draw2d" ) func test(t *testing.T, draw draw2d.Sample) { From dbd88a6569aab4c8fda1ffa29b4c9f6b14e7b7ac Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 00:25:24 +0200 Subject: [PATCH 39/52] rename pdf2d to draw2dpdf --- pdf2d/doc.go | 4 ++-- pdf2d/fileutil.go | 2 +- pdf2d/graphiccontext.go | 2 +- pdf2d/graphiccontext_test.go | 4 ++-- pdf2d/path_converter.go | 2 +- pdf2d/samples_test.go | 2 +- pdf2d/test_test.go | 12 ++++++------ pdf2d/vectorizer.go | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pdf2d/doc.go b/pdf2d/doc.go index 87a95ee..f019d31 100644 --- a/pdf2d/doc.go +++ b/pdf2d/doc.go @@ -1,5 +1,5 @@ // Copyright 2015 The draw2d Authors. All rights reserved. // created: 26/06/2015 by Stani Michiels -// Package pdf2d provides a Graphic Context that can draw vector form on pdf file. -package pdf2d +// Package draw2dpdf provides a Graphic Context that can draw vector form on pdf file. +package draw2dpdf diff --git a/pdf2d/fileutil.go b/pdf2d/fileutil.go index 4e4fcfd..c3c8e66 100644 --- a/pdf2d/fileutil.go +++ b/pdf2d/fileutil.go @@ -1,4 +1,4 @@ -package pdf2d +package draw2dpdf import "github.com/jung-kurt/gofpdf" diff --git a/pdf2d/graphiccontext.go b/pdf2d/graphiccontext.go index 1b4c7b5..f2d196c 100644 --- a/pdf2d/graphiccontext.go +++ b/pdf2d/graphiccontext.go @@ -2,7 +2,7 @@ // created: 26/06/2015 by Stani Michiels // TODO: fonts, dpi -package pdf2d +package draw2dpdf import ( "bytes" diff --git a/pdf2d/graphiccontext_test.go b/pdf2d/graphiccontext_test.go index 3aa1539..949f18f 100644 --- a/pdf2d/graphiccontext_test.go +++ b/pdf2d/graphiccontext_test.go @@ -1,4 +1,4 @@ -package pdf2d +package draw2dpdf import ( "fmt" @@ -28,7 +28,7 @@ func ExampleGraphicContext() { gc.FillStroke() fmt.Println(gc.LastPoint()) - // pdf2d.SaveToPdfFile("example.pdf", pdf) + // draw2dpdf.SaveToPdfFile("example.pdf", pdf) // Output: // 10 10 diff --git a/pdf2d/path_converter.go b/pdf2d/path_converter.go index 662d72b..c58d53e 100644 --- a/pdf2d/path_converter.go +++ b/pdf2d/path_converter.go @@ -1,7 +1,7 @@ // Copyright 2015 The draw2d Authors. All rights reserved. // created: 26/06/2015 by Stani Michiels -package pdf2d +package draw2dpdf import ( "math" diff --git a/pdf2d/samples_test.go b/pdf2d/samples_test.go index 4a6a6f3..5ceeb3c 100644 --- a/pdf2d/samples_test.go +++ b/pdf2d/samples_test.go @@ -1,6 +1,6 @@ // See also test_test.go -package pdf2d_test +package draw2dpdf_test import ( "testing" diff --git a/pdf2d/test_test.go b/pdf2d/test_test.go index d8a9364..923f021 100644 --- a/pdf2d/test_test.go +++ b/pdf2d/test_test.go @@ -1,20 +1,20 @@ -// Package pdf2d_test gives test coverage with the command: +// Package draw2dpdf_test gives test coverage with the command: // go test -cover ./... | grep -v "no test" // (It should be run from its parent draw2d directory.) -package pdf2d_test +package draw2dpdf_test import ( "os" "testing" "github.com/llgcode/draw2d" - "github.com/llgcode/draw2d/pdf2d" + "github.com/llgcode/draw2d/draw2dpdf" ) func test(t *testing.T, sample draw2d.Sample) { // Initialize the graphic context on an pdf document - dest := pdf2d.NewPdf("L", "mm", "A4") - gc := pdf2d.NewGraphicContext(dest) + dest := draw2dpdf.NewPdf("L", "mm", "A4") + gc := draw2dpdf.NewGraphicContext(dest) // Draw sample fn, err := sample(gc, "pdf") if err != nil { @@ -26,7 +26,7 @@ func test(t *testing.T, sample draw2d.Sample) { t.Skipf("Saving %q skipped, as it exists already. (Git would consider it modified.)", fn) return } - err = pdf2d.SaveToPdfFile(fn, dest) + err = draw2dpdf.SaveToPdfFile(fn, dest) if err != nil { t.Errorf("Saving %q failed: %v", fn, err) } diff --git a/pdf2d/vectorizer.go b/pdf2d/vectorizer.go index dda2312..556c2e0 100644 --- a/pdf2d/vectorizer.go +++ b/pdf2d/vectorizer.go @@ -1,7 +1,7 @@ // Copyright 2015 The draw2d Authors. All rights reserved. // created: 26/06/2015 by Stani Michiels -package pdf2d +package draw2dpdf // Vectorizer defines the minimal interface for gofpdf.Fpdf // to be passed to a PathConvertor. From dbdf3e22bcf1b0f619ae506e8e005253bd9d8aca Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 00:25:56 +0200 Subject: [PATCH 40/52] rename pdf2d to draw2dpdf --- {pdf2d => draw2dpdf}/doc.go | 0 {pdf2d => draw2dpdf}/fileutil.go | 0 {pdf2d => draw2dpdf}/graphiccontext.go | 0 {pdf2d => draw2dpdf}/graphiccontext_test.go | 0 {pdf2d => draw2dpdf}/path_converter.go | 0 {pdf2d => draw2dpdf}/samples_test.go | 0 {pdf2d => draw2dpdf}/test_test.go | 0 {pdf2d => draw2dpdf}/vectorizer.go | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {pdf2d => draw2dpdf}/doc.go (100%) rename {pdf2d => draw2dpdf}/fileutil.go (100%) rename {pdf2d => draw2dpdf}/graphiccontext.go (100%) rename {pdf2d => draw2dpdf}/graphiccontext_test.go (100%) rename {pdf2d => draw2dpdf}/path_converter.go (100%) rename {pdf2d => draw2dpdf}/samples_test.go (100%) rename {pdf2d => draw2dpdf}/test_test.go (100%) rename {pdf2d => draw2dpdf}/vectorizer.go (100%) diff --git a/pdf2d/doc.go b/draw2dpdf/doc.go similarity index 100% rename from pdf2d/doc.go rename to draw2dpdf/doc.go diff --git a/pdf2d/fileutil.go b/draw2dpdf/fileutil.go similarity index 100% rename from pdf2d/fileutil.go rename to draw2dpdf/fileutil.go diff --git a/pdf2d/graphiccontext.go b/draw2dpdf/graphiccontext.go similarity index 100% rename from pdf2d/graphiccontext.go rename to draw2dpdf/graphiccontext.go diff --git a/pdf2d/graphiccontext_test.go b/draw2dpdf/graphiccontext_test.go similarity index 100% rename from pdf2d/graphiccontext_test.go rename to draw2dpdf/graphiccontext_test.go diff --git a/pdf2d/path_converter.go b/draw2dpdf/path_converter.go similarity index 100% rename from pdf2d/path_converter.go rename to draw2dpdf/path_converter.go diff --git a/pdf2d/samples_test.go b/draw2dpdf/samples_test.go similarity index 100% rename from pdf2d/samples_test.go rename to draw2dpdf/samples_test.go diff --git a/pdf2d/test_test.go b/draw2dpdf/test_test.go similarity index 100% rename from pdf2d/test_test.go rename to draw2dpdf/test_test.go diff --git a/pdf2d/vectorizer.go b/draw2dpdf/vectorizer.go similarity index 100% rename from pdf2d/vectorizer.go rename to draw2dpdf/vectorizer.go From e94fab81971b8b52513e8c462a96d2b8e7bf2a74 Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 21:48:16 +0200 Subject: [PATCH 41/52] rename draw2dpdf graphiccontext.go to gc.go as in draw2d --- draw2dpdf/{graphiccontext.go => gc.go} | 0 draw2dpdf/{graphiccontext_test.go => gc_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename draw2dpdf/{graphiccontext.go => gc.go} (100%) rename draw2dpdf/{graphiccontext_test.go => gc_test.go} (100%) diff --git a/draw2dpdf/graphiccontext.go b/draw2dpdf/gc.go similarity index 100% rename from draw2dpdf/graphiccontext.go rename to draw2dpdf/gc.go diff --git a/draw2dpdf/graphiccontext_test.go b/draw2dpdf/gc_test.go similarity index 100% rename from draw2dpdf/graphiccontext_test.go rename to draw2dpdf/gc_test.go From cf81b0b12024f56d4a7f8be2dc5c23ac924caaad Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 23:32:27 +0200 Subject: [PATCH 42/52] add documentation fix --- draw2dpdf/gc.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/draw2dpdf/gc.go b/draw2dpdf/gc.go index f2d196c..0461c3c 100644 --- a/draw2dpdf/gc.go +++ b/draw2dpdf/gc.go @@ -17,14 +17,14 @@ import ( "code.google.com/p/freetype-go/freetype/truetype" - "github.com/llgcode/draw2d" "github.com/jung-kurt/gofpdf" + "github.com/llgcode/draw2d" ) const ( - c255 = 255.0 / 65535.0 // DPI of a pdf document is fixed at 72. - DPI = 72 + DPI = 72 + c255 = 255.0 / 65535.0 ) var ( From 8c807d1289de32b1a52a42893b7994b14fd29288 Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 23:35:03 +0200 Subject: [PATCH 43/52] make sample interface private --- draw2dpdf/test_test.go | 6 ++++-- gc.go | 2 -- test_test.go | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/draw2dpdf/test_test.go b/draw2dpdf/test_test.go index 923f021..a763c59 100644 --- a/draw2dpdf/test_test.go +++ b/draw2dpdf/test_test.go @@ -11,12 +11,14 @@ import ( "github.com/llgcode/draw2d/draw2dpdf" ) -func test(t *testing.T, sample draw2d.Sample) { +type sample func(gc draw2d.GraphicContext, ext string) (string, error) + +func test(t *testing.T, draw sample) { // Initialize the graphic context on an pdf document dest := draw2dpdf.NewPdf("L", "mm", "A4") gc := draw2dpdf.NewGraphicContext(dest) // Draw sample - fn, err := sample(gc, "pdf") + fn, err := draw(gc, "pdf") if err != nil { t.Errorf("Drawing %q failed: %v", fn, err) return diff --git a/gc.go b/gc.go index 8248cdc..66dc508 100644 --- a/gc.go +++ b/gc.go @@ -15,8 +15,6 @@ const ( FillRuleWinding ) -type Sample func(gc GraphicContext, ext string) (string, error) - type GraphicContext interface { Path // Create a new path diff --git a/test_test.go b/test_test.go index 33cbfac..ca58f79 100644 --- a/test_test.go +++ b/test_test.go @@ -9,7 +9,9 @@ import ( "github.com/llgcode/draw2d" ) -func test(t *testing.T, draw draw2d.Sample) { +type sample func(gc draw2d.GraphicContext, ext string) (string, error) + +func test(t *testing.T, draw sample) { // Initialize the graphic context on an RGBA image dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) gc := draw2d.NewGraphicContext(dest) From 67213e40fce86119a3e84f55ad1213f32eb67f11 Mon Sep 17 00:00:00 2001 From: Stani Date: Tue, 7 Jul 2015 23:59:20 +0200 Subject: [PATCH 44/52] improve documentation for godoc --- README.md | 13 +++++---- draw2d.go | 65 +++++++++++++++++++++++++++++++++++++++++++- draw2dgl/doc.go | 3 ++ draw2dpdf/doc.go | 36 +++++++++++++++++++++++- draw2dpdf/gc_test.go | 35 ------------------------ 5 files changed, 109 insertions(+), 43 deletions(-) create mode 100644 draw2dgl/doc.go delete mode 100644 draw2dpdf/gc_test.go diff --git a/README.md b/README.md index 6a3255d..e8e09b7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,20 @@ draw2d ====== -This package (written in [go](http://golang.org)) provides an API to draw 2d vector forms on [images](http://golang.org/pkg/image). +Package draw2d is a pure [go](http://golang.org) 2D vector graphics library with support for multiple output devices such as [images](http://golang.org/pkg/image) (draw2d), pdf documents (draw2dpdf) and opengl (draw2dopengl), which can also be used on the google app engine. This library is inspired by [postscript](http://www.tailrecursive.org/postscript) and [HTML5 canvas](http://www.w3.org/TR/2dcontext/). +See the [documentation](http://godoc.org/github.com/llgcode/draw2d) for more details. + The package depends on [freetype-go](http://code.google.com/p/freetype-go) package for its rasterization algorithm. +Installation +------------ -Using ------ - -Install [golang](http://golang.org/doc/install) and get `draw2d` +Install [golang](http://golang.org/doc/install). To install or update the package draw2d on your system, run: ``` -go get github.com/llgcode/draw2d +go get -u github.com/llgcode/draw2d ``` and start coding using one of the [Samples](https://github.com/llgcode/draw2d.samples). diff --git a/draw2d.go b/draw2d.go index 424abf4..bcbc82b 100644 --- a/draw2d.go +++ b/draw2d.go @@ -1,5 +1,68 @@ // Copyright 2010 The draw2d Authors. All rights reserved. // created: 13/12/2010 by Laurent Le Goff -// Package draw2d provides a Graphic Context that can draw vector form on canvas. +// Package draw2d is a pure go 2D vector graphics library with support +// for multiple output devices such as images (draw2d), pdf documents +// (draw2dpdf) and opengl (draw2dopengl), which can also be used on the +// google app engine. +// +// Features +// +// Operations in draw2d include stroking and filling polygons, arcs, +// Bézier curves, drawing images and text rendering with truetype fonts. +// All drawing operations can be transformed by affine transformations +// (scale, rotation, translation). +// +// Installation +// +// To install or update the package on your system, run: +// go get -u github.com/llgcode/draw2d +// +// Quick Start +// +// Package draw2d itself provides a graphic context that can draw vector +// graphics and text on an image canvas. The following Go code +// generates a simple drawing and saves it to an image file: +// // Initialize the graphic context on an RGBA image +// dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) +// gc := draw2d.NewGraphicContext(dest) +// +// // Set some properties +// gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) +// gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) +// gc.SetLineWidth(5) +// +// // Draw a closed shape +// gc.MoveTo(10, 10) // should always be called first for a new path +// gc.LineTo(100, 50) +// gc.QuadCurveTo(100, 10, 10, 10) +// gc.Close() +// gc.FillStroke() +// +// // Save to file +// draw2d.SaveToPngFile(fn, dest) +// +// There are more examples here: +// https://github.com/llgcode/draw2d.samples +// +// Drawing on pdf documents is provided by the draw2dpdf package. +// Drawing on opengl is provided by the draw2dgl package. +// See subdirectories at the bottom of this page. +// +// Acknowledgments +// +// Laurent Le Goff wrote this library, inspired by postscript and +// HTML5 canvas. He implemented the image and opengl backend. Also +// he created a pure go Postscripter interpreter which can draw to a +// draw2d graphic context (https://github.com/llgcode/ps). Stani +// Michiels implemented the pdf backend. +// +// The package depends on freetype-go package for its rasterization +// algorithm. +// +// Packages using draw2d +// +// - https://github.com/llgcode/ps +// +// - https://github.com/gonum/plot package draw2d diff --git a/draw2dgl/doc.go b/draw2dgl/doc.go new file mode 100644 index 0000000..0d7128a --- /dev/null +++ b/draw2dgl/doc.go @@ -0,0 +1,3 @@ +// Package draw2dgl provides a graphic context that can draw vector +// graphics and text on OpenGL. +package draw2dgl diff --git a/draw2dpdf/doc.go b/draw2dpdf/doc.go index f019d31..b8ccdb4 100644 --- a/draw2dpdf/doc.go +++ b/draw2dpdf/doc.go @@ -1,5 +1,39 @@ // Copyright 2015 The draw2d Authors. All rights reserved. // created: 26/06/2015 by Stani Michiels -// Package draw2dpdf provides a Graphic Context that can draw vector form on pdf file. +// Package draw2dpdf provides a graphic context that can draw vector +// graphics and text on pdf file. +// +// Quick Start +// +// The following Go code generates a simple drawing and saves it to a +// pdf document: +// // Initialize the graphic context on an RGBA image +// dest := draw2dpdf.NewPdf("L", "mm", "A4") +// gc := draw2d.NewGraphicContext(dest) +// +// // Set some properties +// gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) +// gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) +// gc.SetLineWidth(5) +// +// // Draw a closed shape +// gc.MoveTo(10, 10) // should always be called first for a new path +// gc.LineTo(100, 50) +// gc.QuadCurveTo(100, 10, 10, 10) +// gc.Close() +// gc.FillStroke() +// +// // Save to file +// draw2dpdf.SaveToPdfFile(fn, dest) +// +// There are more examples here: +// https://github.com/llgcode/draw2d.samples +// +// Drawing on images is provided by the draw2d package. +// Drawing on opengl is provided by the draw2dgl package. +// +// Acknowledgments +// +// The pdf backend uses https://github.com/jung-kurt/gofpdf package draw2dpdf diff --git a/draw2dpdf/gc_test.go b/draw2dpdf/gc_test.go deleted file mode 100644 index 949f18f..0000000 --- a/draw2dpdf/gc_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package draw2dpdf - -import ( - "fmt" - "image/color" - - "github.com/llgcode/draw2d" - "github.com/jung-kurt/gofpdf" -) - -func ExampleGraphicContext() { - // Initialize the graphic context on a pdf document - pdf := gofpdf.New("P", "mm", "A4", "../font") - pdf.AddPage() - gc := NewGraphicContext(pdf) - - // some properties - gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) - gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) - gc.SetLineCap(draw2d.RoundCap) - gc.SetLineWidth(5) - - // draw something - gc.MoveTo(10, 10) // should always be called first for a new path - gc.LineTo(100, 50) - gc.QuadCurveTo(100, 10, 10, 10) - gc.Close() - gc.FillStroke() - fmt.Println(gc.LastPoint()) - - // draw2dpdf.SaveToPdfFile("example.pdf", pdf) - - // Output: - // 10 10 -} From d446bebfa1c549cedc21c2de8487140be401ad40 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 00:17:58 +0200 Subject: [PATCH 45/52] fix golint for advanced_path.go --- advanced_path.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/advanced_path.go b/advanced_path.go index 2610bb8..9569cea 100644 --- a/advanced_path.go +++ b/advanced_path.go @@ -1,14 +1,15 @@ // Copyright 2010 The draw2d Authors. All rights reserved. // created: 13/12/2010 by Laurent Le Goff +//high level path creation + package draw2d import ( "math" ) -//high level path creation - +// Rect draws a rectangle between (x1,y1) and (x2,y2) func Rect(path Path, x1, y1, x2, y2 float64) { path.MoveTo(x1, y1) path.LineTo(x2, y1) @@ -17,6 +18,7 @@ func Rect(path Path, x1, y1, x2, y2 float64) { path.Close() } +// RoundRect draws a rectangle between (x1,y1) and (x2,y2) with rounded corners func RoundRect(path Path, x1, y1, x2, y2, arcWidth, arcHeight float64) { arcWidth = arcWidth / 2 arcHeight = arcHeight / 2 @@ -31,12 +33,14 @@ func RoundRect(path Path, x1, y1, x2, y2, arcWidth, arcHeight float64) { path.Close() } +// Ellipse is drawn with center (cx,cy) and radius (rx,ry) func Ellipse(path Path, cx, cy, rx, ry float64) { path.MoveTo(cx-rx, cy) path.ArcTo(cx, cy, rx, ry, 0, -math.Pi*2) path.Close() } +// Circle is drawn with center (cx,cy) and radius func Circle(path Path, cx, cy, radius float64) { path.MoveTo(cx-radius, cy) path.ArcTo(cx, cy, radius, radius, 0, -math.Pi*2) From 8c8e0b176007697efa40c08db2d82b331cff1ced Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 00:18:47 +0200 Subject: [PATCH 46/52] fix draw2d installation documentation --- draw2d.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draw2d.go b/draw2d.go index bcbc82b..44c7689 100644 --- a/draw2d.go +++ b/draw2d.go @@ -15,7 +15,7 @@ // // Installation // -// To install or update the package on your system, run: +// To install or update the package draw2d on your system, run: // go get -u github.com/llgcode/draw2d // // Quick Start From dbf591ab9763c6017f5cfb861665ebbac7611447 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 00:42:00 +0200 Subject: [PATCH 47/52] fix golint for gc.go --- gc.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gc.go b/gc.go index 66dc508..ea1f21f 100644 --- a/gc.go +++ b/gc.go @@ -8,13 +8,17 @@ import ( "image/color" ) +// FillRule defines the type for fill rules type FillRule int const ( + // FillRuleEvenOdd defines the even odd filling rule FillRuleEvenOdd FillRule = iota + // FillRuleWinding defines the non zero winding rule FillRuleWinding ) +// GraphicContext describes the interface for the various backends (images, pdf, opengl, ...) type GraphicContext interface { Path // Create a new path From 62e23c1693322486f8e8187af881fe917e26d814 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 00:48:15 +0200 Subject: [PATCH 48/52] improve docstrings of draw2dpdf/gc.go --- draw2dpdf/gc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draw2dpdf/gc.go b/draw2dpdf/gc.go index 0461c3c..f7f5cd0 100644 --- a/draw2dpdf/gc.go +++ b/draw2dpdf/gc.go @@ -168,12 +168,12 @@ func (gc *GraphicContext) StrokeStringAt(text string, x, y float64) (cursor floa return gc.CreateStringPath(text, x, y) } -// Stroke strokes the paths +// Stroke strokes the paths with the color specified by SetStrokeColor func (gc *GraphicContext) Stroke(paths ...*draw2d.PathStorage) { gc.draw("D", paths...) } -// Fill strokes the paths +// Fill fills the paths with the color specified by SetFillColor func (gc *GraphicContext) Fill(paths ...*draw2d.PathStorage) { gc.draw("F", paths...) } From 437a88ccda7085851dc901cb4da1bc28ce3c0334 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 00:49:12 +0200 Subject: [PATCH 49/52] improve docstrings of image.go --- image.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/image.go b/image.go index 9e50d32..bc4d403 100644 --- a/image.go +++ b/image.go @@ -34,9 +34,7 @@ type ImageGraphicContext struct { DPI int } -/** - * Create a new Graphic context from an image - */ +// NewGraphicContext creates a new Graphic context from an image. func NewGraphicContext(img draw.Image) *ImageGraphicContext { var painter Painter switch selectImage := img.(type) { @@ -48,7 +46,7 @@ func NewGraphicContext(img draw.Image) *ImageGraphicContext { return NewGraphicContextWithPainter(img, painter) } -// Create a new Graphic context from an image and a Painter (see Freetype-go) +// NewGraphicContextWithPainter creates a new Graphic context from an image and a Painter (see Freetype-go) func NewGraphicContextWithPainter(img draw.Image, painter Painter) *ImageGraphicContext { width, height := img.Bounds().Dx(), img.Bounds().Dy() dpi := 92 @@ -274,7 +272,7 @@ func (gc *ImageGraphicContext) paint(rasterizer *raster.Rasterizer, color color. gc.Current.Path.Clear() } -/**** second method ****/ +// Stroke strokes the paths with the color specified by SetStrokeColor func (gc *ImageGraphicContext) Stroke(paths ...*PathStorage) { paths = append(paths, gc.Current.Path) gc.strokeRasterizer.UseNonZeroWinding = true @@ -294,7 +292,7 @@ func (gc *ImageGraphicContext) Stroke(paths ...*PathStorage) { gc.paint(gc.strokeRasterizer, gc.Current.StrokeColor) } -/**** second method ****/ +// Fill fills the paths with the color specified by SetFillColor func (gc *ImageGraphicContext) Fill(paths ...*PathStorage) { paths = append(paths, gc.Current.Path) gc.fillRasterizer.UseNonZeroWinding = gc.Current.FillRule.UseNonZeroWinding() @@ -307,7 +305,7 @@ func (gc *ImageGraphicContext) Fill(paths ...*PathStorage) { gc.paint(gc.fillRasterizer, gc.Current.FillColor) } -/* second method */ +// FillStroke first fills the paths and than strokes them func (gc *ImageGraphicContext) FillStroke(paths ...*PathStorage) { gc.fillRasterizer.UseNonZeroWinding = gc.Current.FillRule.UseNonZeroWinding() gc.strokeRasterizer.UseNonZeroWinding = true From 33f067e4dd4ee0e828267af9b592b94214b6d584 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 10:53:35 +0200 Subject: [PATCH 50/52] add docstrings to path.go --- path.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/path.go b/path.go index 7167a7c..3a14ab2 100644 --- a/path.go +++ b/path.go @@ -3,25 +3,37 @@ package draw2d +// Path describes the interface for path drawing. type Path interface { - // Return the current point of the path + // LastPoint returns the current point of the path LastPoint() (x, y float64) - // Create a new subpath that start at the specified point + // MoveTo creates a new subpath that start at the specified point MoveTo(x, y float64) - // Create a new subpath that start at the specified point + // RMoveTo creates a new subpath that start at the specified point // relative to the current point RMoveTo(dx, dy float64) - // Add a line to the current subpath + // LineTo adds a line to the current subpath LineTo(x, y float64) - // Add a line to the current subpath + // RLineTo adds a line to the current subpath // relative to the current point RLineTo(dx, dy float64) - + // QuadCurveTo adds a quadratic Bézier curve to the current subpath QuadCurveTo(cx, cy, x, y float64) + // QuadCurveTo adds a quadratic Bézier curve to the current subpath + // relative to the current point RQuadCurveTo(dcx, dcy, dx, dy float64) + // CubicCurveTo adds a cubic Bézier curve to the current subpath CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) + // RCubicCurveTo adds a cubic Bézier curve to the current subpath + // relative to the current point RCubicCurveTo(dcx1, dcy1, dcx2, dcy2, dx, dy float64) + // ArcTo adds an arc to the current subpath ArcTo(cx, cy, rx, ry, startAngle, angle float64) + // RArcTo adds an arc to the current subpath + // relative to the current point RArcTo(dcx, dcy, rx, ry, startAngle, angle float64) + // Close creates a line from the current point to the last MoveTo + // point (if not the same) and mark the path as closed so the + // first and last lines join nicely. Close() } From 4c03f519116f5c158bac09e28af69a573c7e0023 Mon Sep 17 00:00:00 2001 From: Stani Date: Wed, 8 Jul 2015 11:59:35 +0200 Subject: [PATCH 51/52] fix imageCount --- draw2dpdf/gc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/draw2dpdf/gc.go b/draw2dpdf/gc.go index f7f5cd0..ed159de 100644 --- a/draw2dpdf/gc.go +++ b/draw2dpdf/gc.go @@ -89,6 +89,7 @@ func NewGraphicContext(pdf *gofpdf.Fpdf) *GraphicContext { // TODO: add type (tp) as parameter to argument list? func (gc *GraphicContext) DrawImage(image image.Image) { name := strconv.Itoa(int(imageCount)) + imageCount += 1 tp := "PNG" // "JPG", "JPEG", "PNG" and "GIF" b := &bytes.Buffer{} png.Encode(b, image) From 7749b30624b4239550ea1c9c3a88680e74462c2a Mon Sep 17 00:00:00 2001 From: Stani Date: Thu, 9 Jul 2015 16:03:05 +0200 Subject: [PATCH 52/52] improve README.md --- README.md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++------ draw2d.go | 23 ++++++++++------ 2 files changed, 86 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index e8e09b7..c9aca0c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ draw2d ====== -Package draw2d is a pure [go](http://golang.org) 2D vector graphics library with support for multiple output devices such as [images](http://golang.org/pkg/image) (draw2d), pdf documents (draw2dpdf) and opengl (draw2dopengl), which can also be used on the google app engine. -This library is inspired by [postscript](http://www.tailrecursive.org/postscript) and [HTML5 canvas](http://www.w3.org/TR/2dcontext/). +Package draw2d is a pure [go](http://golang.org) 2D vector graphics library with support for multiple output devices such as [images](http://golang.org/pkg/image) (draw2d), pdf documents (draw2dpdf) and opengl (draw2dopengl), which can also be used on the google app engine. It can be used as a pure go [Cairo](http://www.cairographics.org/) alternative. See the [documentation](http://godoc.org/github.com/llgcode/draw2d) for more details. -The package depends on [freetype-go](http://code.google.com/p/freetype-go) package for its rasterization algorithm. +Features +-------- + +Operations in draw2d include stroking and filling polygons, arcs, Bézier curves, drawing images and text rendering with truetype fonts. All drawing operations can be transformed by affine transformations (scale, rotation, translation). Installation ------------ @@ -17,14 +19,75 @@ Install [golang](http://golang.org/doc/install). To install or update the packag go get -u github.com/llgcode/draw2d ``` -and start coding using one of the [Samples](https://github.com/llgcode/draw2d.samples). +Quick Start +----------- + +The following Go code generates a simple drawing and saves it to an image file with package draw2d: + +```go +// Initialize the graphic context on an RGBA image +dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0)) +gc := draw2d.NewGraphicContext(dest) + +// Set some properties +gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) +gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) +gc.SetLineWidth(5) + +// Draw a closed shape +gc.MoveTo(10, 10) // should always be called first for a new path +gc.LineTo(100, 50) +gc.QuadCurveTo(100, 10, 10, 10) +gc.Close() +gc.FillStroke() + +// Save to file +draw2d.SaveToPngFile(fn, dest) +``` + +The same Go code can also generate a pdf document with package draw2dpdf: + +```go +// Initialize the graphic context on an RGBA image +dest := draw2dpdf.NewPdf("L", "mm", "A4") +gc := draw2d.NewGraphicContext(dest) + +// Set some properties +gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff}) +gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff}) +gc.SetLineWidth(5) + +// Draw a closed shape +gc.MoveTo(10, 10) // should always be called first for a new path +gc.LineTo(100, 50) +gc.QuadCurveTo(100, 10, 10, 10) +gc.Close() +gc.FillStroke() + +// Save to file +draw2dpdf.SaveToPdfFile(fn, dest) +``` + +There are more examples here: https://github.com/llgcode/draw2d.samples + +Drawing on opengl is provided by the draw2dgl package. + +Acknowledgments +--------------- + +[Laurent Le Goff](https://github.com/llgcode) wrote this library, inspired by [Postscript](http://www.tailrecursive.org/postscript) and [HTML5 canvas](http://www.w3.org/TR/2dcontext/). He implemented the image and opengl backend with the [freetype-go](https://code.google.com/p/freetype-go/) package. Also he created a pure go [Postscript interpreter](https://github.com/llgcode/ps), which can read postscript images and draw to a draw2d graphic context. [Stani Michiels](https://github.com/stanim) implemented the pdf backend with the [gofpdf](https://github.com/jung-kurt/gofpdf) package. -Softwares and Packages using draw2d ------------------------------------ - - [golang postscript interpreter](https://github.com/llgcode/ps) - - [gonum plot](https://github.com/gonum/plot) +Packages using draw2d +--------------------- + + - [ps](https://github.com/llgcode/ps): Postscript interpreter written in Go + - [gonum/plot](https://github.com/gonum/plot): drawing plots in Go + - [go.uik](https://github.com/skelterjohn/go.uik): a concurrent UI kit written in pure go. + - [smartcrop](https://github.com/muesli/smartcrop): content aware image cropping + - [karta](https://github.com/peterhellberg/karta): drawing Voronoi diagrams + - [chart](https://github.com/vdobler/chart): basic charts in Go References --------- diff --git a/draw2d.go b/draw2d.go index 44c7689..3711927 100644 --- a/draw2d.go +++ b/draw2d.go @@ -4,7 +4,7 @@ // Package draw2d is a pure go 2D vector graphics library with support // for multiple output devices such as images (draw2d), pdf documents // (draw2dpdf) and opengl (draw2dopengl), which can also be used on the -// google app engine. +// google app engine. It can be used as a pure go Cairo alternative. // // Features // @@ -51,18 +51,25 @@ // // Acknowledgments // -// Laurent Le Goff wrote this library, inspired by postscript and -// HTML5 canvas. He implemented the image and opengl backend. Also -// he created a pure go Postscripter interpreter which can draw to a -// draw2d graphic context (https://github.com/llgcode/ps). Stani -// Michiels implemented the pdf backend. +// Laurent Le Goff wrote this library, inspired by Postscript and +// HTML5 canvas. He implemented the image and opengl backend with the +// freetype-go package. Also he created a pure go Postscript +// interpreter, which can read postscript images and draw to a draw2d +// graphic context (https://github.com/llgcode/ps). Stani Michiels +// implemented the pdf backend with the gofpdf package. // // The package depends on freetype-go package for its rasterization // algorithm. // // Packages using draw2d // -// - https://github.com/llgcode/ps +// - https://github.com/llgcode/ps: Postscript interpreter written in Go // -// - https://github.com/gonum/plot +// - https://github.com/gonum/plot: drawing plots in Go +// +// - https://github.com/muesli/smartcrop: content aware image cropping +// +// - https://github.com/peterhellberg/karta: drawing Voronoi diagrams +// +// - https://github.com/vdobler/chart: basic charts in Go package draw2d

    *%7Sz>YQ%ervakfN8a(dlHZFTp{Uq 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�{g@0M|>Ic28Kegm}!Q{k}PaP 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≥_ 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 - gc.SetFillColor(color.RGBA{0xF6, 0xD2, 0xA2, 0xff}) - gc.MoveTo(10.634, 300.493) - gc.RCubicCurveTo(0.764, 15.751, 16.499, 8.463, 23.626, 3.539) - gc.RCubicCurveTo(6.765, -4.675, 8.743, -0.789, 9.337, -10.015) - gc.RCubicCurveTo(0.389, -6.064, 1.088, -12.128, 0.744, -18.216) - gc.RCubicCurveTo(-10.23, -0.927, -21.357, 1.509, -29.744, 7.602) - gc.CubicCurveTo(10.277, 286.542, 2.177, 296.561, 10.634, 300.493) - gc.FillStroke() - - // - gc.MoveTo(10.634, 300.493) - gc.RCubicCurveTo(2.29, -0.852, 4.717, -1.457, 6.271, -3.528) - gc.Stroke() - - // Left Ear - // - gc.MoveTo(46.997, 112.853) - gc.CubicCurveTo(-13.3, 95.897, 31.536, 19.189, 79.956, 50.74) - gc.LineTo(46.997, 112.853) - gc.Close() - gc.Stroke() -} diff --git a/pdf2d/samples/helloworld/helloworld.go b/pdf2d/samples/helloworld/helloworld.go deleted file mode 100644 index 42263f4..0000000 --- a/pdf2d/samples/helloworld/helloworld.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2010 The draw2d Authors. All rights reserved. -// created: 21/11/2010 by Laurent Le Goff, Stani Michiels - -// Display Hello world in a Rectangle save it to a png -package main - -import ( - "image" - - "github.com/stanim/draw2d" - "github.com/stanim/draw2d/pdf2d" -) - -func main() { - // Set the global folder for searching fonts - // The pdf backend needs for every ttf file its corresponding json - // file which is generated by gofpdf/makefont. - draw2d.SetFontFolder(".") - - // Initialize the graphic context on a pdf document - dest := pdf2d.NewPdf("P", "mm", "A4") - gc := pdf2d.NewGraphicContext(dest) - - // Draw a rounded rectangle using default colors - draw2d.RoundRect(gc, 5, 5, 135, 95, 10, 10) - gc.FillStroke() - - // Set the font luximbi.ttf - gc.SetFontData(draw2d.FontData{"luxi", draw2d.FontFamilyMono, draw2d.FontStyleBold | draw2d.FontStyleItalic}) - // Set the fill text color to black - gc.SetFillColor(image.Black) - gc.SetFontSize(14) - // Display Hello World - gc.FillStringAt("Hello World", 8, 52) - - // Save to pdf - pdf2d.SaveToPdfFile("helloworld.pdf", dest) -} diff --git a/pdf2d/samples/helloworld/luximbi.json b/pdf2d/samples/helloworld/luximbi.json deleted file mode 100644 index a03565e..0000000 --- a/pdf2d/samples/helloworld/luximbi.json +++ /dev/null @@ -1 +0,0 @@ -{"Tp":"TrueType","Name":"LuxiMono-BoldOblique","Desc":{"Ascent":783,"Descent":-205,"CapHeight":783,"Flags":97,"FontBBox":{"Xmin":-29,"Ymin":-211,"Xmax":764,"Ymax":1012},"ItalicAngle":-8,"StemV":120,"MissingWidth":600},"Up":0,"Ut":0,"Cw":[600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,653,600,653,600,600,653,600,653,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600],"Enc":"cp1252","Diff":"","File":"","Size1":0,"Size2":0,"OriginalSize":0,"I":0,"N":0,"DiffN":0} \ No newline at end of file diff --git a/pdf2d/samples/helloworld/luximbi.ttf b/pdf2d/samples/helloworld/luximbi.ttf deleted file mode 100644 index 734201bed16677bc6494af52a15b4c842bb60184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69872 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 z