text2path 0.0.1
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 +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +14 -0
- data/README.md +40 -0
- data/lib/ext/savage/LICENSE +20 -0
- data/lib/ext/savage/README.rdoc +108 -0
- data/lib/ext/savage/Rakefile +39 -0
- data/lib/ext/savage/VERSION +1 -0
- data/lib/ext/savage/lib/savage/direction.rb +42 -0
- data/lib/ext/savage/lib/savage/direction_proxy.rb +19 -0
- data/lib/ext/savage/lib/savage/directions/arc_to.rb +29 -0
- data/lib/ext/savage/lib/savage/directions/close_path.rb +18 -0
- data/lib/ext/savage/lib/savage/directions/coordinate_target.rb +17 -0
- data/lib/ext/savage/lib/savage/directions/cubic_curve_to.rb +40 -0
- data/lib/ext/savage/lib/savage/directions/horizontal_to.rb +19 -0
- data/lib/ext/savage/lib/savage/directions/line_to.rb +15 -0
- data/lib/ext/savage/lib/savage/directions/move_to.rb +15 -0
- data/lib/ext/savage/lib/savage/directions/point_target.rb +17 -0
- data/lib/ext/savage/lib/savage/directions/quadratic_curve_to.rb +44 -0
- data/lib/ext/savage/lib/savage/directions/vertical_to.rb +19 -0
- data/lib/ext/savage/lib/savage/parser.rb +108 -0
- data/lib/ext/savage/lib/savage/path.rb +50 -0
- data/lib/ext/savage/lib/savage/sub_path.rb +54 -0
- data/lib/ext/savage/lib/savage/transformable.rb +48 -0
- data/lib/ext/savage/lib/savage/utils.rb +7 -0
- data/lib/ext/savage/lib/savage.rb +3 -0
- data/lib/ext/savage/savage.gemspec +80 -0
- data/lib/ext/savage/spec/savage/directions/arc_to_spec.rb +97 -0
- data/lib/ext/savage/spec/savage/directions/close_path_spec.rb +30 -0
- data/lib/ext/savage/spec/savage/directions/cubic_curve_to_spec.rb +146 -0
- data/lib/ext/savage/spec/savage/directions/horizontal_to_spec.rb +10 -0
- data/lib/ext/savage/spec/savage/directions/line_to_spec.rb +10 -0
- data/lib/ext/savage/spec/savage/directions/move_to_spec.rb +10 -0
- data/lib/ext/savage/spec/savage/directions/point_spec.rb +12 -0
- data/lib/ext/savage/spec/savage/directions/quadratic_curve_spec.rb +123 -0
- data/lib/ext/savage/spec/savage/directions/vertical_to_spec.rb +10 -0
- data/lib/ext/savage/spec/savage/parser_spec.rb +250 -0
- data/lib/ext/savage/spec/savage/path_spec.rb +105 -0
- data/lib/ext/savage/spec/savage/sub_path_spec.rb +195 -0
- data/lib/ext/savage/spec/savage/transformable_spec.rb +62 -0
- data/lib/ext/savage/spec/savage_spec.rb +5 -0
- data/lib/ext/savage/spec/shared/command.rb +13 -0
- data/lib/ext/savage/spec/shared/coordinate_target.rb +36 -0
- data/lib/ext/savage/spec/shared/direction.rb +29 -0
- data/lib/ext/savage/spec/shared/point_target.rb +45 -0
- data/lib/ext/savage/spec/spec_helper.rb +36 -0
- data/lib/text2path/converter.rb +65 -0
- data/lib/text2path/glyph.rb +13 -0
- data/lib/text2path/svg_font.rb +92 -0
- data/lib/text2path/svg_path.rb +38 -0
- data/lib/text2path/version.rb +3 -0
- data/lib/text2path.rb +10 -0
- data/libpeerconnection.log +0 -0
- data/out.svg +1 -0
- data/test.rb +6 -0
- metadata +127 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
module Savage
|
2
|
+
class Path
|
3
|
+
require File.dirname(__FILE__) + "/direction_proxy"
|
4
|
+
require File.dirname(__FILE__) + "/sub_path"
|
5
|
+
|
6
|
+
include Utils
|
7
|
+
include DirectionProxy
|
8
|
+
include Transformable
|
9
|
+
|
10
|
+
attr_accessor :subpaths
|
11
|
+
|
12
|
+
define_proxies do |sym,const|
|
13
|
+
define_method(sym) do |*args|
|
14
|
+
@subpaths.last.send(sym,*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(*args)
|
19
|
+
@subpaths = [SubPath.new]
|
20
|
+
@subpaths.last.move_to(*args) if (2..3).include?(*args.length)
|
21
|
+
yield self if block_given?
|
22
|
+
end
|
23
|
+
|
24
|
+
def directions
|
25
|
+
directions = []
|
26
|
+
@subpaths.each { |subpath| directions.concat(subpath.directions) }
|
27
|
+
directions
|
28
|
+
end
|
29
|
+
|
30
|
+
def move_to(*args)
|
31
|
+
unless (@subpaths.last.directions.empty?)
|
32
|
+
(@subpaths << SubPath.new(*args)).last
|
33
|
+
else
|
34
|
+
@subpaths.last.move_to(*args)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def closed?
|
39
|
+
@subpaths.last.closed?
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_command
|
43
|
+
@subpaths.collect { |subpath| subpath.to_command }.join
|
44
|
+
end
|
45
|
+
|
46
|
+
def transform(*args)
|
47
|
+
@subpaths.each {|subpath| subpath.transform *args }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Savage
|
2
|
+
class SubPath
|
3
|
+
include Utils
|
4
|
+
include DirectionProxy
|
5
|
+
include Transformable
|
6
|
+
|
7
|
+
define_proxies do |sym,const|
|
8
|
+
define_method(sym) do |*args|
|
9
|
+
raise TypeError if const == "QuadraticCurveTo" && @directions.last.class != Directions::QuadraticCurveTo && [2,3].include?(args.length)
|
10
|
+
raise TypeError if const == "CubicCurveTo" && @directions.last.class != Directions::CubicCurveTo && [4,5].include?(args.length)
|
11
|
+
(@directions << Savage::Directions.const_get(const).new(*args)).last
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :directions
|
16
|
+
|
17
|
+
def move_to(*args)
|
18
|
+
return nil unless @directions.empty?
|
19
|
+
(@directions << Directions::MoveTo.new(*args)).last
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(*args)
|
23
|
+
@directions = []
|
24
|
+
move_to(*args) if (2..3).include?(args.length)
|
25
|
+
yield self if block_given?
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_command
|
29
|
+
@directions.to_enum(:each_with_index).collect { |dir, i|
|
30
|
+
command_string = dir.to_command
|
31
|
+
if i > 0
|
32
|
+
prev_command_code = @directions[i-1].command_code
|
33
|
+
if dir.command_code == prev_command_code || (prev_command_code.match(/^[Mm]$/) && dir.command_code == 'L')
|
34
|
+
command_string.gsub!(/^[A-Za-z]/,'')
|
35
|
+
command_string.insert(0,' ') unless command_string.match(/^-/)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
command_string
|
39
|
+
}.join
|
40
|
+
end
|
41
|
+
|
42
|
+
def commands
|
43
|
+
@directions
|
44
|
+
end
|
45
|
+
|
46
|
+
def closed?
|
47
|
+
@directions.last.kind_of? Directions::ClosePath
|
48
|
+
end
|
49
|
+
|
50
|
+
def transform(*args)
|
51
|
+
directions.each { |dir| dir.transform *args }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
require 'bigdecimal/util'
|
3
|
+
|
4
|
+
module Savage
|
5
|
+
|
6
|
+
module Transformable
|
7
|
+
|
8
|
+
# Matrix:
|
9
|
+
def transform(scale_x, skew_x, skew_y, scale_y, tx, ty)
|
10
|
+
end
|
11
|
+
|
12
|
+
def translate(tx, ty=0)
|
13
|
+
transform( 1, 0, 0, 1, tx, ty )
|
14
|
+
end
|
15
|
+
|
16
|
+
def scale(sx, sy=sx)
|
17
|
+
transform( sx, 0, 0, sy, 0, 0 )
|
18
|
+
end
|
19
|
+
|
20
|
+
# TODO:
|
21
|
+
# make cx, cy be origin center
|
22
|
+
def rotate( angle, cx=0, cy=0 )
|
23
|
+
a = (angle.to_f/180).to_d * Math::PI
|
24
|
+
translate( cx, cy )
|
25
|
+
transform( Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0)
|
26
|
+
translate( -cx, -cy )
|
27
|
+
end
|
28
|
+
|
29
|
+
def skew_x( angle )
|
30
|
+
a = angle.to_f/180 * Math::PI
|
31
|
+
transform( 1, 0, Math.tan(a), 1, 0, 0 )
|
32
|
+
end
|
33
|
+
|
34
|
+
def skew_y( angle )
|
35
|
+
a = angle.to_f/180 * Math::PI
|
36
|
+
transform( 1, Math.tan(a), 0, 1, 0, 0 )
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def transform_dot( dot, scale_x, skew_x, skew_y, scale_y, tx, ty )
|
42
|
+
x, y = dot.x, dot.y
|
43
|
+
dot.x = x*scale_x + y*skew_x + tx
|
44
|
+
dot.y = x*skew_y + y*scale_y + ty
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "savage"
|
8
|
+
s.version = "1.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jeremy Holland"]
|
12
|
+
s.date = "2013-01-10"
|
13
|
+
s.description = "A little gem for extracting and manipulating SVG vector path data."
|
14
|
+
s.email = "jeremy@jeremypholland.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/savage.rb",
|
27
|
+
"lib/savage/direction.rb",
|
28
|
+
"lib/savage/direction_proxy.rb",
|
29
|
+
"lib/savage/directions/arc_to.rb",
|
30
|
+
"lib/savage/directions/close_path.rb",
|
31
|
+
"lib/savage/directions/coordinate_target.rb",
|
32
|
+
"lib/savage/directions/cubic_curve_to.rb",
|
33
|
+
"lib/savage/directions/horizontal_to.rb",
|
34
|
+
"lib/savage/directions/line_to.rb",
|
35
|
+
"lib/savage/directions/move_to.rb",
|
36
|
+
"lib/savage/directions/point_target.rb",
|
37
|
+
"lib/savage/directions/quadratic_curve_to.rb",
|
38
|
+
"lib/savage/directions/vertical_to.rb",
|
39
|
+
"lib/savage/parser.rb",
|
40
|
+
"lib/savage/path.rb",
|
41
|
+
"lib/savage/sub_path.rb",
|
42
|
+
"lib/savage/utils.rb",
|
43
|
+
"savage.gemspec",
|
44
|
+
"spec/savage/directions/arc_to_spec.rb",
|
45
|
+
"spec/savage/directions/close_path_spec.rb",
|
46
|
+
"spec/savage/directions/cubic_curve_to_spec.rb",
|
47
|
+
"spec/savage/directions/horizontal_to_spec.rb",
|
48
|
+
"spec/savage/directions/line_to_spec.rb",
|
49
|
+
"spec/savage/directions/move_to_spec.rb",
|
50
|
+
"spec/savage/directions/point_spec.rb",
|
51
|
+
"spec/savage/directions/quadratic_curve_spec.rb",
|
52
|
+
"spec/savage/directions/vertical_to_spec.rb",
|
53
|
+
"spec/savage/parser_spec.rb",
|
54
|
+
"spec/savage/path_spec.rb",
|
55
|
+
"spec/savage/sub_path_spec.rb",
|
56
|
+
"spec/savage_spec.rb",
|
57
|
+
"spec/shared/command.rb",
|
58
|
+
"spec/shared/coordinate_target.rb",
|
59
|
+
"spec/shared/direction.rb",
|
60
|
+
"spec/shared/point_target.rb",
|
61
|
+
"spec/spec_helper.rb"
|
62
|
+
]
|
63
|
+
s.homepage = "http://github.com/awebneck/savage"
|
64
|
+
s.require_paths = ["lib"]
|
65
|
+
s.rubygems_version = "1.8.24"
|
66
|
+
s.summary = "A little library to manipulate SVG path data"
|
67
|
+
|
68
|
+
if s.respond_to? :specification_version then
|
69
|
+
s.specification_version = 3
|
70
|
+
|
71
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
72
|
+
s.add_development_dependency(%q<rspec>, [">= 2.3.0"])
|
73
|
+
else
|
74
|
+
s.add_dependency(%q<rspec>, [">= 2.3.0"])
|
75
|
+
end
|
76
|
+
else
|
77
|
+
s.add_dependency(%q<rspec>, [">= 2.3.0"])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe ArcTo do
|
6
|
+
def dir_class; ArcTo; end
|
7
|
+
def create_relative; ArcTo.new(100,200,300,true,false,400,500,false); end
|
8
|
+
def command_code; 'a'; end
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
@dir = dir_class.new(100,200,300,true,false,400,500)
|
12
|
+
end
|
13
|
+
|
14
|
+
include Command
|
15
|
+
it_behaves_like 'Direction'
|
16
|
+
|
17
|
+
it 'should have a target' do
|
18
|
+
@dir.respond_to?(:target).should == true
|
19
|
+
@dir.target.class.should == Point
|
20
|
+
end
|
21
|
+
it 'should have a radius' do
|
22
|
+
@dir.respond_to?(:radius).should == true
|
23
|
+
@dir.radius.class.should == Point
|
24
|
+
end
|
25
|
+
it 'should have a large arc based on the constructor argument' do
|
26
|
+
@dir.respond_to?(:large_arc).should == true
|
27
|
+
@dir.large_arc.should == true
|
28
|
+
end
|
29
|
+
it 'should have a sweep based on the constructor argument' do
|
30
|
+
@dir.respond_to?(:sweep).should == true
|
31
|
+
@dir.sweep.should == false
|
32
|
+
end
|
33
|
+
it 'should have a rotation based on the constructor arugment' do
|
34
|
+
@dir.respond_to?(:rotation).should == true
|
35
|
+
@dir.rotation.should == 300
|
36
|
+
end
|
37
|
+
it 'should have an accessible target x, based on the constructor argument' do
|
38
|
+
@dir.target.x.should == 400
|
39
|
+
end
|
40
|
+
it 'should have an accessible target y, based on the constructor argument' do
|
41
|
+
@dir.target.y.should == 500
|
42
|
+
end
|
43
|
+
it 'should have an accessible x radius, based on the constructor argument' do
|
44
|
+
@dir.radius.x.should == 100
|
45
|
+
end
|
46
|
+
it 'should have an accessible y radius, based on the constructor argument' do
|
47
|
+
@dir.radius.y.should == 200
|
48
|
+
end
|
49
|
+
it 'should be constructed with at least x and y radii, rotation, large arc, sweep, and target x and y parameters' do
|
50
|
+
lambda { dir_class.new }.should raise_error
|
51
|
+
lambda { dir_class.new 45 }.should raise_error
|
52
|
+
lambda { dir_class.new 45, 50 }.should raise_error
|
53
|
+
lambda { dir_class.new 45, 50, 60 }.should raise_error
|
54
|
+
lambda { dir_class.new 45, 50, 60, true }.should raise_error
|
55
|
+
lambda { dir_class.new 45, 50, 60, true, true }.should raise_error
|
56
|
+
lambda { dir_class.new 45, 50, 60, true, true, 100 }.should raise_error
|
57
|
+
lambda { dir_class.new 45, 50, 60, true, true, 100, 200 }.should_not raise_error
|
58
|
+
end
|
59
|
+
it 'should be relative if constructed with a false eighth parameter' do
|
60
|
+
direction = dir_class.new 45, 50, 60, true, true, 100, 200, false
|
61
|
+
direction.absolute?.should == false
|
62
|
+
end
|
63
|
+
it 'should be absolute if constructed with a true eighth parameter' do
|
64
|
+
direction = dir_class.new 45, 50, 60, true, true, 100, 200, true
|
65
|
+
direction.absolute?.should == true
|
66
|
+
end
|
67
|
+
it 'should be absolute if constructed with only seven parameters' do
|
68
|
+
direction = dir_class.new 45, 50, 60, true, true, 100, 200
|
69
|
+
direction.absolute?.should == true
|
70
|
+
end
|
71
|
+
describe '#to_command' do
|
72
|
+
it 'should have exactly 7 numerical parameters' do
|
73
|
+
extract_coordinates(@dir.to_command).length.should == 7
|
74
|
+
end
|
75
|
+
it 'should show the provided x radius value as the first parameter' do
|
76
|
+
extract_coordinates(@dir.to_command)[0].should == 100
|
77
|
+
end
|
78
|
+
it 'should show the provided y radius value as the second parameter' do
|
79
|
+
extract_coordinates(@dir.to_command)[1].should == 200
|
80
|
+
end
|
81
|
+
it 'should show the provided rotation value as the third parameter' do
|
82
|
+
extract_coordinates(@dir.to_command)[2].should == 300
|
83
|
+
end
|
84
|
+
it 'should show the integer interpretation of the provided large arc value as the fourth parameter' do
|
85
|
+
extract_coordinates(@dir.to_command)[3].should == 1
|
86
|
+
end
|
87
|
+
it 'should show the integer interpretation of the provided sweep value as the fifth parameter' do
|
88
|
+
extract_coordinates(@dir.to_command)[4].should == 0
|
89
|
+
end
|
90
|
+
it 'should show the provided target x value as the sixth parameter' do
|
91
|
+
extract_coordinates(@dir.to_command)[5].should == 400
|
92
|
+
end
|
93
|
+
it 'should show the provided target y value as the seventh parameter' do
|
94
|
+
extract_coordinates(@dir.to_command)[6].should == 500
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe ClosePath do
|
6
|
+
before :each do
|
7
|
+
@dir = ClosePath.new()
|
8
|
+
end
|
9
|
+
def create_relative; ClosePath.new(false); end
|
10
|
+
def command_code; 'z'; end
|
11
|
+
include Command
|
12
|
+
it_behaves_like 'Direction'
|
13
|
+
it 'should be constructed with with either no parameters or a single boolean parameter' do
|
14
|
+
lambda { ClosePath.new }.should_not raise_error
|
15
|
+
lambda { ClosePath.new true }.should_not raise_error
|
16
|
+
lambda { ClosePath.new 45, 50 }.should raise_error
|
17
|
+
end
|
18
|
+
it 'should be relative if constructed with a false parameter' do
|
19
|
+
direction = ClosePath.new(false)
|
20
|
+
direction.absolute?.should == false
|
21
|
+
end
|
22
|
+
it 'should be absolute if constructed with a false parameter' do
|
23
|
+
direction = ClosePath.new(true)
|
24
|
+
direction.absolute?.should == true
|
25
|
+
end
|
26
|
+
it 'should be absolute if constructed with no parameters' do
|
27
|
+
direction = ClosePath.new()
|
28
|
+
direction.absolute?.should == true
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe CubicCurveTo do
|
6
|
+
def dir_class; CubicCurveTo; end
|
7
|
+
def create_relative; CubicCurveTo.new(100,200,300,400,500,600,false); end
|
8
|
+
def command_code; 'c'; end
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
@dir = dir_class.new(100,200,300,400,500,600)
|
12
|
+
end
|
13
|
+
|
14
|
+
include Command
|
15
|
+
it_behaves_like 'Direction'
|
16
|
+
|
17
|
+
it 'should have a target' do
|
18
|
+
@dir.respond_to?(:target).should == true
|
19
|
+
@dir.target.class.should == Point
|
20
|
+
end
|
21
|
+
it 'should have a control point' do
|
22
|
+
@dir.respond_to?(:control).should == true
|
23
|
+
@dir.control.class.should == Point
|
24
|
+
end
|
25
|
+
it 'should have an accessible target x, based on the constructor argument' do
|
26
|
+
@dir.target.x.should == 500
|
27
|
+
end
|
28
|
+
it 'should have an accessible target y, based on the constructor argument' do
|
29
|
+
@dir.target.y.should == 600
|
30
|
+
end
|
31
|
+
it 'should have an accessible second control x, based on the constructor argument' do
|
32
|
+
@dir.control_2.x.should == 300
|
33
|
+
end
|
34
|
+
it 'should have an accessible second control y, based on the constructor argument' do
|
35
|
+
@dir.control_2.y.should == 400
|
36
|
+
end
|
37
|
+
context 'when in verbose format' do
|
38
|
+
it 'should be constructed with at least target x and y, control 1 x and y, and control 2 x and y parameters' do
|
39
|
+
lambda { dir_class.new }.should raise_error
|
40
|
+
lambda { dir_class.new 45 }.should raise_error
|
41
|
+
lambda { dir_class.new 45, 50 }.should raise_error
|
42
|
+
lambda { dir_class.new 45, 50, 60 }.should raise_error
|
43
|
+
lambda { dir_class.new 45, 50, 60, 70, 80 }.should raise_error
|
44
|
+
lambda { dir_class.new 45, 50, 60, 70, 80, 90 }.should_not raise_error
|
45
|
+
lambda { dir_class.new 45, 50, 60, 70, 80, 90, true }.should_not raise_error
|
46
|
+
end
|
47
|
+
it 'should be relative if constructed with a false seventh parameter' do
|
48
|
+
direction = dir_class.new 45, 50, 60, 70, 80, 90, false
|
49
|
+
direction.absolute?.should == false
|
50
|
+
end
|
51
|
+
it 'should be absolute if constructed with a true seventh parameter' do
|
52
|
+
direction = dir_class.new 45, 50, 60, 70, 80, 90, true
|
53
|
+
direction.absolute?.should == true
|
54
|
+
end
|
55
|
+
it 'should be absolute if constructed with only six parameters' do
|
56
|
+
direction = dir_class.new 45, 50, 60, 70, 80, 90
|
57
|
+
direction.absolute?.should == true
|
58
|
+
end
|
59
|
+
it 'should have an accessible first control x, based on the constructor argument' do
|
60
|
+
@dir.control_1.x.should == 100
|
61
|
+
end
|
62
|
+
it 'should have an accessible first control y, based on the constructor argument' do
|
63
|
+
@dir.control_1.y.should == 200
|
64
|
+
end
|
65
|
+
describe '#to_command' do
|
66
|
+
it 'should start with a lower-case c when not absolute' do
|
67
|
+
extract_command(CubicCurveTo.new(100,200,300,400,500,600,false).to_command).should == 'c'
|
68
|
+
end
|
69
|
+
it 'should start with a capital C when absolute' do
|
70
|
+
extract_command(@dir.to_command).should == 'C'
|
71
|
+
end
|
72
|
+
it 'should have exactly 6 numerical parameters' do
|
73
|
+
extract_coordinates(@dir.to_command).length.should == 6
|
74
|
+
end
|
75
|
+
it 'should show the provided first control X value as the first parameter' do
|
76
|
+
extract_coordinates(@dir.to_command)[0].should == 100
|
77
|
+
end
|
78
|
+
it 'should show the provided first control Y value as the second parameter' do
|
79
|
+
extract_coordinates(@dir.to_command)[1].should == 200
|
80
|
+
end
|
81
|
+
it 'should show the provided second control X value as the third parameter' do
|
82
|
+
extract_coordinates(@dir.to_command)[2].should == 300
|
83
|
+
end
|
84
|
+
it 'should show the provided second control Y value as the fourth parameter' do
|
85
|
+
extract_coordinates(@dir.to_command)[3].should == 400
|
86
|
+
end
|
87
|
+
it 'should show the provided target X value as the fifth parameter' do
|
88
|
+
extract_coordinates(@dir.to_command)[4].should == 500
|
89
|
+
end
|
90
|
+
it 'should show the provided target Y value as the sixth parameter' do
|
91
|
+
extract_coordinates(@dir.to_command)[5].should == 600
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context 'when in shorthand format' do
|
96
|
+
before :each do
|
97
|
+
@dir = CubicCurveTo.new(100,200,300,400)
|
98
|
+
end
|
99
|
+
it 'should be constructed with at least target x and y parameters' do
|
100
|
+
lambda { dir_class.new }.should raise_error
|
101
|
+
lambda { dir_class.new 45 }.should raise_error
|
102
|
+
lambda { dir_class.new 45, 50 }.should raise_error
|
103
|
+
lambda { dir_class.new 45, 50, 60 }.should raise_error
|
104
|
+
lambda { dir_class.new 45, 50, 60, 70 }.should_not raise_error
|
105
|
+
lambda { dir_class.new 45, 50, 60, 70, true }.should_not raise_error
|
106
|
+
end
|
107
|
+
it 'should be relative if constructed with a false third parameter' do
|
108
|
+
direction = dir_class.new 45, 50, 60, 70, false
|
109
|
+
direction.absolute?.should == false
|
110
|
+
end
|
111
|
+
it 'should be absolute if constructed with a true third parameter' do
|
112
|
+
direction = dir_class.new 45, 50, 60, 70, true
|
113
|
+
direction.absolute?.should == true
|
114
|
+
end
|
115
|
+
it 'should be absolute if constructed with only two parameters' do
|
116
|
+
direction = dir_class.new 45, 50, 60, 70
|
117
|
+
direction.absolute?.should == true
|
118
|
+
end
|
119
|
+
it 'should have an nil first control, based on the constructor argument' do
|
120
|
+
@dir.control_1.should == nil
|
121
|
+
end
|
122
|
+
describe '#to_command' do
|
123
|
+
it 'should start with a lower-case s when not absolute' do
|
124
|
+
extract_command(CubicCurveTo.new(100,200,300,400,false).to_command).should == 's'
|
125
|
+
end
|
126
|
+
it 'should start with a capital S when absolute' do
|
127
|
+
extract_command(@dir.to_command).should == 'S'
|
128
|
+
end
|
129
|
+
it 'should have exactly 2 numerical parameters' do
|
130
|
+
extract_coordinates(@dir.to_command).length.should == 4
|
131
|
+
end
|
132
|
+
it 'should show the provided second control X value as the first parameter' do
|
133
|
+
extract_coordinates(@dir.to_command)[0].should == 100
|
134
|
+
end
|
135
|
+
it 'should show the provided second control Y value as the second parameter' do
|
136
|
+
extract_coordinates(@dir.to_command)[1].should == 200
|
137
|
+
end
|
138
|
+
it 'should show the provided target X value as the third parameter' do
|
139
|
+
extract_coordinates(@dir.to_command)[2].should == 300
|
140
|
+
end
|
141
|
+
it 'should show the provided target Y value as the fourth parameter' do
|
142
|
+
extract_coordinates(@dir.to_command)[3].should == 400
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe HorizontalTo do
|
6
|
+
def dir_class; HorizontalTo; end
|
7
|
+
def create_relative; HorizontalTo.new(100,false); end
|
8
|
+
def command_code; 'h'; end
|
9
|
+
it_behaves_like 'CoordinateTarget'
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe LineTo do
|
6
|
+
def dir_class; LineTo; end
|
7
|
+
def create_relative; LineTo.new(100,200,false); end
|
8
|
+
def command_code; 'l'; end
|
9
|
+
it_behaves_like 'PointTarget'
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe MoveTo do
|
6
|
+
def dir_class; MoveTo; end
|
7
|
+
def create_relative; MoveTo.new(100,200,false); end
|
8
|
+
def command_code; 'm'; end
|
9
|
+
it_behaves_like 'PointTarget'
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include Savage::Directions
|
4
|
+
|
5
|
+
describe Point do
|
6
|
+
it 'should have an x' do
|
7
|
+
Point.new.respond_to?(:x).should == true;
|
8
|
+
end
|
9
|
+
it 'should have an y' do
|
10
|
+
Point.new.respond_to?(:y).should == true;
|
11
|
+
end
|
12
|
+
end
|