@@ -32,25 +32,19 @@ public struct AffineTransform : ReferenceConvertible, Hashable, CustomStringConv
32
32
public var m22 : CGFloat
33
33
public var tX : CGFloat
34
34
public var tY : CGFloat
35
-
35
+
36
+ // init() returns affine transformation matrix with identity values.
36
37
public init ( ) {
37
- self . init ( m11: CGFloat ( ) , m12: CGFloat ( ) , m21: CGFloat ( ) , m22: CGFloat ( ) , tX: CGFloat ( ) , tY: CGFloat ( ) )
38
+ self . init ( m11: 1.0 , m12: 0.0 ,
39
+ m21: 0.0 , m22: 1.0 ,
40
+ tX: 0.0 , tY: 0.0 )
38
41
}
42
+
39
43
public init ( m11: CGFloat , m12: CGFloat , m21: CGFloat , m22: CGFloat , tX: CGFloat , tY: CGFloat ) {
40
44
( self . m11, self . m12, self . m21, self . m22) = ( m11, m12, m21, m22)
41
45
( self . tX, self . tY) = ( tX, tY)
42
46
}
43
47
44
- private init ( reference: NSAffineTransform ) {
45
- self = reference. transformStruct
46
- }
47
-
48
- private var reference : NSAffineTransform {
49
- let ref = NSAffineTransform ( )
50
- ref. transformStruct = self
51
- return ref
52
- }
53
-
54
48
/**
55
49
Creates an affine transformation matrix from translation values.
56
50
The matrix takes the following form:
@@ -279,8 +273,57 @@ public struct AffineTransform : ReferenceConvertible, Hashable, CustomStringConv
279
273
}
280
274
}
281
275
276
+ public struct NSAffineTransformStruct {
277
+ public var m11 : CGFloat
278
+ public var m12 : CGFloat
279
+ public var m21 : CGFloat
280
+ public var m22 : CGFloat
281
+ public var tX : CGFloat
282
+ public var tY : CGFloat
283
+
284
+ // This is NOT an identity matrix
285
+ public init ( ) {
286
+ m11 = 0.0
287
+ m12 = 0.0
288
+ m21 = 0.0
289
+ m22 = 0.0
290
+ tX = 0.0
291
+ tY = 0.0
292
+ }
293
+
294
+ public init ( m11: CGFloat , m12: CGFloat , m21: CGFloat , m22: CGFloat , tX: CGFloat , tY: CGFloat ) {
295
+ self . m11 = m11
296
+ self . m12 = m12
297
+ self . m21 = m21
298
+ self . m22 = m22
299
+ self . tX = tX
300
+ self . tY = tY
301
+ }
302
+ }
303
+
282
304
open class NSAffineTransform : NSObject , NSCopying , NSSecureCoding {
283
-
305
+
306
+ private var affineTransform : AffineTransform
307
+
308
+ public var transformStruct : NSAffineTransformStruct {
309
+ get {
310
+ return NSAffineTransformStruct ( m11: affineTransform. m11,
311
+ m12: affineTransform. m12,
312
+ m21: affineTransform. m21,
313
+ m22: affineTransform. m22,
314
+ tX: affineTransform. tX,
315
+ tY: affineTransform. tY)
316
+ }
317
+ set {
318
+ affineTransform. m11 = newValue. m11
319
+ affineTransform. m12 = newValue. m12
320
+ affineTransform. m21 = newValue. m21
321
+ affineTransform. m22 = newValue. m22
322
+ affineTransform. tX = newValue. tX
323
+ affineTransform. tY = newValue. tY
324
+ }
325
+ }
326
+
284
327
open func encode( with aCoder: NSCoder ) {
285
328
guard aCoder. allowsKeyedCoding else {
286
329
preconditionFailure ( " Unkeyed coding is unsupported. " )
@@ -301,7 +344,7 @@ open class NSAffineTransform : NSObject, NSCopying, NSSecureCoding {
301
344
}
302
345
303
346
open func copy( with zone: NSZone ? = nil ) -> Any {
304
- return NSAffineTransform ( transform: self )
347
+ return NSAffineTransform ( transform: affineTransform )
305
348
}
306
349
307
350
// Necessary because `NSObject.copy()` returns `self`.
@@ -328,53 +371,54 @@ open class NSAffineTransform : NSObject, NSCopying, NSSecureCoding {
328
371
let tX = floatPointer [ 4 ]
329
372
let tY = floatPointer [ 5 ]
330
373
331
- self . transformStruct = AffineTransform ( m11: CGFloat ( m11) , m12: CGFloat ( m12) ,
332
- m21: CGFloat ( m21) , m22: CGFloat ( m22) ,
333
- tX: CGFloat ( tX) , tY: CGFloat ( tY) )
374
+ affineTransform = AffineTransform ( m11: CGFloat ( m11) , m12: CGFloat ( m12) ,
375
+ m21: CGFloat ( m21) , m22: CGFloat ( m22) ,
376
+ tX: CGFloat ( tX) , tY: CGFloat ( tY) )
334
377
}
335
378
336
379
open override func isEqual( _ object: Any ? ) -> Bool {
337
380
guard let other = object as? NSAffineTransform else { return false }
338
- return other === self
339
- || ( other. transformStruct == self . transformStruct)
381
+ return other === self || ( other. affineTransform == self . affineTransform)
340
382
}
341
383
342
384
open override var hashValue : Int {
343
- return transformStruct . hashValue
385
+ return affineTransform . hashValue
344
386
}
345
387
346
388
public static var supportsSecureCoding : Bool {
347
389
return true
348
390
}
349
391
350
392
// Initialization
351
- public convenience init ( transform: NSAffineTransform ) {
393
+ public convenience init ( transform: AffineTransform ) {
352
394
self . init ( )
353
- transformStruct = transform. transformStruct
395
+ affineTransform = transform
354
396
}
355
-
397
+
398
+ // init() returns affine transformation matrix with identity values.
356
399
public override init ( ) {
357
- transformStruct = AffineTransform (
400
+ affineTransform = AffineTransform (
358
401
m11: CGFloat ( 1.0 ) , m12: CGFloat ( ) ,
359
402
m21: CGFloat ( ) , m22: CGFloat ( 1.0 ) ,
360
403
tX: CGFloat ( ) , tY: CGFloat ( )
361
404
)
362
405
}
363
-
406
+
364
407
// Translating
365
408
open func translateX( by deltaX: CGFloat , yBy deltaY: CGFloat ) {
366
409
let translation = AffineTransform ( translationByX: deltaX, byY: deltaY)
367
- transformStruct = translation. concatenated ( transformStruct )
410
+ affineTransform = translation. concatenated ( affineTransform )
368
411
}
369
412
370
413
// Rotating
371
414
open func rotate( byDegrees angle: CGFloat ) {
372
415
let rotation = AffineTransform ( rotationByDegrees: angle)
373
- transformStruct = rotation. concatenated ( transformStruct )
416
+ affineTransform = rotation. concatenated ( affineTransform )
374
417
}
418
+
375
419
open func rotate( byRadians angle: CGFloat ) {
376
420
let rotation = AffineTransform ( rotationByRadians: angle)
377
- transformStruct = rotation. concatenated ( transformStruct )
421
+ affineTransform = rotation. concatenated ( affineTransform )
378
422
}
379
423
380
424
// Scaling
@@ -384,38 +428,36 @@ open class NSAffineTransform : NSObject, NSCopying, NSSecureCoding {
384
428
385
429
open func scaleX( by scaleX: CGFloat , yBy scaleY: CGFloat ) {
386
430
let scale = AffineTransform ( scaleByX: scaleX, byY: scaleY)
387
- transformStruct = scale. concatenated ( transformStruct )
431
+ affineTransform = scale. concatenated ( affineTransform )
388
432
}
389
433
390
434
// Inverting
391
435
open func invert( ) {
392
- if let inverse = transformStruct . inverted ( ) {
393
- transformStruct = inverse
436
+ if let inverse = affineTransform . inverted ( ) {
437
+ affineTransform = inverse
394
438
}
395
439
else {
396
440
preconditionFailure ( " NSAffineTransform: Transform has no inverse " )
397
441
}
398
442
}
399
443
400
444
// Transforming with transform
401
- open func append( _ transform: NSAffineTransform ) {
402
- transformStruct = transformStruct . concatenated ( transform. transformStruct )
445
+ open func append( _ transform: AffineTransform ) {
446
+ affineTransform = affineTransform . concatenated ( transform)
403
447
}
404
- open func prepend( _ transform: NSAffineTransform ) {
405
- transformStruct = transform. transformStruct. concatenated ( transformStruct)
448
+
449
+ open func prepend( _ transform: AffineTransform ) {
450
+ affineTransform = transform. concatenated ( affineTransform)
406
451
}
407
452
408
453
// Transforming points and sizes
409
454
open func transform( _ aPoint: NSPoint ) -> NSPoint {
410
- return transformStruct . transform ( aPoint)
455
+ return affineTransform . transform ( aPoint)
411
456
}
412
457
413
458
open func transform( _ aSize: NSSize ) -> NSSize {
414
- return transformStruct . transform ( aSize)
459
+ return affineTransform . transform ( aSize)
415
460
}
416
-
417
- // Transform Struct
418
- open var transformStruct : AffineTransform
419
461
}
420
462
421
463
extension AffineTransform : _ObjectTypeBridgeable {
@@ -429,9 +471,7 @@ extension AffineTransform : _ObjectTypeBridgeable {
429
471
430
472
@_semantics ( " convertToObjectiveC " )
431
473
public func _bridgeToObjectiveC( ) -> NSAffineTransform {
432
- let t = NSAffineTransform ( )
433
- t. transformStruct = self
434
- return t
474
+ return NSAffineTransform ( transform: self )
435
475
}
436
476
437
477
public static func _forceBridgeFromObjectiveC( _ x: NSAffineTransform , result: inout AffineTransform ? ) {
@@ -441,7 +481,8 @@ extension AffineTransform : _ObjectTypeBridgeable {
441
481
}
442
482
443
483
public static func _conditionallyBridgeFromObjectiveC( _ x: NSAffineTransform , result: inout AffineTransform ? ) -> Bool {
444
- result = x. transformStruct
484
+ let ts = x. transformStruct
485
+ result = AffineTransform ( m11: ts. m11, m12: ts. m12, m21: ts. m21, m22: ts. m22, tX: ts. tX, tY: ts. tY)
445
486
return true // Can't fail
446
487
}
447
488
0 commit comments