geomotion 0.10.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,181 @@
1
+ class CGAffineTransform
2
+ # CGAffineTransform.make # default transform: identity matrix
3
+ # # make a transform from scratch
4
+ # CGAffineTransform.make(a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0)
5
+ #
6
+ # # make a transform using primitives
7
+ # CGAffineTransform.make(scale: 2, translate: [10, 10], rotate: Math::PI)
8
+ def self.make(options = {})
9
+ if options.key?(:a)
10
+ args = [
11
+ :a, :b,
12
+ :c, :d,
13
+ :tx, :ty,
14
+ ].map do |key|
15
+ raise "#{key.inspect} is required" unless options.key? key
16
+ options[key]
17
+ end
18
+ return self.new(*args)
19
+ else
20
+ retval = self.identity
21
+ if options[:translate]
22
+ retval = retval.translate(options[:translate])
23
+ end
24
+ if options[:scale]
25
+ retval = retval.scale(options[:scale])
26
+ end
27
+ if options[:rotate]
28
+ retval = retval.rotate(options[:rotate])
29
+ end
30
+ return retval
31
+ end
32
+ end
33
+
34
+ # Returns a transform that is translated. Accepts one or two arguments. One
35
+ # argument can be a Point or Array with two items, two arguments should be the
36
+ # x and y values.
37
+ # @return CGAffineTransform
38
+ def self.translate(point, ty=nil)
39
+ if ty
40
+ tx = point
41
+ else
42
+ tx = point[0]
43
+ ty = point[1]
44
+ end
45
+ CGAffineTransformMakeTranslation(tx, ty)
46
+ end
47
+
48
+ # Returns a transform that is scaled. Accepts one or two arguments. One
49
+ # argument can be a Point or Array with two items or a number that will be
50
+ # used to scale both directions. Two arguments should be the x and y values.
51
+ def self.scale(scale, sy=nil)
52
+ if sy
53
+ sx = scale
54
+ elsif scale.is_a?(Numeric)
55
+ sx = sy = scale
56
+ else
57
+ sx = scale[0]
58
+ sy = scale[1]
59
+ end
60
+ CGAffineTransformMakeScale(sx, sy)
61
+ end
62
+
63
+ # Returns a transform that is rotated by `angle` (+ => counterclockwise, - => clockwise)
64
+ # @return CGAffineTransform
65
+ def self.rotate(angle)
66
+ CGAffineTransformMakeRotation(angle)
67
+ end
68
+
69
+ # A "shear" translation turns a rectangle into a parallelogram
70
+ # @param px [Numeric] how much to shear in x direction
71
+ # @param py [Numeric] how much to shear in y direction
72
+ # @return CGAffineTransform
73
+ def self.shear(px, py)
74
+ CGAffineTransformMake(1, py, px, 1, 0, 0)
75
+ end
76
+
77
+ # Returns the CGAffineTransform identity matrix
78
+ # @return CGAffineTransform
79
+ def self.identity
80
+ CGAffineTransformIdentity
81
+ end
82
+
83
+ # Return true if the receiver is the identity matrix, false otherwise
84
+ # @return CGAffineTransform
85
+ def identity?
86
+ CGAffineTransformIsIdentity(self)
87
+ end
88
+
89
+ # @return [CATransform3D]
90
+ def to_transform3d
91
+ CATransform3DMakeAffineTransform(self)
92
+ end
93
+
94
+ # @return [Boolean] true if the two matrices are equal
95
+ def ==(transform)
96
+ CGAffineTransformEqualToTransform(self, transform)
97
+ end
98
+
99
+ # Returns self
100
+ # @return CGAffineTransform
101
+ def +@
102
+ self
103
+ end
104
+
105
+ # Concatenates the two transforms
106
+ # @return CGAffineTransform
107
+ def concat(transform)
108
+ CGAffineTransformConcat(self, transform)
109
+ end
110
+ alias :+ :concat
111
+ alias :<< :concat
112
+
113
+ # Inverts the transform
114
+ # @return CGAffineTransform
115
+ def invert
116
+ CGAffineTransformInvert(self)
117
+ end
118
+ alias :-@ :invert
119
+
120
+ # Inverts the second transform and adds the result to `self`
121
+ # @return CGAffineTransform
122
+ def -(transform)
123
+ self.concat transform.invert
124
+ end
125
+
126
+ # Applies a translation transform to the receiver
127
+ # @return CGAffineTransform
128
+ def translate(point, ty=nil)
129
+ if ty
130
+ tx = point
131
+ else
132
+ tx = point[0]
133
+ ty = point[1]
134
+ end
135
+ CGAffineTransformTranslate(self, tx, ty)
136
+ end
137
+
138
+ # Applies a scale transform to the receiver
139
+ # @return CGAffineTransform
140
+ def scale(scale, sy=nil)
141
+ if sy
142
+ sx = scale
143
+ elsif scale.is_a?(Numeric)
144
+ sx = sy = scale
145
+ else
146
+ sx = scale[0]
147
+ sy = scale[1]
148
+ end
149
+ CGAffineTransformScale(self, sx, sy)
150
+ end
151
+
152
+ # Applies a rotation transform to the receiver
153
+ # @return CGAffineTransform
154
+ def rotate(angle)
155
+ CGAffineTransformRotate(self, angle)
156
+ end
157
+
158
+ # Applies a shear transform to the receiver
159
+ # @return CGAffineTransform
160
+ def shear(px, py)
161
+ self.concat CGAffineTransform.shear(px, py)
162
+ end
163
+
164
+ def apply_to(thing)
165
+ case thing
166
+ when CGPoint
167
+ CGPointApplyAffineTransform(thing, self)
168
+ when CGSize
169
+ CGSizeApplyAffineTransform(thing, self)
170
+ when CGRect
171
+ CGRectApplyAffineTransform(thing, self)
172
+ else
173
+ raise "Cannot apply transform to #{thing.inspect}"
174
+ end
175
+ end
176
+
177
+ def to_a
178
+ [self.a, self.b, self.c, self.d, self.tx, self.ty]
179
+ end
180
+
181
+ end
@@ -9,15 +9,15 @@ class CGRect
9
9
  # CGRect.make(origin: point, size: size)
10
10
  def self.make(options = {})
11
11
  if options[:origin]
12
- x = options[:origin].x
13
- y = options[:origin].y
12
+ x = options[:origin][0]
13
+ y = options[:origin][1]
14
14
  else
15
15
  x = options[:x] || 0
16
16
  y = options[:y] || 0
17
17
  end
18
18
  if options[:size]
19
- w = options[:size].width
20
- h = options[:size].height
19
+ w = options[:size][0]
20
+ h = options[:size][1]
21
21
  else
22
22
  w = options[:width] || 0
23
23
  h = options[:height] || 0
@@ -1,3 +1,3 @@
1
1
  module Geomotion
2
- VERSION = "0.10.0"
2
+ VERSION = "0.12.1"
3
3
  end
Binary file
Binary file
@@ -0,0 +1,345 @@
1
+ describe "CATransform3D" do
2
+
3
+ describe "operations" do
4
+
5
+ it "should support ==" do
6
+ CATransform3D.make(
7
+ m11: 1, m12: 0, m13: 0, m14: 0,
8
+ m21: 0, m22: 1, m23: 0, m24: 0,
9
+ m31: 0, m32: 0, m33: 1, m34: 0,
10
+ m41: 0, m42: 0, m43: 0, m44: 1,
11
+ ).should == CATransform3D.make(
12
+ m11: 1, m12: 0, m13: 0, m14: 0,
13
+ m21: 0, m22: 1, m23: 0, m24: 0,
14
+ m31: 0, m32: 0, m33: 1, m34: 0,
15
+ m41: 0, m42: 0, m43: 0, m44: 1,
16
+ )
17
+ end
18
+
19
+ it "should support +" do
20
+ t1 = CATransform3D.make(
21
+ m11: 2, m12: 0, m13: 0, m14: 0,
22
+ m21: 0, m22: 2, m23: 0, m24: 0,
23
+ m31: 0, m32: 0, m33: 2, m34: 0,
24
+ m41: 0, m42: 0, m43: 0, m44: 1,
25
+ )
26
+ t2 = CATransform3D.make(
27
+ m11: 1, m12: 0, m13: 0, m14: 0,
28
+ m21: 0, m22: 1, m23: 0, m24: 0,
29
+ m31: 0, m32: 0, m33: 1, m34: 0,
30
+ m41: 1, m42: 2, m43: 3, m44: 1,
31
+ )
32
+ (t1 + t2).should == CATransform3D.make(
33
+ m11: 2, m12: 0, m13: 0, m14: 0,
34
+ m21: 0, m22: 2, m23: 0, m24: 0,
35
+ m31: 0, m32: 0, m33: 2, m34: 0,
36
+ m41: 1, m42: 2, m43: 3, m44: 1,
37
+ )
38
+ end
39
+
40
+ it "should support <<" do
41
+ t1 = CATransform3D.make(
42
+ m11: 2, m12: 0, m13: 0, m14: 0,
43
+ m21: 0, m22: 2, m23: 0, m24: 0,
44
+ m31: 0, m32: 0, m33: 2, m34: 0,
45
+ m41: 0, m42: 0, m43: 0, m44: 1,
46
+ )
47
+ t2 = CATransform3D.make(
48
+ m11: 1, m12: 0, m13: 0, m14: 0,
49
+ m21: 0, m22: 1, m23: 0, m24: 0,
50
+ m31: 0, m32: 0, m33: 1, m34: 0,
51
+ m41: 1, m42: 2, m43: 3, m44: 1,
52
+ )
53
+ (t1 << t2).should == CATransform3D.make(
54
+ m11: 2, m12: 0, m13: 0, m14: 0,
55
+ m21: 0, m22: 2, m23: 0, m24: 0,
56
+ m31: 0, m32: 0, m33: 2, m34: 0,
57
+ m41: 1, m42: 2, m43: 3, m44: 1,
58
+ )
59
+ end
60
+
61
+ it "should support -" do
62
+ t1 = CATransform3D.make(
63
+ m11: 2, m12: 0, m13: 0, m14: 0,
64
+ m21: 0, m22: 2, m23: 0, m24: 0,
65
+ m31: 0, m32: 0, m33: 2, m34: 0,
66
+ m41: 0, m42: 0, m43: 0, m44: 1,
67
+ )
68
+ t2 = CATransform3D.make(
69
+ m11: 1, m12: 0, m13: 0, m14: 0,
70
+ m21: 0, m22: 1, m23: 0, m24: 0,
71
+ m31: 0, m32: 0, m33: 1, m34: 0,
72
+ m41: 1, m42: 2, m43: 3, m44: 1,
73
+ )
74
+ (t1 - t2).should == CATransform3D.make(
75
+ m11: 2, m12: 0, m13: 0, m14: 0,
76
+ m21: 0, m22: 2, m23: 0, m24: 0,
77
+ m31: 0, m32: 0, m33: 2, m34: 0,
78
+ m41: -1, m42: -2, m43: -3, m44: 1,
79
+ )
80
+ end
81
+
82
+ it "subtracting itself should return identity (scale)" do
83
+ t1 = CATransform3D.make(
84
+ m11: 2, m12: 0, m13: 0, m14: 0,
85
+ m21: 0, m22: 2, m23: 0, m24: 0,
86
+ m31: 0, m32: 0, m33: 2, m34: 0,
87
+ m41: 0, m42: 0, m43: 0, m44: 1,
88
+ )
89
+ (t1 - t1).should == CATransform3D.make(
90
+ m11: 1, m12: 0, m13: 0, m14: 0,
91
+ m21: 0, m22: 1, m23: 0, m24: 0,
92
+ m31: 0, m32: 0, m33: 1, m34: 0,
93
+ m41: 0, m42: 0, m43: 0, m44: 1,
94
+ )
95
+ end
96
+
97
+ it "subtracting itself should return identity (translate)" do
98
+ t1 = CATransform3D.make(
99
+ m11: 1, m12: 0, m13: 0, m14: 0,
100
+ m21: 0, m22: 1, m23: 0, m24: 0,
101
+ m31: 0, m32: 0, m33: 1, m34: 0,
102
+ m41: 1, m42: 2, m43: 3, m44: 1,
103
+ )
104
+ (t1 - t1).should == CATransform3D.make(
105
+ m11: 1, m12: 0, m13: 0, m14: 0,
106
+ m21: 0, m22: 1, m23: 0, m24: 0,
107
+ m31: 0, m32: 0, m33: 1, m34: 0,
108
+ m41: 0, m42: 0, m43: 0, m44: 1,
109
+ )
110
+ end
111
+
112
+ it "subtracting itself should return identity (rotate)" do
113
+ t1 = CATransform3D.make(
114
+ m11:-1, m12: 0, m13: 0, m14: 0,
115
+ m21: 0, m22:-1, m23: 0, m24: 0,
116
+ m31: 0, m32: 0, m33: 1, m34: 0,
117
+ m41: 0, m42: 0, m43: 0, m44: 1,
118
+ )
119
+ (t1 - t1).should == CATransform3D.make(
120
+ m11: 1, m12: 0, m13: 0, m14: 0,
121
+ m21: 0, m22: 1, m23: 0, m24: 0,
122
+ m31: 0, m32: 0, m33: 1, m34: 0,
123
+ m41: 0, m42: 0, m43: 0, m44: 1,
124
+ )
125
+ end
126
+
127
+ it "should support unary -" do
128
+ (- CATransform3D.make(
129
+ m11: 1, m12: 0, m13: 0, m14: 0,
130
+ m21: 0, m22: 1, m23: 0, m24: 0,
131
+ m31: 0, m32: 0, m33: 1, m34: 0,
132
+ m41: 1, m42: 2, m43: 3, m44: 1,
133
+ )).should == CATransform3D.make(
134
+ m11: 1, m12: 0, m13: 0, m14: 0,
135
+ m21: 0, m22: 1, m23: 0, m24: 0,
136
+ m31: 0, m32: 0, m33: 1, m34: 0,
137
+ m41:-1, m42:-2, m43:-3, m44: 1,
138
+ )
139
+ end
140
+
141
+ it "should support unary +" do
142
+ (+ CATransform3D.make(
143
+ m11: 1, m12: 0, m13: 0, m14: 0,
144
+ m21: 0, m22: 1, m23: 0, m24: 0,
145
+ m31: 0, m32: 0, m33: 1, m34: 0,
146
+ m41: 1, m42: 2, m43: 3, m44: 1,
147
+ )).should == CATransform3D.make(
148
+ m11: 1, m12: 0, m13: 0, m14: 0,
149
+ m21: 0, m22: 1, m23: 0, m24: 0,
150
+ m31: 0, m32: 0, m33: 1, m34: 0,
151
+ m41: 1, m42: 2, m43: 3, m44: 1,
152
+ )
153
+ end
154
+
155
+ end
156
+
157
+ describe ".make" do
158
+
159
+ it "should work with no arguments" do
160
+ transform = CATransform3D.make
161
+ transform.should == CATransform3D.identity
162
+ end
163
+
164
+ it "should work with options" do
165
+ transform = CATransform3D.make(
166
+ m11: 1, m12: 0, m13: 0, m14: 0,
167
+ m21: 0, m22: 1, m23: 0, m24: 0,
168
+ m31: 0, m32: 0, m33: 1, m34: 0,
169
+ m41: 0, m42: 0, m43: 0, m44: 1,
170
+ )
171
+ CATransform3DIsIdentity(transform).should == true
172
+ end
173
+
174
+ it "should work with transform options (scale)" do
175
+ CATransform3D.make(scale: [2, 3, 4]).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,0,0,0,1)
176
+ end
177
+
178
+ it "should work with transform options (translate)" do
179
+ CATransform3D.make(translate: [10, 20, 30]).should == CATransform3D.new(1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,10,20,30,1)
180
+ end
181
+
182
+ it "should work with transform options (rotate)" do
183
+ transform = CATransform3D.make(rotate: Math::PI).to_a.map { |v| v.round(3) }
184
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0 ,0,-1,0,0 ,0,0,1,0 ,0,0,0,1)
185
+ end
186
+
187
+ it "should work with transform options (scale + translate)" do
188
+ CATransform3D.make(scale: [2, 3, 4], translate: [10, 20, 30]).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,10,20,30,1)
189
+ end
190
+
191
+ it "should work with transform options (scale + translate + rotation)" do
192
+ transform = CATransform3D.make(scale: [2, 3, 4], rotate: Math::PI, translate: [10, 20, 30]).to_a.map { |v| v.round(3) }
193
+ CATransform3D.new(*transform).should == CATransform3D.new(-2,0,0,0 ,0,-3,0,0 ,0,0,4,0 ,10,20,30,1)
194
+ end
195
+
196
+ end
197
+
198
+ describe "identity" do
199
+
200
+ it "should return the identity matrix" do
201
+ CATransform3DIsIdentity(CATransform3D.identity).should == true
202
+ end
203
+
204
+ it "identity? should return true for identity matrix" do
205
+ CATransform3D.identity.identity?.should == true
206
+ end
207
+
208
+ it "identity? should return false other matrices" do
209
+ CATransform3D.scale(2).identity?.should == false
210
+ end
211
+
212
+ end
213
+
214
+ describe ".rotate" do
215
+
216
+ it "should work as a factory (x-axis)" do
217
+ transform = CATransform3D.rotate(Math::PI, 1, 0, 0).to_a.map { |v| v.round(3) }
218
+ CATransform3D.new(*transform).should == CATransform3D.new(1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1)
219
+ end
220
+
221
+ it "should work as a factory (y-axis)" do
222
+ transform = CATransform3D.rotate(Math::PI, 0, 1, 0).to_a.map { |v| v.round(3) }
223
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0, 0,1,0,0, 0,0,-1,0, 0,0,0,1)
224
+ end
225
+
226
+ it "should work as a factory (z-axis)" do
227
+ transform = CATransform3D.rotate(Math::PI, 0, 0, 1).to_a.map { |v| v.round(3) }
228
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0 ,0,-1,0,0 ,0,0,1,0 ,0,0,0,1)
229
+ end
230
+
231
+ it "should work as a factory (default)" do
232
+ transform = CATransform3D.rotate(Math::PI).to_a.map { |v| v.round(3) }
233
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0 ,0,-1,0,0 ,0,0,1,0 ,0,0,0,1)
234
+ end
235
+
236
+ it "should work as an instance method (x-axis)" do
237
+ transform = CATransform3D.identity.rotate(Math::PI, 1, 0, 0).to_a.map { |v| v.round(3) }
238
+ CATransform3D.new(*transform).should == CATransform3D.new(1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1)
239
+ end
240
+
241
+ it "should work as an instance method (y-axis)" do
242
+ transform = CATransform3D.identity.rotate(Math::PI, 0, 1, 0).to_a.map { |v| v.round(3) }
243
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0, 0,1,0,0, 0,0,-1,0, 0,0,0,1)
244
+ end
245
+
246
+ it "should work as an instance method (z-axis)" do
247
+ transform = CATransform3D.identity.rotate(Math::PI, 0, 0, 1).to_a.map { |v| v.round(3) }
248
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0 ,0,-1,0,0 ,0,0,1,0 ,0,0,0,1)
249
+ end
250
+
251
+ it "should work as an instance method (default)" do
252
+ transform = CATransform3D.identity.rotate(Math::PI).to_a.map { |v| v.round(3) }
253
+ CATransform3D.new(*transform).should == CATransform3D.new(-1,0,0,0 ,0,-1,0,0 ,0,0,1,0 ,0,0,0,1)
254
+ end
255
+
256
+ end
257
+
258
+ describe ".scale" do
259
+
260
+ it "should work as a factory with one argument" do
261
+ CATransform3D.scale(2).should == CATransform3D.new(2,0,0,0 ,0,2,0,0 ,0,0,1,0 ,0,0,0,1)
262
+ end
263
+
264
+ it "should work as a factory with three arguments" do
265
+ CATransform3D.scale(2, 3, 4).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,0,0,0,1)
266
+ end
267
+
268
+ it "should work as a factory with one array" do
269
+ CATransform3D.scale([2, 3, 4]).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,0,0,0,1)
270
+ end
271
+
272
+ it "should work as an instance method with one argument" do
273
+ CATransform3D.identity.scale(2).should == CATransform3D.new(2,0,0,0 ,0,2,0,0 ,0,0,1,0 ,0,0,0,1)
274
+ end
275
+
276
+ it "should work as an instance method with three arguments" do
277
+ CATransform3D.identity.scale(2, 3, 4).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,0,0,0,1)
278
+ end
279
+
280
+ it "should work as an instance method with one array" do
281
+ CATransform3D.identity.scale([2, 3, 4]).should == CATransform3D.new(2,0,0,0 ,0,3,0,0 ,0,0,4,0 ,0,0,0,1)
282
+ end
283
+
284
+ end
285
+
286
+ describe ".translate" do
287
+
288
+ it "should work as a factory with three arguments" do
289
+ CATransform3D.translate(10, 20, 30).should == CATransform3D.new(1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,10,20,30,1)
290
+ end
291
+
292
+ it "should work as a factory with one array" do
293
+ CATransform3D.translate([10, 20, 30]).should == CATransform3D.new(1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,10,20,30,1)
294
+ end
295
+
296
+ it "should work as an instance method with three arguments" do
297
+ CATransform3D.identity.translate(10, 20, 30).should == CATransform3D.new(1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,10,20,30,1)
298
+ end
299
+
300
+ it "should work as an instance method with one array" do
301
+ CATransform3D.identity.translate([10, 20, 30]).should == CATransform3D.new(1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,10,20,30,1)
302
+ end
303
+
304
+ end
305
+
306
+ describe ".perspective" do
307
+
308
+ it "should work as a factory with two arguments" do
309
+ CATransform3D.perspective(0.002, 0).should == CATransform3D.new(1,0,0,0.002, 0,1,0,0, 0,0,1,0, 0,0,0,1)
310
+ CATransform3D.perspective(0, 0.002).should == CATransform3D.new(1,0,0,0, 0,1,0,0.002, 0,0,1,0, 0,0,0,1)
311
+ end
312
+
313
+ it "should work as an instance method with two arguments" do
314
+ CATransform3D.identity.perspective(0.002, 0).should == CATransform3D.new(1,0,0,0.002, 0,1,0,0, 0,0,1,0, 0,0,0,1)
315
+ CATransform3D.identity.perspective(0, 0.002).should == CATransform3D.new(1,0,0,0, 0,1,0,0.002, 0,0,1,0, 0,0,0,1)
316
+ end
317
+
318
+ end
319
+
320
+ describe "other methods" do
321
+
322
+ it "should support concat" do
323
+ t1 = CATransform3D.translate(10, 20, 30)
324
+ t2 = CATransform3D.scale(2)
325
+ t1.concat(t2).should == CATransform3D.new(2,0,0,0 ,0,2,0,0 ,0,0,1,0 ,20,40,30,1)
326
+ end
327
+
328
+ it "should support invert" do
329
+ t1 = CATransform3D.scale(2)
330
+ t1.invert.should == CATransform3D.new(0.5,0,0,0 ,0,0.5,0,0 ,0,0,1,0 ,0,0,0,1)
331
+ end
332
+
333
+ it "should support to_affine_transform" do
334
+ t1 = CATransform3D.new(2,0,0,0 ,0,2,0,0 ,0,0,2,0 ,0,0,0,1)
335
+ t1.to_affine_transform.should == CGAffineTransformMake(2, 0, 0, 2, 0, 0)
336
+ end
337
+
338
+ it 'should support to_a' do
339
+ t1 = CATransform3D.identity
340
+ t1.to_a.should == [1,0,0,0 ,0,1,0,0 ,0,0,1,0 ,0,0,0,1]
341
+ end
342
+
343
+ end
344
+
345
+ end