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
00025 #define _function(inline) function inline { return _##inline; }
00026
00027 _function(CGPointMake(x, y))
00028 _function(CGPointMakeZero())
00029 _function(CGPointMakeCopy(aPoint))
00030 _function(CGPointCreateCopy(aPoint))
00031
00032 _function(CGPointEqualToPoint(lhsPoint, rhsPoint))
00033 _function(CGStringFromPoint(aPoint))
00034
00035 _function(CGSizeMake(width, height))
00036 _function(CGSizeMakeZero())
00037 _function(CGSizeMakeCopy(aSize))
00038 _function(CGSizeCreateCopy(aSize))
00039
00040 _function(CGSizeEqualToSize(lhsSize, rhsSize))
00041 _function(CGStringFromSize(aSize))
00042
00043 _function(CGRectMake(x, y, width, height))
00044 _function(CGRectMakeZero())
00045 _function(CGRectMakeCopy(aRect))
00046 _function(CGRectCreateCopy(aRect))
00047
00048 _function(CGRectEqualToRect(lhsRect, rhsRect))
00049 _function(CGStringFromRect(aRect))
00050
00051 _function(CGRectOffset(aRect, dX, dY))
00052 _function(CGRectInset(aRect, dX, dY))
00053
00054 _function(CGRectGetHeight(aRect))
00055 _function(CGRectGetMaxX(aRect))
00056 _function(CGRectGetMaxY(aRect))
00057 _function(CGRectGetMidX(aRect))
00058 _function(CGRectGetMidY(aRect))
00059 _function(CGRectGetMinX(aRect))
00060 _function(CGRectGetMinY(aRect))
00061 _function(CGRectGetWidth(aRect))
00062
00063 _function(CGRectIsEmpty(aRect))
00064 _function(CGRectIsNull(aRect))
00065
00066 _function(CGRectContainsPoint(aRect, aPoint))
00067
00068 _function(CGInsetMake(top, right, bottom, left))
00069 _function(CGInsetMakeZero())
00070 _function(CGInsetMakeCopy(anInset))
00071 _function(CGInsetIsEmpty(anInset))
00072
00073 CGRectNull = _CGRectMake(Infinity, Infinity, 0.0, 0.0);
00074
00088 function CGRectContainsRect(lhsRect, rhsRect)
00089 {
00090 var union = CGRectUnion(lhsRect, rhsRect);
00091
00092 return _CGRectEqualToRect(union, lhsRect);
00093 }
00094
00102 function CGRectIntersectsRect(lhsRect, rhsRect)
00103 {
00104 var intersection = CGRectIntersection(lhsRect, rhsRect);
00105
00106 return !_CGRectIsEmpty(intersection);
00107 }
00108
00116 function CGRectIntegral(aRect)
00117 {
00118 aRect = CGRectStandardize(aRect);
00119
00120
00121 var x = FLOOR(_CGRectGetMinX(aRect)),
00122 y = FLOOR(_CGRectGetMinY(aRect));
00123
00124 aRect.size.width = CEIL(_CGRectGetMaxX(aRect)) - x;
00125 aRect.size.height = CEIL(_CGRectGetMaxY(aRect)) - y;
00126
00127 aRect.origin.x = x;
00128 aRect.origin.y = y;
00129
00130 return aRect;
00131 }
00132
00140 function CGRectIntersection(lhsRect, rhsRect)
00141 {
00142 var intersection = _CGRectMake(
00143 MAX(_CGRectGetMinX(lhsRect), _CGRectGetMinX(rhsRect)),
00144 MAX(_CGRectGetMinY(lhsRect), _CGRectGetMinY(rhsRect)),
00145 0, 0);
00146
00147 intersection.size.width = MIN(_CGRectGetMaxX(lhsRect), _CGRectGetMaxX(rhsRect)) - _CGRectGetMinX(intersection);
00148 intersection.size.height = MIN(_CGRectGetMaxY(lhsRect), _CGRectGetMaxY(rhsRect)) - _CGRectGetMinY(intersection);
00149
00150 return _CGRectIsEmpty(intersection) ? _CGRectMakeZero() : intersection;
00151 }
00152
00153
00154
00155
00156 function CGRectStandardize(aRect)
00157 {
00158 var width = _CGRectGetWidth(aRect),
00159 height = _CGRectGetHeight(aRect),
00160 standardized = _CGRectMakeCopy(aRect);
00161
00162 if (width < 0.0)
00163 {
00164 standardized.origin.x += width;
00165 standardized.size.width = -width;
00166 }
00167
00168 if (height < 0.0)
00169 {
00170 standardized.origin.y += height;
00171 standardized.size.height = -height;
00172 }
00173
00174 return standardized;
00175 }
00176
00177 function CGRectUnion(lhsRect, rhsRect)
00178 {
00179 var lhsRectIsNull = !lhsRect || lhsRect === CGRectNull,
00180 rhsRectIsNull = !rhsRect || rhsRect === CGRectNull;
00181
00182 if (lhsRectIsNull)
00183 return rhsRectIsNull ? CGRectNull : rhsRect;
00184
00185 if (rhsRectIsNull)
00186 return lhsRectIsNull ? CGRectNull : lhsRect;
00187
00188 var minX = MIN(_CGRectGetMinX(lhsRect), _CGRectGetMinX(rhsRect)),
00189 minY = MIN(_CGRectGetMinY(lhsRect), _CGRectGetMinY(rhsRect)),
00190 maxX = MAX(_CGRectGetMaxX(lhsRect), _CGRectGetMaxX(rhsRect)),
00191 maxY = MAX(_CGRectGetMaxY(lhsRect), _CGRectGetMaxY(rhsRect));
00192
00193 return _CGRectMake(minX, minY, maxX - minX, maxY - minY);
00194 }
00195
00196 function CGPointFromString(aString)
00197 {
00198 var comma = aString.indexOf(',');
00199
00200 return { x:parseInt(aString.substr(1, comma - 1)), y:parseInt(aString.substring(comma + 1, aString.length)) };
00201 }
00202
00203 function CGSizeFromString(aString)
00204 {
00205 var comma = aString.indexOf(',');
00206
00207 return { width:parseInt(aString.substr(1, comma - 1)), height:parseInt(aString.substring(comma + 1, aString.length)) };
00208 }
00209
00210 function CGRectFromString(aString)
00211 {
00212 var comma = aString.indexOf(',', aString.indexOf(',') + 1);
00213
00214 return { origin:CGPointFromString(aString.substr(1, comma - 1)), size:CGSizeFromString(aString.substring(comma + 2, aString.length)) };
00215 }
00216
00217 function CGPointFromEvent(anEvent)
00218 {
00219 return _CGPointMake(anEvent.clientX, anEvent.clientY);
00220 }
00221
00222 function CGInsetFromString(aString)
00223 {
00224 var numbers = aString.substr(1, aString.length - 2).split(',');
00225
00226 return _CGInsetMake(parseFloat(numbers[0]), parseFloat(numbers[1]), parseFloat(numbers[2]), parseFloat(numbers[3]));
00227 }
00228
00229 CGInsetFromCPString = CGInsetFromString;
00230
00231 function CPStringFromCGInset(anInset)
00232 {
00233 return '{' + anInset.top + ", " + anInset.left + ", " + anInset.bottom + ", " + anInset.right + '}';
00234 }
00235