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
00086 function CGRectContainsRect(lhsRect, rhsRect)
00087 {
00088 var union = CGRectUnion(lhsRect, rhsRect);
00089
00090 return _CGRectEqualToRect(union, lhsRect);
00091 }
00092
00100 function CGRectIntersectsRect(lhsRect, rhsRect)
00101 {
00102 var intersection = CGRectIntersection(lhsRect, rhsRect);
00103
00104 return !_CGRectIsEmpty(intersection);
00105 }
00106
00114 function CGRectIntegral(aRect)
00115 {
00116 aRect = CGRectStandardize(aRect);
00117
00118
00119 var x = FLOOR(_CGRectGetMinX(aRect)),
00120 y = FLOOR(_CGRectGetMinY(aRect));
00121
00122 aRect.size.width = CEIL(_CGRectGetMaxX(aRect)) - x;
00123 aRect.size.height = CEIL(_CGRectGetMaxY(aRect)) - y;
00124
00125 aRect.origin.x = x;
00126 aRect.origin.y = y;
00127
00128 return aRect;
00129 }
00130
00138 function CGRectIntersection(lhsRect, rhsRect)
00139 {
00140 var intersection = _CGRectMake(
00141 MAX(_CGRectGetMinX(lhsRect), _CGRectGetMinX(rhsRect)),
00142 MAX(_CGRectGetMinY(lhsRect), _CGRectGetMinY(rhsRect)),
00143 0, 0);
00144
00145 intersection.size.width = MIN(_CGRectGetMaxX(lhsRect), _CGRectGetMaxX(rhsRect)) - _CGRectGetMinX(intersection);
00146 intersection.size.height = MIN(_CGRectGetMaxY(lhsRect), _CGRectGetMaxY(rhsRect)) - _CGRectGetMinY(intersection);
00147
00148 return _CGRectIsEmpty(intersection) ? _CGRectMakeZero() : intersection;
00149 }
00150
00151
00152
00153
00154 function CGRectStandardize(aRect)
00155 {
00156 var width = _CGRectGetWidth(aRect),
00157 height = _CGRectGetHeight(aRect),
00158 standardized = aRect;
00159
00160 if (width < 0.0)
00161 {
00162 if (standardized == aRect)
00163 standardized = _CGRectMakeCopy(aRect);
00164
00165 standardized.origin.x += width;
00166 standardized.size.width = -width;
00167 }
00168
00169 if (height < 0.0)
00170 {
00171 if (standardized == aRect)
00172 standardized = _CGRectMakeCopy(aRect);
00173
00174 standardized.origin.y += height;
00175 standardized.size.height = -height;
00176 }
00177
00178 return standardized;
00179 }
00180
00181 function CGRectUnion(lhsRect, rhsRect)
00182 {
00183 var minX = MIN(_CGRectGetMinX(lhsRect), _CGRectGetMinX(rhsRect)),
00184 minY = MIN(_CGRectGetMinY(lhsRect), _CGRectGetMinY(rhsRect)),
00185 maxX = MAX(_CGRectGetMaxX(lhsRect), _CGRectGetMaxX(rhsRect)),
00186 maxY = MAX(_CGRectGetMaxY(lhsRect), _CGRectGetMaxY(rhsRect));
00187
00188 return _CGRectMake(minX, minY, maxX - minX, maxY - minY);
00189 }
00190
00191 function CGPointFromString(aString)
00192 {
00193 var comma = aString.indexOf(',');
00194
00195 return { x:parseInt(aString.substr(1, comma - 1)), y:parseInt(aString.substring(comma + 1, aString.length)) };
00196 }
00197
00198 function CGSizeFromString(aString)
00199 {
00200 var comma = aString.indexOf(',');
00201
00202 return { width:parseInt(aString.substr(1, comma - 1)), height:parseInt(aString.substring(comma + 1, aString.length)) };
00203 }
00204
00205 function CGRectFromString(aString)
00206 {
00207 var comma = aString.indexOf(',', aString.indexOf(',') + 1);
00208
00209 return { origin:CGPointFromString(aString.substr(1, comma - 1)), size:CGSizeFromString(aString.substring(comma + 2, aString.length)) };
00210 }
00211
00212 function CGPointFromEvent(anEvent)
00213 {
00214 return _CGPointMake(anEvent.clientX, anEvent.clientY);
00215 }
00216
00217 function CGInsetFromString(aString)
00218 {
00219 var numbers = aString.substr(1, aString.length - 2).split(',');
00220
00221 return _CGInsetMake(parseFloat(numbers[0]), parseFloat(numbers[1]), parseFloat(numbers[2]), parseFloat(numbers[3]));
00222 }
00223
00224 CGInsetFromCPString = CGInsetFromString;
00225
00226 function CPStringFromCGInset(anInset)
00227 {
00228 return '{' + anInset.top + ", " + anInset.left + ", " + anInset.bottom + ", " + anInset.right + '}';
00229 }
00230