00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "CGGeometry.h"
00024 #include "CGAffineTransform.h"
00025
00026 #define _function(inline) function inline { return _##inline; }
00027
00028 @import "CGGeometry.j"
00029
00030
00031 _function(CGAffineTransformMake(a, b, c, d, tx, ty))
00032 _function(CGAffineTransformMakeIdentity())
00033 _function(CGAffineTransformMakeCopy(anAffineTransform))
00034
00035 _function(CGAffineTransformMakeScale(sx, sy))
00036 _function(CGAffineTransformMakeTranslation(tx, ty))
00037 _function(CGAffineTransformTranslate(aTransform, tx, ty))
00038 _function(CGAffineTransformScale(aTransform, sx, sy))
00039
00040 _function(CGAffineTransformConcat(lhs, rhs))
00041 _function(CGPointApplyAffineTransform(aPoint, aTransform))
00042 _function(CGSizeApplyAffineTransform(aSize, aTransform))
00043
00044 _function(CGAffineTransformIsIdentity(aTransform))
00045 _function(CGAffineTransformEqualToTransform(lhs, rhs))
00046
00047 _function(CGStringCreateWithCGAffineTransform(aTransform))
00048
00049
00050
00051
00052
00053
00054 function CGAffineTransformCreateCopy(aTransform)
00055 {
00056 return _CGAffineTransformMakeCopy(aTransform);
00057 }
00058
00067 function CGAffineTransformMakeRotation(anAngle)
00068 {
00069 var sin = SIN(anAngle),
00070 cos = COS(anAngle);
00071
00072 return _CGAffineTransformMake(cos, sin, -sin, cos, 0.0, 0.0);
00073 }
00074
00082 function CGAffineTransformRotate(aTransform, anAngle)
00083 {
00084 var sin = SIN(anAngle),
00085 cos = COS(anAngle);
00086
00087 return {
00088 a:aTransform.a * cos + aTransform.c * sin,
00089 b:aTransform.b * cos + aTransform.d * sin,
00090 c:aTransform.c * cos - aTransform.a * sin,
00091 d:aTransform.d * cos - aTransform.b * sin,
00092 tx:aTransform.tx,
00093 ty:aTransform.ty
00094 };
00095 }
00096
00103 function CGAffineTransformInvert(aTransform)
00104 {
00105 var determinant = 1 / (aTransform.a * aTransform.d - aTransform.b * aTransform.c);
00106
00107 return {
00108 a:determinant * aTransform.d,
00109 b:-determinant * aTransform.b,
00110 c:-determinant * aTransform.c,
00111 d:determinant * aTransform.a,
00112 tx:determinant * (aTransform.c * aTransform.ty - aTransform.d * aTransform.tx),
00113 ty:determinant * (aTransform.b * aTransform.tx - aTransform.a * aTransform.ty)
00114 };
00115 }
00116
00125 function CGRectApplyAffineTransform(aRect, anAffineTransform)
00126 {
00127 var top = _CGRectGetMinY(aRect),
00128 left = _CGRectGetMinX(aRect),
00129 right = _CGRectGetMaxX(aRect),
00130 bottom = _CGRectGetMaxY(aRect),
00131 topLeft = CGPointApplyAffineTransform(_CGPointMake(left, top), anAffineTransform),
00132 topRight = CGPointApplyAffineTransform(_CGPointMake(right, top), anAffineTransform),
00133 bottomLeft = CGPointApplyAffineTransform(_CGPointMake(left, bottom), anAffineTransform),
00134 bottomRight = CGPointApplyAffineTransform(_CGPointMake(right, bottom), anAffineTransform),
00135 minX = MIN(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
00136 maxX = MAX(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
00137 minY = MIN(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y),
00138 maxY = MAX(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
00139
00140 return _CGRectMake(minX, minY, (maxX - minX), (maxY - minY));
00141 }
00142
00149 function CPStringFromCGAffineTransform(anAffineTransform)
00150 {
00151 return '{' + anAffineTransform.a + ", " + anAffineTransform.b + ", " + anAffineTransform.c + ", " + anAffineTransform.d + ", " + anAffineTransform.tx + ", " + anAffineTransform.ty + '}';
00152 }