prawn-svg 0.15.0.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +10 -3
- data/lib/prawn-svg.rb +4 -0
- data/lib/prawn/svg/calculators/aspect_ratio.rb +58 -0
- data/lib/prawn/svg/calculators/document_sizing.rb +71 -0
- data/lib/prawn/svg/calculators/pixels.rb +21 -0
- data/lib/prawn/svg/document.rb +15 -44
- data/lib/prawn/svg/element.rb +19 -10
- data/lib/prawn/svg/extension.rb +3 -3
- data/lib/prawn/svg/interface.rb +14 -10
- data/lib/prawn/svg/parser.rb +13 -0
- data/lib/prawn/svg/parser/image.rb +7 -62
- data/lib/prawn/svg/url_loader.rb +34 -0
- data/lib/prawn/svg/version.rb +1 -1
- data/spec/prawn/svg/calculators/aspect_ratio_spec.rb +95 -0
- data/spec/prawn/svg/calculators/document_sizing_spec.rb +73 -0
- data/spec/prawn/svg/document_spec.rb +4 -2
- data/spec/prawn/svg/element_spec.rb +1 -1
- data/spec/{lib/svg_spec.rb → prawn/svg/interface_spec.rb} +7 -2
- data/spec/{lib → prawn/svg/parser}/path_spec.rb +0 -0
- data/spec/{lib → prawn/svg}/parser_spec.rb +0 -0
- data/spec/prawn/svg/url_loader_spec.rb +46 -0
- data/spec/sample_images/mushroom-long.jpg +0 -0
- data/spec/sample_images/mushroom-wide.jpg +0 -0
- data/spec/sample_svg/hidden_paths.svg +6 -0
- data/spec/sample_svg/image01.svg +31 -31
- data/spec/sample_svg/negminy.svg +25 -0
- data/spec/sample_svg/viewbox.svg +4 -0
- data/spec/sample_svg/viewport.svg +23 -0
- metadata +30 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d7cbba75e8c3a5128d1c5136977b4b91d091407
|
4
|
+
data.tar.gz: e1996ddcb667032eae7777fea1decb58b470a600
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fc7f25cb50723695bcb95485daad73b89e158662f5c0af06f10a062395d8c903b8bea7447c7dca2b4ed15c58bcbcc8115e3dc564b62ae8b6b22af62d2907f9b
|
7
|
+
data.tar.gz: 312b2b093fec372fa444c61175b843592cac404c233f54cd3ec156ea85f4615337b5e8d7bb1372819c457df9476fca1ece3fbefff41a3415ae733676e92706c6
|
data/README.md
CHANGED
@@ -6,6 +6,8 @@ This will take an SVG file as input and render it into your PDF. Find out more
|
|
6
6
|
|
7
7
|
http://wiki.github.com/sandal/prawn/
|
8
8
|
|
9
|
+
prawn-svg is compatible with all versions of Prawn from 0.8.4 onwards, including the version 1.0 series.
|
10
|
+
|
9
11
|
## Using prawn-svg
|
10
12
|
|
11
13
|
```ruby
|
@@ -16,8 +18,9 @@ end
|
|
16
18
|
|
17
19
|
<tt>:at</tt> must be specified.
|
18
20
|
|
19
|
-
<tt>:width</tt>, <tt>:height</tt>, or neither may be specified; if neither is present,
|
20
|
-
the
|
21
|
+
Either <tt>:width</tt>, <tt>:height</tt>, or neither may be specified; if neither is present,
|
22
|
+
the dimensions specified in the SVG will be used, or if the dimensions aren't specified, it'll
|
23
|
+
fit to the space available on the page.
|
21
24
|
|
22
25
|
<tt>:cache_images</tt>, if set to true, will cache images per document based on their URL.
|
23
26
|
|
@@ -50,11 +53,15 @@ prawn-svg does not support the full SVG specification. It currently supports:
|
|
50
53
|
|
51
54
|
- attributes/styles: <tt>fill</tt>, <tt>stroke</tt>, <tt>stroke-width</tt>, <tt>opacity</tt>, <tt>fill-opacity</tt>, <tt>stroke-opacity</tt>, <tt>transform</tt>, <tt>clip-path</tt>
|
52
55
|
|
56
|
+
- the <tt>viewBox</tt> attribute on the <tt><svg></tt> tag
|
57
|
+
|
58
|
+
- the <tt>preserveAspectRatio</tt> attribute on the <tt><svg></tt> and <tt><image></tt> tags
|
59
|
+
|
53
60
|
- transform methods: <tt>translate</tt>, <tt>rotate</tt>, <tt>scale</tt>, <tt>matrix</tt>
|
54
61
|
|
55
62
|
- colors: HTML standard names, <tt>#xxx</tt>, <tt>#xxxxxx</tt>, <tt>rgb(1, 2, 3)</tt>, <tt>rgb(1%, 2%, 3%)</tt>
|
56
63
|
|
57
|
-
- measurements specified in <tt>pt</tt>, <tt>cm</tt>, <tt>dm</tt>, <tt>ft</tt>, <tt>in</tt>, <tt>m</tt>, <tt>mm</tt>, <tt>yd</tt>, <tt>%</tt>
|
64
|
+
- measurements specified in <tt>pt</tt>, <tt>cm</tt>, <tt>dm</tt>, <tt>ft</tt>, <tt>in</tt>, <tt>m</tt>, <tt>mm</tt>, <tt>yd</tt>, <tt>pc</tt>, <tt>%</tt>
|
58
65
|
|
59
66
|
- fonts: generic CSS fonts, built in PDF fonts, and any TTF fonts in your fonts path
|
60
67
|
|
data/lib/prawn-svg.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'prawn'
|
2
2
|
require 'prawn/svg/version'
|
3
3
|
|
4
|
+
require 'prawn/svg/calculators/aspect_ratio'
|
5
|
+
require 'prawn/svg/calculators/document_sizing'
|
6
|
+
require 'prawn/svg/calculators/pixels'
|
7
|
+
require 'prawn/svg/url_loader'
|
4
8
|
require 'prawn/svg/color'
|
5
9
|
require 'prawn/svg/extension'
|
6
10
|
require 'prawn/svg/interface'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Prawn::Svg::Calculators
|
2
|
+
class AspectRatio
|
3
|
+
attr_reader :align, :defer
|
4
|
+
attr_reader :width, :height, :x, :y
|
5
|
+
|
6
|
+
def initialize(value, container_dimensions, object_dimensions)
|
7
|
+
values = (value || "xMidYMid meet").strip.split(/\s+/)
|
8
|
+
@x = @y = 0
|
9
|
+
|
10
|
+
if values.first == "defer"
|
11
|
+
@defer = true
|
12
|
+
values.shift
|
13
|
+
end
|
14
|
+
|
15
|
+
@align, @meet_or_slice = values
|
16
|
+
|
17
|
+
w_container, h_container = container_dimensions
|
18
|
+
w_object, h_object = object_dimensions
|
19
|
+
|
20
|
+
container_ratio = w_container / h_container.to_f
|
21
|
+
object_ratio = w_object / h_object.to_f
|
22
|
+
|
23
|
+
if @align == "none"
|
24
|
+
@width, @height = container_dimensions
|
25
|
+
else
|
26
|
+
matches = @align.to_s.strip.match(/\Ax(Min|Mid|Max)Y(Min|Mid|Max)\z/i) || [nil, "Mid", "Mid"]
|
27
|
+
|
28
|
+
if (container_ratio > object_ratio) == slice?
|
29
|
+
@width, @height = [w_container, w_container / object_ratio]
|
30
|
+
@y = case matches[2].downcase
|
31
|
+
when "min" then 0
|
32
|
+
when "mid" then (h_container - w_container/object_ratio)/2
|
33
|
+
when "max" then h_container - w_container/object_ratio
|
34
|
+
end
|
35
|
+
else
|
36
|
+
@width, @height = [h_container * object_ratio, h_container]
|
37
|
+
@x = case matches[1].downcase
|
38
|
+
when "min" then 0
|
39
|
+
when "mid" then (w_container - h_container*object_ratio)/2
|
40
|
+
when "max" then w_container - h_container*object_ratio
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def slice?
|
47
|
+
@meet_or_slice == "slice"
|
48
|
+
end
|
49
|
+
|
50
|
+
def meet?
|
51
|
+
@meet_or_slice != "slice"
|
52
|
+
end
|
53
|
+
|
54
|
+
def inspect
|
55
|
+
"[AspectRatio: #{@width},#{@height} offset #{@x},#{@y}]"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Prawn::Svg::Calculators
|
2
|
+
class DocumentSizing
|
3
|
+
attr_writer :document_width, :document_height
|
4
|
+
attr_writer :view_box, :preserve_aspect_ratio
|
5
|
+
attr_writer :requested_width, :requested_height
|
6
|
+
|
7
|
+
attr_reader :x_offset, :y_offset, :x_scale, :y_scale
|
8
|
+
attr_reader :viewport_width, :viewport_height, :output_width, :output_height
|
9
|
+
|
10
|
+
def initialize(bounds, attributes = nil)
|
11
|
+
@bounds = bounds
|
12
|
+
set_from_attributes(attributes) if attributes
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_from_attributes(attributes)
|
16
|
+
@document_width = attributes['width']
|
17
|
+
@document_height = attributes['height']
|
18
|
+
@view_box = attributes['viewBox']
|
19
|
+
@preserve_aspect_ratio = attributes['preserveAspectRatio']
|
20
|
+
end
|
21
|
+
|
22
|
+
def calculate
|
23
|
+
@x_offset = @y_offset = 0
|
24
|
+
@x_scale = @y_scale = 1
|
25
|
+
|
26
|
+
width = Prawn::Svg::Calculators::Pixels.to_pixels(@document_width, @bounds[0])
|
27
|
+
height = Prawn::Svg::Calculators::Pixels.to_pixels(@document_height, @bounds[1])
|
28
|
+
|
29
|
+
default_aspect_ratio = "x#{width ? "Mid" : "Min"}Y#{height ? "Mid" : "Min"} meet"
|
30
|
+
|
31
|
+
width ||= @bounds[0]
|
32
|
+
height ||= @bounds[1]
|
33
|
+
|
34
|
+
if @view_box
|
35
|
+
values = @view_box.strip.split(/\s+/)
|
36
|
+
@x_offset, @y_offset, @viewport_width, @viewport_height = values.map {|value| value.to_f}
|
37
|
+
@x_offset = -@x_offset
|
38
|
+
|
39
|
+
@preserve_aspect_ratio ||= default_aspect_ratio
|
40
|
+
aspect = Prawn::Svg::Calculators::AspectRatio.new(@preserve_aspect_ratio, [width, height], [@viewport_width, @viewport_height])
|
41
|
+
@x_scale = aspect.width / @viewport_width
|
42
|
+
@y_scale = aspect.height / @viewport_height
|
43
|
+
@x_offset -= aspect.x
|
44
|
+
@y_offset -= aspect.y
|
45
|
+
end
|
46
|
+
|
47
|
+
@viewport_width ||= width
|
48
|
+
@viewport_height ||= height
|
49
|
+
|
50
|
+
if @requested_width
|
51
|
+
scale = @requested_width / width
|
52
|
+
width = @requested_width
|
53
|
+
height *= scale
|
54
|
+
@x_scale *= scale
|
55
|
+
@y_scale *= scale
|
56
|
+
|
57
|
+
elsif @requested_height
|
58
|
+
scale = @requested_height / height
|
59
|
+
height = @requested_height
|
60
|
+
width *= scale
|
61
|
+
@x_scale *= scale
|
62
|
+
@y_scale *= scale
|
63
|
+
end
|
64
|
+
|
65
|
+
@output_width = width
|
66
|
+
@output_height = height
|
67
|
+
|
68
|
+
self
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Prawn::Svg::Calculators
|
2
|
+
class Pixels
|
3
|
+
extend Prawn::Measurements
|
4
|
+
|
5
|
+
def self.to_pixels(value, axis_length)
|
6
|
+
if value.is_a?(String)
|
7
|
+
if match = value.match(/\d(cm|dm|ft|in|m|mm|yd)$/)
|
8
|
+
send("#{match[1]}2pt", value.to_f)
|
9
|
+
elsif match = value.match(/\dpc$/)
|
10
|
+
value.to_f * 15 # according to http://www.w3.org/TR/SVG11/coords.html
|
11
|
+
elsif value[-1..-1] == "%"
|
12
|
+
value.to_f * axis_length / 100.0
|
13
|
+
else
|
14
|
+
value.to_f
|
15
|
+
end
|
16
|
+
elsif value
|
17
|
+
value.to_f
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/prawn/svg/document.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
class Prawn::Svg::Document
|
2
|
-
include Prawn::Measurements
|
3
|
-
|
4
2
|
begin
|
5
3
|
require 'css_parser'
|
6
4
|
CSS_PARSER_LOADED = true
|
@@ -8,18 +6,14 @@ class Prawn::Svg::Document
|
|
8
6
|
CSS_PARSER_LOADED = false
|
9
7
|
end
|
10
8
|
|
11
|
-
DEFAULT_WIDTH = 640
|
12
|
-
DEFAULT_HEIGHT = 480
|
13
9
|
DEFAULT_FALLBACK_FONT_NAME = "Times-Roman"
|
14
10
|
|
15
11
|
# An +Array+ of warnings that occurred while parsing the SVG data.
|
16
12
|
attr_reader :warnings
|
17
|
-
|
18
|
-
# The scaling factor, as determined by the :width or :height options.
|
19
|
-
attr_accessor :scale
|
13
|
+
attr_writer :url_cache
|
20
14
|
|
21
15
|
attr_reader :root,
|
22
|
-
:
|
16
|
+
:sizing,
|
23
17
|
:cache_images, :fallback_font_name,
|
24
18
|
:css_parser, :elements_by_id
|
25
19
|
|
@@ -32,55 +26,32 @@ class Prawn::Svg::Document
|
|
32
26
|
@elements_by_id = {}
|
33
27
|
@cache_images = options[:cache_images]
|
34
28
|
@fallback_font_name = options.fetch(:fallback_font_name, DEFAULT_FALLBACK_FONT_NAME)
|
35
|
-
@actual_width, @actual_height = bounds # set this first so % width/heights can be used
|
36
|
-
|
37
|
-
if vb = @root.attributes['viewBox']
|
38
|
-
x1, y1, x2, y2 = vb.strip.split(/\s+/)
|
39
|
-
@x_offset, @y_offset = [x1.to_f, y1.to_f]
|
40
|
-
@actual_width, @actual_height = [x2.to_f - x1.to_f, y2.to_f - y1.to_f]
|
41
|
-
else
|
42
|
-
@x_offset, @y_offset = [0, 0]
|
43
|
-
@actual_width = points(@root.attributes['width'] || DEFAULT_WIDTH, :x)
|
44
|
-
@actual_height = points(@root.attributes['height'] || DEFAULT_HEIGHT, :y)
|
45
|
-
end
|
46
29
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
@height = @options[:height]
|
52
|
-
@scale = @options[:height] / @actual_height.to_f
|
53
|
-
else
|
54
|
-
@scale = 1
|
55
|
-
end
|
30
|
+
@sizing = Prawn::Svg::Calculators::DocumentSizing.new(bounds, @root.attributes)
|
31
|
+
sizing.requested_width = options[:width]
|
32
|
+
sizing.requested_height = options[:height]
|
33
|
+
sizing.calculate
|
56
34
|
|
57
|
-
|
58
|
-
@height ||= @actual_height * @scale
|
35
|
+
yield self if block_given?
|
59
36
|
end
|
60
37
|
|
61
38
|
def x(value)
|
62
|
-
|
39
|
+
points(value, :x)
|
63
40
|
end
|
64
41
|
|
65
42
|
def y(value)
|
66
|
-
|
43
|
+
sizing.output_height - points(value, :y)
|
67
44
|
end
|
68
45
|
|
69
46
|
def distance(value, axis = nil)
|
70
|
-
value &&
|
47
|
+
value && points(value, axis)
|
71
48
|
end
|
72
49
|
|
73
50
|
def points(value, axis = nil)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
else
|
80
|
-
value.to_f
|
81
|
-
end
|
82
|
-
else
|
83
|
-
value.to_f
|
84
|
-
end
|
51
|
+
Prawn::Svg::Calculators::Pixels.to_pixels(value, axis == :y ? sizing.viewport_height : sizing.viewport_width)
|
52
|
+
end
|
53
|
+
|
54
|
+
def url_loader
|
55
|
+
@url_loader ||= Prawn::Svg::UrlLoader.new(:enable_cache => cache_images)
|
85
56
|
end
|
86
57
|
end
|
data/lib/prawn/svg/element.rb
CHANGED
@@ -57,12 +57,23 @@ class Prawn::Svg::Element
|
|
57
57
|
draw_types = parse_fill_and_stroke_attributes_and_call
|
58
58
|
parse_stroke_width_attribute_and_call
|
59
59
|
parse_font_attributes_and_call
|
60
|
+
apply_drawing_call(draw_types)
|
61
|
+
end
|
60
62
|
|
61
|
-
|
62
|
-
|
63
|
+
def apply_drawing_call(draw_types)
|
64
|
+
if !@state[:disable_drawing] && !container?
|
65
|
+
if draw_types.empty?
|
66
|
+
add_call_and_enter("end_path")
|
67
|
+
else
|
68
|
+
add_call_and_enter(draw_types.join("_and_"))
|
69
|
+
end
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
73
|
+
def container?
|
74
|
+
Prawn::Svg::Parser::CONTAINER_TAGS.include?(name)
|
75
|
+
end
|
76
|
+
|
66
77
|
def parse_transform_attribute_and_call
|
67
78
|
return unless transform = @attributes['transform']
|
68
79
|
|
@@ -129,21 +140,19 @@ class Prawn::Svg::Element
|
|
129
140
|
end
|
130
141
|
|
131
142
|
def parse_fill_and_stroke_attributes_and_call
|
132
|
-
|
133
|
-
|
134
|
-
dec = @attributes[type.to_s]
|
143
|
+
["fill", "stroke"].select do |type|
|
144
|
+
dec = @attributes[type]
|
135
145
|
if dec == "none"
|
136
|
-
state[type] = false
|
146
|
+
state[type.to_sym] = false
|
137
147
|
elsif dec
|
138
|
-
state[type] = true
|
148
|
+
state[type.to_sym] = true
|
139
149
|
if color = Prawn::Svg::Color.color_to_hex(dec)
|
140
150
|
add_call "#{type}_color", color
|
141
151
|
end
|
142
152
|
end
|
143
153
|
|
144
|
-
|
154
|
+
state[type.to_sym]
|
145
155
|
end
|
146
|
-
draw_types
|
147
156
|
end
|
148
157
|
|
149
158
|
def parse_stroke_width_attribute_and_call
|
@@ -152,7 +161,7 @@ class Prawn::Svg::Element
|
|
152
161
|
|
153
162
|
def parse_font_attributes_and_call
|
154
163
|
if size = @attributes['font-size']
|
155
|
-
@state[:font_size] = size.to_f
|
164
|
+
@state[:font_size] = size.to_f
|
156
165
|
end
|
157
166
|
if weight = @attributes['font-weight']
|
158
167
|
font_updated = true
|
data/lib/prawn/svg/extension.rb
CHANGED
@@ -14,10 +14,10 @@ module Prawn
|
|
14
14
|
#
|
15
15
|
# svg IO.read("example.svg"), :at => [100, 300], :width => 600
|
16
16
|
#
|
17
|
-
def svg(data, options={})
|
18
|
-
svg = Prawn::Svg::Interface.new(data, self, options)
|
17
|
+
def svg(data, options = {}, &block)
|
18
|
+
svg = Prawn::Svg::Interface.new(data, self, options, &block)
|
19
19
|
svg.draw
|
20
|
-
{:warnings => svg.document.warnings, :width => svg.document.
|
20
|
+
{:warnings => svg.document.warnings, :width => svg.document.sizing.output_width, :height => svg.document.sizing.output_height}
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
data/lib/prawn/svg/interface.rb
CHANGED
@@ -24,7 +24,7 @@ module Prawn
|
|
24
24
|
# +options+ can optionally contain the key :width or :height. If both are
|
25
25
|
# specified, only :width will be used.
|
26
26
|
#
|
27
|
-
def initialize(data, prawn, options)
|
27
|
+
def initialize(data, prawn, options, &block)
|
28
28
|
@data = data
|
29
29
|
@prawn = prawn
|
30
30
|
@options = options
|
@@ -33,16 +33,16 @@ module Prawn
|
|
33
33
|
|
34
34
|
Prawn::Svg::Font.load_external_fonts(prawn.font_families)
|
35
35
|
|
36
|
-
@document = Document.new(data, [prawn.bounds.width, prawn.bounds.height], options)
|
36
|
+
@document = Document.new(data, [prawn.bounds.width, prawn.bounds.height], options, &block)
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
40
40
|
# Draws the SVG to the Prawn::Document object.
|
41
41
|
#
|
42
42
|
def draw
|
43
|
-
prawn.bounding_box(@options[:at], :width => @document.
|
43
|
+
prawn.bounding_box(@options[:at], :width => @document.sizing.output_width, :height => @document.sizing.output_height) do
|
44
44
|
prawn.save_graphics_state do
|
45
|
-
clip_rectangle 0, 0, @document.
|
45
|
+
clip_rectangle 0, 0, @document.sizing.output_width, @document.sizing.output_height
|
46
46
|
proc_creator(prawn, Parser.new(@document).parse).call
|
47
47
|
end
|
48
48
|
end
|
@@ -56,14 +56,18 @@ module Prawn
|
|
56
56
|
|
57
57
|
def issue_prawn_command(prawn, calls)
|
58
58
|
calls.each do |call, arguments, children|
|
59
|
-
if
|
59
|
+
if call == "end_path"
|
60
60
|
issue_prawn_command(prawn, children) if children.any?
|
61
|
+
prawn.add_content "n" # end path
|
62
|
+
|
63
|
+
elsif rewrite_call_arguments(prawn, call, arguments) == false
|
64
|
+
issue_prawn_command(prawn, children) if children.any?
|
65
|
+
|
66
|
+
elsif children.empty?
|
67
|
+
prawn.send(call, *arguments)
|
68
|
+
|
61
69
|
else
|
62
|
-
|
63
|
-
prawn.send(call, *arguments)
|
64
|
-
else
|
65
|
-
prawn.send(call, *arguments, &proc_creator(prawn, children))
|
66
|
-
end
|
70
|
+
prawn.send(call, *arguments, &proc_creator(prawn, children))
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
data/lib/prawn/svg/parser.rb
CHANGED
@@ -42,6 +42,19 @@ class Prawn::Svg::Parser
|
|
42
42
|
@document.warnings.clear
|
43
43
|
|
44
44
|
calls = [['fill_color', '000000', []]]
|
45
|
+
|
46
|
+
calls << [
|
47
|
+
'transformation_matrix',
|
48
|
+
[@document.sizing.x_scale, 0, 0, @document.sizing.y_scale, 0, 0],
|
49
|
+
[]
|
50
|
+
]
|
51
|
+
|
52
|
+
calls << [
|
53
|
+
'transformation_matrix',
|
54
|
+
[1, 0, 0, 1, @document.sizing.x_offset, @document.sizing.y_offset],
|
55
|
+
[]
|
56
|
+
]
|
57
|
+
|
45
58
|
root_element = Prawn::Svg::Element.new(@document, @document.root, calls, :ids => {}, :fill => true)
|
46
59
|
|
47
60
|
parse_element(root_element)
|