// crop returns a new DrawArea corresponding to the receiver // area with the given number of inches added to the minimum // and maximum x and y values of the DrawArea's Rect. func (da DrawArea) crop(minx, miny, maxx, maxy vg.Length) DrawArea { minpt := Point{ X: da.Min.X + minx, Y: da.Min.Y + miny, } sz := Point{ X: da.Max().X + maxx - minpt.X, Y: da.Max().Y + maxy - minpt.Y, } return DrawArea{ Canvas: vg.Canvas(da), Rect: Rect{Min: minpt, Size: sz}, } }
// padY returns a DrawArea that is padded vertically // so that glyphs will no be clipped. func padY(p *Plot, da DrawArea) DrawArea { glyphs := p.GlyphBoxes(p) b := bottomMost(&da, glyphs) yAxis := verticalAxis{p.Y} glyphs = append(glyphs, yAxis.GlyphBoxes(p)...) t := topMost(&da, glyphs) miny := da.Min.Y - b.Min.Y maxy := da.Max().Y - (t.Min.Y + t.Size.Y) by := vg.Length(b.Y) ty := vg.Length(t.Y) n := (by*maxy - ty*miny) / (by - ty) m := ((by-1)*maxy - ty*miny + miny) / (by - ty) return DrawArea{ Canvas: vg.Canvas(da), Rect: Rect{ Min: Point{Y: n, X: da.Min.X}, Size: Point{Y: m - n, X: da.Size.X}, }, } }
// padX returns a DrawArea that is padded horizontally // so that glyphs will no be clipped. func padX(p *Plot, da DrawArea) DrawArea { glyphs := p.GlyphBoxes(p) l := leftMost(&da, glyphs) xAxis := horizontalAxis{p.X} glyphs = append(glyphs, xAxis.GlyphBoxes(p)...) r := rightMost(&da, glyphs) minx := da.Min.X - l.Min.X maxx := da.Max().X - (r.Min.X + r.Size.X) lx := vg.Length(l.X) rx := vg.Length(r.X) n := (lx*maxx - rx*minx) / (lx - rx) m := ((lx-1)*maxx - rx*minx + minx) / (lx - rx) return DrawArea{ Canvas: vg.Canvas(da), Rect: Rect{ Min: Point{X: n, Y: da.Min.Y}, Size: Point{X: m - n, Y: da.Size.Y}, }, } }