func (c *Canvas) SetLineDash(ds []vg.Length, offs vg.Length) { dashes := make([]float64, len(ds)) for i, d := range ds { dashes[i] = d.Dots(c) } c.gc.SetLineDash(dashes, offs.Dots(c)) }
func (c *Canvas) FillString(font vg.Font, x, y vg.Length, str string) { c.gc.Save() c.gc.Translate(x.Dots(c), (y + font.Extents().Ascent).Dots(c)) c.gc.Scale(1, -1) c.gc.DrawImage(c.textImage(font, str)) c.gc.Restore() }
func NewStyle(w, h vg.Length, par string) *Canvas { buf := new(bytes.Buffer) c := &Canvas{ svg: svgo.New(buf), w: w, h: h, buf: buf, ht: w.Points(), stk: []context{context{}}, } // This is like svg.Start, except it uses floats // and specifies the units. fmt.Fprintf(buf, `<?xml version="1.0"?> <!-- Generated by SVGo and Plotinum VG --> <svg width="%.*gin" height="%.*gin" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" `+par+`>`+"\n", pr, w.Inches(), pr, h.Inches()) // Swap the origin to the bottom left. // This must be matched with a </g> when saving, // before the closing </svg>. c.svg.Gtransform(fmt.Sprintf("scale(1, -1) translate(0, -%.*g)", pr, h.Dots(c))) vg.Initialize(c) return c }
func (e *Canvas) FillString(fnt vg.Font, x, y vg.Length, str string) { if e.cur().font != fnt.Name() || e.cur().fsize != fnt.Size { e.cur().font = fnt.Name() e.cur().fsize = fnt.Size fmt.Fprintf(e.buf, "/%s findfont %.*g scalefont setfont\n", fnt.Name(), pr, fnt.Size) } fmt.Fprintf(e.buf, "%.*g %.*g moveto\n", pr, x.Dots(e), pr, y.Dots(e)) fmt.Fprintf(e.buf, "(%s) show\n", str) }
func (c *Canvas) FillString(font vg.Font, x, y vg.Length, str string) { fontStr, ok := fontMap[font.Name()] if !ok { panic(fmt.Sprintf("Unknown font: %s", font.Name())) } sty := style(fontStr, elm("font-size", "medium", "%.*gpt", pr, font.Size.Points()), elm("fill", "#000000", colorString(c.cur().color))) if sty != "" { sty = "\n\t" + sty } fmt.Fprintf(c.buf, `<text x="%.*g" y="%.*g" transform="scale(1, -1)"%s>%s</text>`+"\n", pr, x.Dots(c), pr, -y.Dots(c), sty, str) }
func (e *Canvas) SetLineDash(dashes []vg.Length, o vg.Length) { cur := e.cur().dashes dashEq := len(dashes) == len(cur) for i := 0; dashEq && i < len(dashes); i++ { if dashes[i] != cur[i] { dashEq = false } } if !dashEq || e.cur().offs != o { e.cur().dashes = dashes e.cur().offs = o e.buf.WriteString("[") for _, d := range dashes { fmt.Fprintf(e.buf, " %.*g", pr, d.Dots(e)) } e.buf.WriteString(" ] ") fmt.Fprintf(e.buf, "%.*g setdash\n", pr, o.Dots(e)) } }
// NewTitle returns a new Canvas with the given title string. func NewTitle(w, h vg.Length, title string) *Canvas { c := &Canvas{ stk: []ctx{ctx{}}, w: w, h: h, buf: new(bytes.Buffer), } c.buf.WriteString("%%!PS-Adobe-3.0 EPSF-3.0\n") c.buf.WriteString("%%Creator github.com/vron/plotinum/vg/veceps\n") c.buf.WriteString("%%Title: " + title + "\n") c.buf.WriteString(fmt.Sprintf("%%%%BoundingBox: 0 0 %.*g %.*g\n", pr, w.Dots(c), pr, h.Dots(c))) c.buf.WriteString(fmt.Sprintf("%%%%CreationDate: %s\n", time.Now())) c.buf.WriteString("%%Orientation: Portrait\n") c.buf.WriteString("%%EndComments\n") c.buf.WriteString("\n") vg.Initialize(c) return c }
func (c *Canvas) SetLineWidth(w vg.Length) { c.width = w c.gc.SetLineWidth(w.Dots(c)) }
func (c *Canvas) Translate(x, y vg.Length) { c.gc.Translate(x.Dots(c), y.Dots(c)) }
func (e *Canvas) SetLineWidth(w vg.Length) { if e.cur().width != w { e.cur().width = w fmt.Fprintf(e.buf, "%.*g setlinewidth\n", pr, w.Dots(e)) } }
func (e *Canvas) Translate(x, y vg.Length) { fmt.Fprintf(e.buf, "%.*g %.*g translate\n", pr, x.Dots(e), pr, y.Dots(e)) }
func (c *Canvas) Translate(x, y vg.Length) { c.svg.Gtransform(fmt.Sprintf("translate(%.*g, %.*g)", pr, x.Dots(c), pr, y.Dots(c))) c.cur().gEnds++ }