24 @
typedef CGAffineTransform
29 return { a:a, b:b, c:c, d:d, tx:tx, ty:ty };
34 return { a:1.0, b:0.0, c:0.0, d:1.0, tx:0.0, ty:0.0 };
39 return { a:anAffineTransform.a, b:anAffineTransform.b, c:anAffineTransform.c, d:anAffineTransform.d, tx:anAffineTransform.tx, ty:anAffineTransform.ty };
44 return { a:sx, b:0.0, c:0.0, d:sy, tx:0.0, ty:0.0 };
49 return { a:1.0, b:0.0, c:0.0, d:1.0, tx:tx, ty:ty };
54 return CGAffineTransformMake(aTransform.a, aTransform.b, aTransform.c, aTransform.d, aTransform.tx + aTransform.a * tx + aTransform.c * ty, aTransform.ty + aTransform.b * tx + aTransform.d * ty);
59 return CGAffineTransformMake(aTransform.a * sx, aTransform.b * sx, aTransform.c * sy, aTransform.d * sy, aTransform.tx, aTransform.ty);
65 return CGAffineTransformMake(lhs.a * rhs.a + lhs.b * rhs.c, lhs.a * rhs.b + lhs.b * rhs.d, lhs.c * rhs.a + lhs.d * rhs.c, lhs.c * rhs.b + lhs.d * rhs.d, lhs.tx * rhs.a + lhs.ty * rhs.c + rhs.tx, lhs.tx * rhs.b + lhs.ty * rhs.d + rhs.ty);
70 var tx = lhs.tx * rhs.a + lhs.ty * rhs.c + rhs.tx;
72 to.ty = lhs.tx * rhs.b + lhs.ty * rhs.d + rhs.ty;
75 var a = lhs.a * rhs.a + lhs.b * rhs.c,
76 b = lhs.a * rhs.b + lhs.b * rhs.d,
77 c = lhs.c * rhs.a + lhs.d * rhs.c;
79 to.d = lhs.c * rhs.b + lhs.d * rhs.d;
87 return { x:aPoint.x * aTransform.a + aPoint.y * aTransform.c + aTransform.tx,
88 y:aPoint.x * aTransform.b + aPoint.y * aTransform.d + aTransform.ty };
93 return {
width:aSize.width * aTransform.a + aSize.height * aTransform.c,
94 height:aSize.width * aTransform.b + aSize.height * aTransform.d };
100 return (aTransform.a === 1.0 &&
101 aTransform.b === 0.0 &&
102 aTransform.c === 0.0 &&
103 aTransform.d === 1.0 &&
104 aTransform.tx === 0.0 &&
105 aTransform.ty === 0.0);
110 return (lhs.a === rhs.a &&
121 return (
" [[ " + aTransform.a +
", " + aTransform.b +
", 0 ], [ " + aTransform.c +
", " + aTransform.d +
", 0 ], [ " + aTransform.tx +
", " + aTransform.ty +
", 1]]");
140 function CGAffineTransformMakeRotation(anAngle)
142 var sin = SIN(anAngle),
155 function CGAffineTransformRotate(aTransform, anAngle)
157 var sin = SIN(anAngle),
161 a:aTransform.a * cos + aTransform.c * sin,
162 b:aTransform.b * cos + aTransform.d * sin,
163 c:aTransform.c * cos - aTransform.a * sin,
164 d:aTransform.d * cos - aTransform.b * sin,
176 function CGAffineTransformInvert(aTransform)
178 var determinant = 1 / (aTransform.a * aTransform.d - aTransform.b * aTransform.c);
181 a:determinant * aTransform.d,
182 b:-determinant * aTransform.b,
183 c:-determinant * aTransform.c,
184 d:determinant * aTransform.a,
185 tx:determinant * (aTransform.c * aTransform.ty - aTransform.d * aTransform.tx),
186 ty:determinant * (aTransform.b * aTransform.tx - aTransform.a * aTransform.ty)
198 function CGRectApplyAffineTransform(aRect, anAffineTransform)
200 var top = CGRectGetMinY(aRect),
201 left = CGRectGetMinX(aRect),
202 right = CGRectGetMaxX(aRect),
203 bottom = CGRectGetMaxY(aRect),
208 minX = MIN(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
209 maxX = MAX(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
210 minY = MIN(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y),
211 maxY = MAX(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
213 return CGRectMake(minX, minY, (maxX - minX), (maxY - minY));
222 function CPStringFromCGAffineTransform(anAffineTransform)
224 return '{' + anAffineTransform.a + ", " + anAffineTransform.b + ", " + anAffineTransform.c + ", " + anAffineTransform.d + ", " + anAffineTransform.tx + ", " + anAffineTransform.ty + '}';