func New(w, h vg.Length) *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">`+"\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 }
// New creates a new PDF Canvas. func New(w, h vg.Length) *Canvas { c := &Canvas{ doc: pdf.New(), w: w, h: h, } c.page = c.doc.NewPage(unit(w), unit(h)) vg.Initialize(c) return c }
// NewImage returns a new image canvas // that draws to the given image. The // minimum point of the given image // should probably be 0,0. func NewImage(img draw.Image) *Canvas { w := float64(img.Bounds().Max.X - img.Bounds().Min.X) h := float64(img.Bounds().Max.Y - img.Bounds().Min.Y) draw.Draw(img, img.Bounds(), image.White, image.ZP, draw.Src) gc := draw2d.NewGraphicContext(img) gc.SetDPI(dpi) gc.Scale(1, -1) gc.Translate(0, -h) c := &Canvas{ gc: gc, img: img, w: vg.Inches(w / dpi), h: vg.Inches(h / dpi), color: []color.Color{color.Black}, } vg.Initialize(c) return c }
// 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 code.google.com/p/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 }
// NewImage returns a new image canvas // that draws to the given image. The // minimum point of the given image // should probably be 0,0. func NewImage(img draw.Image, name string) (*XImgCanvas, error) { w := float64(img.Bounds().Max.X - img.Bounds().Min.X) h := float64(img.Bounds().Max.Y - img.Bounds().Min.Y) X, err := xgbutil.NewConn() if err != nil { return nil, err } keybind.Initialize(X) ximg := xgraphics.New(X, image.Rect(0, 0, int(w), int(h))) err = ximg.CreatePixmap() if err != nil { return nil, err } painter := NewXimgPainter(ximg) gc := draw2d.NewGraphicContextWithPainter(ximg, painter) gc.SetDPI(dpi) gc.Scale(1, -1) gc.Translate(0, -h) wid := ximg.XShowExtra(name, true) go func() { xevent.Main(X) }() c := &XImgCanvas{ gc: gc, w: vg.Inches(w / dpi), h: vg.Inches(h / dpi), color: []color.Color{color.Black}, x: X, ximg: ximg, wid: wid, } vg.Initialize(c) return c, nil }