github.com/phpdave11/gofpdf@v1.4.2/svgwrite.go (about) 1 /* 2 * Copyright (c) 2014 Kurt Jung (Gmail: kurt.w.jung) 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 package gofpdf 18 19 // SVGBasicWrite renders the paths encoded in the basic SVG image specified by 20 // sb. The scale value is used to convert the coordinates in the path to the 21 // unit of measure specified in New(). The current position (as set with a call 22 // to SetXY()) is used as the origin of the image. The current line cap style 23 // (as set with SetLineCapStyle()), line width (as set with SetLineWidth()), 24 // and draw color (as set with SetDrawColor()) are used in drawing the image 25 // paths. 26 func (f *Fpdf) SVGBasicWrite(sb *SVGBasicType, scale float64) { 27 originX, originY := f.GetXY() 28 var x, y, newX, newY float64 29 var cx0, cy0, cx1, cy1 float64 30 var path []SVGBasicSegmentType 31 var seg SVGBasicSegmentType 32 var startX, startY float64 33 sval := func(origin float64, arg int) float64 { 34 return origin + scale*seg.Arg[arg] 35 } 36 xval := func(arg int) float64 { 37 return sval(originX, arg) 38 } 39 yval := func(arg int) float64 { 40 return sval(originY, arg) 41 } 42 val := func(arg int) (float64, float64) { 43 return xval(arg), yval(arg + 1) 44 } 45 for j := 0; j < len(sb.Segments) && f.Ok(); j++ { 46 path = sb.Segments[j] 47 for k := 0; k < len(path) && f.Ok(); k++ { 48 seg = path[k] 49 switch seg.Cmd { 50 case 'M': 51 x, y = val(0) 52 startX, startY = x, y 53 f.SetXY(x, y) 54 case 'L': 55 newX, newY = val(0) 56 f.Line(x, y, newX, newY) 57 x, y = newX, newY 58 case 'C': 59 cx0, cy0 = val(0) 60 cx1, cy1 = val(2) 61 newX, newY = val(4) 62 f.CurveCubic(x, y, cx0, cy0, newX, newY, cx1, cy1, "D") 63 x, y = newX, newY 64 case 'Q': 65 cx0, cy0 = val(0) 66 newX, newY = val(2) 67 f.Curve(x, y, cx0, cy0, newX, newY, "D") 68 x, y = newX, newY 69 case 'H': 70 newX = xval(0) 71 f.Line(x, y, newX, y) 72 x = newX 73 case 'V': 74 newY = yval(0) 75 f.Line(x, y, x, newY) 76 y = newY 77 case 'Z': 78 f.Line(x, y, startX, startY) 79 x, y = startX, startY 80 default: 81 f.SetErrorf("Unexpected path command '%c'", seg.Cmd) 82 } 83 } 84 } 85 }