prawn-svg 0.24.0 → 0.25.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 +13 -9
- data/lib/prawn/svg/attributes.rb +1 -1
- data/lib/prawn/svg/attributes/space.rb +10 -0
- data/lib/prawn/svg/attributes/stroke.rb +2 -2
- data/lib/prawn/svg/attributes/transform.rb +2 -2
- data/lib/prawn/svg/calculators/document_sizing.rb +4 -5
- data/lib/prawn/svg/calculators/pixels.rb +27 -3
- data/lib/prawn/svg/document.rb +0 -18
- data/lib/prawn/svg/elements.rb +2 -2
- data/lib/prawn/svg/elements/base.rb +14 -2
- data/lib/prawn/svg/elements/circle.rb +1 -1
- data/lib/prawn/svg/elements/depth_first_base.rb +52 -0
- data/lib/prawn/svg/elements/ellipse.rb +2 -2
- data/lib/prawn/svg/elements/image.rb +2 -2
- data/lib/prawn/svg/elements/line.rb +4 -4
- data/lib/prawn/svg/elements/marker.rb +2 -2
- data/lib/prawn/svg/elements/rect.rb +3 -3
- data/lib/prawn/svg/elements/root.rb +5 -1
- data/lib/prawn/svg/elements/text.rb +47 -85
- data/lib/prawn/svg/elements/text_component.rb +186 -0
- data/lib/prawn/svg/elements/use.rb +1 -1
- data/lib/prawn/svg/elements/viewport.rb +28 -0
- data/lib/prawn/svg/interface.rb +20 -12
- data/lib/prawn/svg/pathable.rb +18 -2
- data/lib/prawn/svg/state.rb +3 -2
- data/lib/prawn/svg/version.rb +1 -1
- data/spec/prawn/svg/attributes/transform_spec.rb +2 -2
- data/spec/prawn/svg/calculators/pixels_spec.rb +72 -0
- data/spec/prawn/svg/document_spec.rb +0 -28
- data/spec/prawn/svg/elements/base_spec.rb +1 -1
- data/spec/prawn/svg/elements/gradient_spec.rb +1 -1
- data/spec/prawn/svg/elements/line_spec.rb +1 -1
- data/spec/prawn/svg/elements/marker_spec.rb +4 -0
- data/spec/prawn/svg/elements/text_spec.rb +104 -15
- data/spec/sample_svg/markers_degenerate_cp.svg +19 -0
- data/spec/sample_svg/offset_viewport.svg +8 -0
- data/spec/sample_svg/subviewports.svg +173 -0
- data/spec/sample_svg/subviewports2.svg +16 -0
- data/spec/sample_svg/tref01.svg +21 -0
- data/spec/sample_svg/tspan05.svg +40 -0
- data/spec/sample_svg/tspan91.svg +34 -0
- data/spec/spec_helper.rb +6 -0
- metadata +22 -2
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Prawn::SVG::Elements::Gradient do
|
4
4
|
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
|
-
let(:element) { Prawn::SVG::Elements::Gradient.new(document, document.root, [],
|
5
|
+
let(:element) { Prawn::SVG::Elements::Gradient.new(document, document.root, [], fake_state) }
|
6
6
|
|
7
7
|
before do
|
8
8
|
allow(element).to receive(:assert_compatible_prawn_version)
|
@@ -4,7 +4,7 @@ RSpec.describe Prawn::SVG::Elements::Line do
|
|
4
4
|
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
5
|
|
6
6
|
subject do
|
7
|
-
Prawn::SVG::Elements::Line.new(document, document.root, [],
|
7
|
+
Prawn::SVG::Elements::Line.new(document, document.root, [], fake_state)
|
8
8
|
end
|
9
9
|
|
10
10
|
context "with attributes specified" do
|
@@ -28,6 +28,10 @@ RSpec.describe Prawn::SVG::Elements::Marker do
|
|
28
28
|
Prawn::SVG::Elements::Marker.new(document, document.root.elements[1], [], state)
|
29
29
|
end
|
30
30
|
|
31
|
+
before do
|
32
|
+
state.viewport_sizing = document.sizing
|
33
|
+
end
|
34
|
+
|
31
35
|
describe "#parse" do
|
32
36
|
it "forces display none" do
|
33
37
|
subject.parse
|
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
2
|
|
3
3
|
describe Prawn::SVG::Elements::Text do
|
4
4
|
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}, font_registry: Prawn::SVG::FontRegistry.new("Helvetica" => {:normal => nil}, "Courier" => {normal: nil}, 'Times-Roman' => {normal: nil})) }
|
5
|
-
let(:element) { Prawn::SVG::Elements::Text.new(document, document.root, [],
|
5
|
+
let(:element) { Prawn::SVG::Elements::Text.new(document, document.root, [], fake_state) }
|
6
6
|
|
7
7
|
describe "xml:space preserve" do
|
8
8
|
let(:svg) { %(<text#{attributes}>some\n\t text</text>) }
|
@@ -13,9 +13,7 @@ describe Prawn::SVG::Elements::Text do
|
|
13
13
|
it "converts newlines and tabs to spaces, and preserves spaces" do
|
14
14
|
element.process
|
15
15
|
|
16
|
-
expect(element.calls).to
|
17
|
-
["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[0.0, 150.0]}], []]
|
18
|
-
]
|
16
|
+
expect(flatten_calls(element.calls)).to include ["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]]
|
19
17
|
end
|
20
18
|
end
|
21
19
|
|
@@ -25,20 +23,49 @@ describe Prawn::SVG::Elements::Text do
|
|
25
23
|
it "strips space" do
|
26
24
|
element.process
|
27
25
|
|
28
|
-
expect(element.calls).to
|
29
|
-
["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[0.0, 150.0]}], []]
|
30
|
-
]
|
26
|
+
expect(flatten_calls(element.calls)).to include ["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]]
|
31
27
|
end
|
32
28
|
end
|
33
29
|
end
|
34
30
|
|
31
|
+
describe "conventional whitespace handling" do
|
32
|
+
let(:svg) do
|
33
|
+
<<-SVG
|
34
|
+
<text>
|
35
|
+
<tspan>
|
36
|
+
</tspan>
|
37
|
+
Some text here
|
38
|
+
<tspan>More text</tspan>
|
39
|
+
Even more
|
40
|
+
<tspan></tspan>
|
41
|
+
<tspan>
|
42
|
+
leading goodness
|
43
|
+
</tspan>
|
44
|
+
ok
|
45
|
+
<tspan>
|
46
|
+
</tspan>
|
47
|
+
</text>
|
48
|
+
SVG
|
49
|
+
end
|
50
|
+
|
51
|
+
it "correctly apportions white space between the tags" do
|
52
|
+
element.process
|
53
|
+
calls = element.calls.flatten
|
54
|
+
expect(calls).to include "Some text here "
|
55
|
+
expect(calls).to include "More text"
|
56
|
+
expect(calls).to include "Even more"
|
57
|
+
expect(calls).to include " leading goodness "
|
58
|
+
expect(calls).to include "ok"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
35
62
|
describe "when text-anchor is specified" do
|
36
63
|
let(:svg) { '<g text-anchor="middle" font-size="12"><text x="50" y="14">Text</text></g>' }
|
37
|
-
let(:element) { Prawn::SVG::Elements::Container.new(document, document.root, [],
|
64
|
+
let(:element) { Prawn::SVG::Elements::Container.new(document, document.root, [], fake_state) }
|
38
65
|
|
39
66
|
it "should inherit text-anchor from parent element" do
|
40
67
|
element.process
|
41
|
-
expect(element.calls.flatten).to include(:size => 12.0, :style => :normal, :text_anchor => "middle", :at => [50.0, 136.0])
|
68
|
+
expect(element.calls.flatten).to include(:size => 12.0, :style => :normal, :text_anchor => "middle", :at => [50.0, 136.0], :offset => [0,0])
|
42
69
|
end
|
43
70
|
end
|
44
71
|
|
@@ -49,11 +76,11 @@ describe Prawn::SVG::Elements::Text do
|
|
49
76
|
element.process
|
50
77
|
|
51
78
|
expect(element.base_calls).to eq [
|
52
|
-
["
|
53
|
-
["
|
54
|
-
|
79
|
+
["text_group", [], [
|
80
|
+
["fill", [], [
|
81
|
+
["font", ["Helvetica", {style: :normal}], []],
|
55
82
|
["character_spacing", [5.0], [
|
56
|
-
["draw_text", ["spaced", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[
|
83
|
+
["draw_text", ["spaced", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}], []]
|
57
84
|
]]
|
58
85
|
]]
|
59
86
|
]]
|
@@ -67,7 +94,7 @@ describe Prawn::SVG::Elements::Text do
|
|
67
94
|
|
68
95
|
it "finds the font and uses it" do
|
69
96
|
element.process
|
70
|
-
expect(element.base_calls
|
97
|
+
expect(flatten_calls(element.base_calls)).to include ['font', ['Courier', {style: :normal}]]
|
71
98
|
end
|
72
99
|
end
|
73
100
|
|
@@ -76,7 +103,7 @@ describe Prawn::SVG::Elements::Text do
|
|
76
103
|
|
77
104
|
it "uses the fallback font" do
|
78
105
|
element.process
|
79
|
-
expect(element.base_calls
|
106
|
+
expect(flatten_calls(element.base_calls)).to include ['font', ['Times-Roman', {style: :normal}]]
|
80
107
|
end
|
81
108
|
|
82
109
|
context "when there is no fallback font" do
|
@@ -90,4 +117,66 @@ describe Prawn::SVG::Elements::Text do
|
|
90
117
|
end
|
91
118
|
end
|
92
119
|
end
|
120
|
+
|
121
|
+
describe "<tref>" do
|
122
|
+
let(:svg) { '<svg xmlns:xlink="http://www.w3.org/1999/xlink"><defs><text id="ref" fill="green">my reference text</text></defs><text x="10"><tref xlink:href="#ref" fill="red" /></text></svg>' }
|
123
|
+
let(:element) { Prawn::SVG::Elements::Root.new(document, document.root, [], fake_state) }
|
124
|
+
|
125
|
+
it "references the text" do
|
126
|
+
element.process
|
127
|
+
expect(flatten_calls(element.base_calls)[11..15]).to eq [
|
128
|
+
["fill_color", ["ff0000"]],
|
129
|
+
["fill", []],
|
130
|
+
["font", ["Helvetica", {:style=>:normal}]],
|
131
|
+
["character_spacing", [0]],
|
132
|
+
["draw_text", ["my reference text", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[0,0]}]],
|
133
|
+
]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "dx and dy attributes" do
|
138
|
+
let(:svg) { '<text x="10 20" dx="30 50 80" dy="2">Hi there, this is a good test</text>' }
|
139
|
+
|
140
|
+
it "correctly calculates the positinos of the text" do
|
141
|
+
element.process
|
142
|
+
|
143
|
+
expect(flatten_calls(element.base_calls)).to eq [
|
144
|
+
["text_group", []],
|
145
|
+
["fill", []],
|
146
|
+
["font", ["Helvetica", {:style=>:normal}]],
|
147
|
+
["character_spacing", [0]],
|
148
|
+
["draw_text", ["H", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[30.0, 2.0]}]],
|
149
|
+
["draw_text", ["i", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[20.0, :relative], :offset=>[50.0, 0]}]],
|
150
|
+
["draw_text", [" there, this is a good test", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[80.0, 0]}]]
|
151
|
+
]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe "rotate attribute" do
|
156
|
+
let(:svg) { '<text rotate="10 20 30 40 50 60 70 80 90 100">Hi <tspan rotate="0">this</tspan> ok!</text>' }
|
157
|
+
|
158
|
+
it "correctly calculates the positinos of the text" do
|
159
|
+
element.process
|
160
|
+
|
161
|
+
expect(flatten_calls(element.base_calls)).to eq [
|
162
|
+
["text_group", []],
|
163
|
+
["fill", []],
|
164
|
+
["font", ["Helvetica", {:style=>:normal}]],
|
165
|
+
["character_spacing", [0]],
|
166
|
+
["draw_text", ["H", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-10.0}]],
|
167
|
+
["draw_text", ["i", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-20.0}]],
|
168
|
+
["draw_text", [" ", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-30.0}]],
|
169
|
+
["save", []],
|
170
|
+
["fill", []],
|
171
|
+
["font", ["Helvetica", {:style=>:normal}]],
|
172
|
+
["character_spacing", [0]],
|
173
|
+
["draw_text", ["this", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0]}]],
|
174
|
+
["restore", []],
|
175
|
+
["draw_text", [" ", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-80.0}]],
|
176
|
+
["draw_text", ["o", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-90.0}]],
|
177
|
+
["draw_text", ["k", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}]],
|
178
|
+
["draw_text", ["!", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}]]
|
179
|
+
]
|
180
|
+
end
|
181
|
+
end
|
93
182
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<svg width="240" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<defs>
|
3
|
+
<marker id="Triangle"
|
4
|
+
refX="0" refY="12" markerUnits="userSpaceOnUse"
|
5
|
+
markerWidth="24" markerHeight="24" orient="auto">
|
6
|
+
<path d="M 0 0 L 24 12 L 0 24 z" />
|
7
|
+
</marker>
|
8
|
+
</defs>
|
9
|
+
|
10
|
+
<!-- CP vectors are zero. Orientation should still work. -->
|
11
|
+
|
12
|
+
<path d="M 50,125 C 50,125, 100,25, 100,25" stroke-width="10" stroke="red"
|
13
|
+
marker-start="url(#Triangle)"
|
14
|
+
marker-end="url(#Triangle)" />
|
15
|
+
|
16
|
+
<path d="M 150,125 C 200,25, 200,25, 200,25" stroke-width="10" stroke="red"
|
17
|
+
marker-start="url(#Triangle)"
|
18
|
+
marker-end="url(#Triangle)" />
|
19
|
+
</svg>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
<svg width="1440px" height="750px" version="1.1"
|
4
|
+
viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
5
|
+
<rect x="0" y="0" width="100" height="100"
|
6
|
+
fill="yellow" stroke="blue" stroke-width="12" />
|
7
|
+
</svg>
|
8
|
+
|
@@ -0,0 +1,173 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
|
4
|
+
<svg width="450px" height="300px" version="1.1"
|
5
|
+
xmlns="http://www.w3.org/2000/svg">
|
6
|
+
<desc>Example PreserveAspectRatio - illustrates preserveAspectRatio attribute</desc>
|
7
|
+
<rect x="1" y="1" width="448" height="298"
|
8
|
+
fill="none" stroke="blue"/>
|
9
|
+
<g font-size="9">
|
10
|
+
<text x="10" y="30">SVG to fit</text>
|
11
|
+
<g transform="translate(20,40)">
|
12
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
13
|
+
<g transform='translate(0, 5)'>
|
14
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
15
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
16
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
17
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
18
|
+
</g>
|
19
|
+
</g>
|
20
|
+
<text x="10" y="110">Viewport 1</text>
|
21
|
+
<g transform="translate(10,120)"><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/></g>
|
22
|
+
<text x="10" y="180">Viewport 2</text>
|
23
|
+
<g transform="translate(20,190)"><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/></g>
|
24
|
+
|
25
|
+
<g id="meet-group-1" transform="translate(100, 60)">
|
26
|
+
<text x="0" y="-30">--------------- meet ---------------</text>
|
27
|
+
<g><text y="-10">xMin*</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
28
|
+
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40"
|
29
|
+
width="50" height="30">
|
30
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
31
|
+
<g transform='translate(0, 5)'>
|
32
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
33
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
34
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
35
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
36
|
+
</g>
|
37
|
+
</svg></g>
|
38
|
+
<g transform="translate(70,0)"><text y="-10">xMid*</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
39
|
+
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40"
|
40
|
+
width="50" height="30">
|
41
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
42
|
+
<g transform='translate(0, 5)'>
|
43
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
44
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
45
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
46
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
47
|
+
</g>
|
48
|
+
</svg></g>
|
49
|
+
<g transform="translate(0,70)"><text y="-10">xMax*</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
50
|
+
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40"
|
51
|
+
width="50" height="30">
|
52
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
53
|
+
<g transform='translate(0, 5)'>
|
54
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
55
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
56
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
57
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
58
|
+
</g>
|
59
|
+
</svg></g>
|
60
|
+
</g>
|
61
|
+
|
62
|
+
<g id="meet-group-2" transform="translate(250, 60)">
|
63
|
+
<text x="0" y="-30">---------- meet ----------</text>
|
64
|
+
<g><text y="-10">*YMin</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
65
|
+
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40"
|
66
|
+
width="30" height="60">
|
67
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
68
|
+
<g transform='translate(0, 5)'>
|
69
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
70
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
71
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
72
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
73
|
+
</g>
|
74
|
+
</svg></g>
|
75
|
+
<g transform="translate(50, 0)"><text y="-10">*YMid</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
76
|
+
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40"
|
77
|
+
width="30" height="60">
|
78
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
79
|
+
<g transform='translate(0, 5)'>
|
80
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
81
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
82
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
83
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
84
|
+
</g>
|
85
|
+
</svg></g>
|
86
|
+
<g transform="translate(100, 0)"><text y="-10">*YMax</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
87
|
+
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40"
|
88
|
+
width="30" height="60">
|
89
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
90
|
+
<g transform='translate(0, 5)'>
|
91
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
92
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
93
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
94
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
95
|
+
</g>
|
96
|
+
</svg></g>
|
97
|
+
</g>
|
98
|
+
|
99
|
+
<g id="slice-group-1" transform="translate(100, 220)">
|
100
|
+
<text x="0" y="-30">---------- slice ----------</text>
|
101
|
+
<g><text y="-10">xMin*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
102
|
+
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40"
|
103
|
+
width="30" height="60">
|
104
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
105
|
+
<g transform='translate(0, 5)'>
|
106
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
107
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
108
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
109
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
110
|
+
</g>
|
111
|
+
</svg></g>
|
112
|
+
<g transform="translate(50,0)"><text y="-10">xMid*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
113
|
+
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40"
|
114
|
+
width="30" height="60">
|
115
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
116
|
+
<g transform='translate(0, 5)'>
|
117
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
118
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
119
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
120
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
121
|
+
</g>
|
122
|
+
</svg></g>
|
123
|
+
<g transform="translate(100,0)"><text y="-10">xMax*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
|
124
|
+
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40"
|
125
|
+
width="30" height="60">
|
126
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
127
|
+
<g transform='translate(0, 5)'>
|
128
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
129
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
130
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
131
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
132
|
+
</g>
|
133
|
+
</svg></g>
|
134
|
+
</g>
|
135
|
+
|
136
|
+
<g id="slice-group-2" transform="translate(250, 220)">
|
137
|
+
<text x="0" y="-30">--------------- slice ---------------</text>
|
138
|
+
<g><text y="-10">*YMin</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
139
|
+
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40"
|
140
|
+
width="50" height="30">
|
141
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
142
|
+
<g transform='translate(0, 5)'>
|
143
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
144
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
145
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
146
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
147
|
+
</g>
|
148
|
+
</svg></g>
|
149
|
+
<g transform="translate(70,0)"><text y="-10">*YMid</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
150
|
+
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40"
|
151
|
+
width="50" height="30">
|
152
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
153
|
+
<g transform='translate(0, 5)'>
|
154
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
155
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
156
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
157
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
158
|
+
</g>
|
159
|
+
</svg></g>
|
160
|
+
<g transform="translate(140,0)"><text y="-10">*YMax</text><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
|
161
|
+
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40"
|
162
|
+
width="50" height="30">
|
163
|
+
<rect x='.5' y='.5' width='29' height='39' fill='black' stroke='red'/>
|
164
|
+
<g transform='translate(0, 5)'>
|
165
|
+
<circle cx='15' cy='15' r='10' fill='yellow'/>
|
166
|
+
<circle cx='12' cy='12' r='1.5' fill='black'/>
|
167
|
+
<circle cx='17' cy='12' r='1.5' fill='black'/>
|
168
|
+
<path d='M 10 19 A 8 8 0 0 0 20 19' stroke='black' stroke-width='2'/>
|
169
|
+
</g>
|
170
|
+
</svg></g>
|
171
|
+
</g>
|
172
|
+
</g>
|
173
|
+
</svg>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
|
4
|
+
<svg width="450px" height="300px" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
5
|
+
<g transform="translate(100, 100)">
|
6
|
+
<rect x='.5' y='.5' width='199' height='149' fill='none' stroke='blue' />
|
7
|
+
<svg width="200" height="150" viewBox="0 0 100 100">
|
8
|
+
<rect x=".5" y=".5" width="99" height="99" fill='none' stroke='green' />
|
9
|
+
|
10
|
+
<rect x="25.5" y="25.5" width="49" height="49" fill='none' stroke='blue' />
|
11
|
+
<svg x="25%" y="25%" width="50%" height="50%" viewBox="0 0 100 100">
|
12
|
+
<rect x="5" y="5" width="90" height="90" fill='green' />
|
13
|
+
</svg>
|
14
|
+
</svg>
|
15
|
+
</g>
|
16
|
+
</svg>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
<svg width="10cm" height="3cm" viewBox="0 0 1000 300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
4
|
+
<defs>
|
5
|
+
<text id="ReferencedText" fill="orange">
|
6
|
+
Referenced character data
|
7
|
+
</text>
|
8
|
+
</defs>
|
9
|
+
<desc>Example tref01 - inline vs reference text content</desc>
|
10
|
+
|
11
|
+
<text x="100" y="100" font-size="45" fill="blue" >
|
12
|
+
Inline character data
|
13
|
+
</text>
|
14
|
+
<text x="100" y="200" font-size="45" fill="red" >
|
15
|
+
<tref xlink:href="#ReferencedText" font-size="70" />
|
16
|
+
</text>
|
17
|
+
|
18
|
+
<!-- Show outline of canvas using 'rect' element -->
|
19
|
+
<rect x="1" y="1" width="998" height="298"
|
20
|
+
fill="none" stroke="blue" stroke-width="2" />
|
21
|
+
</svg>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
3
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg width="100%" viewBox="0 0 500 120"
|
5
|
+
xmlns="http://www.w3.org/2000/svg" version="1.1">
|
6
|
+
<desc>
|
7
|
+
Example tspan05 - propagation of rotation values to nested tspan elements.
|
8
|
+
</desc>
|
9
|
+
<text id="parent" font-family="Arial, sans-serif" font-size="32" fill="red" x="40" y="40"
|
10
|
+
rotate="5,15,25,35,45,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,0,0,0,0,0,0,-30">
|
11
|
+
<tspan> </tspan>
|
12
|
+
Not
|
13
|
+
|
14
|
+
<tspan id="child1" rotate="-10,-20,-30,-40" fill="orange">
|
15
|
+
all characters
|
16
|
+
|
17
|
+
<tspan id="child2" rotate="0" fill="yellow">
|
18
|
+
in<tspan></tspan><tspan id="child3">the
|
19
|
+
</tspan>
|
20
|
+
</tspan>
|
21
|
+
|
22
|
+
<tspan id="child4" fill="orange" x="40" y="90">
|
23
|
+
text
|
24
|
+
</tspan>
|
25
|
+
|
26
|
+
have a
|
27
|
+
</tspan>
|
28
|
+
|
29
|
+
<tspan id="child5" rotate="-10" fill="blue">
|
30
|
+
specified
|
31
|
+
</tspan>
|
32
|
+
|
33
|
+
rotation
|
34
|
+
<tspan> </tspan>
|
35
|
+
</text>
|
36
|
+
|
37
|
+
<!-- Show outline of canvas using 'rect' element -->
|
38
|
+
<rect x="1" y="1" width="498" height="118" fill="none"
|
39
|
+
stroke="blue" stroke-width="2" />
|
40
|
+
</svg>
|