44 return { count:0, start:NULL, current:NULL, elements:[] };
78 function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, isClockwise)
80 if (aTransform && !_CGAffineTransformIsIdentity(aTransform))
82 var center = _CGPointMake(x, y),
83 end = _CGPointMake(COS(anEndAngle), SIN(anEndAngle)),
84 start = _CGPointMake(COS(aStartAngle), SIN(aStartAngle));
86 end = _CGPointApplyAffineTransform(end, aTransform);
87 start = _CGPointApplyAffineTransform(start, aTransform);
88 center = _CGPointApplyAffineTransform(center, aTransform);
93 var oldEndAngle = anEndAngle,
94 oldStartAngle = aStartAngle;
96 anEndAngle = ATAN2(end.y - aTransform.ty, end.x - aTransform.tx);
97 aStartAngle = ATAN2(start.y - aTransform.ty, start.x - aTransform.tx);
102 if (anEndAngle == aStartAngle && oldEndAngle != oldStartAngle)
103 if (oldStartAngle > oldEndAngle)
104 anEndAngle = anEndAngle - PI2;
106 aStartAngle = aStartAngle - PI2;
108 aRadius = _CGSizeMake(aRadius, 0);
109 aRadius = _CGSizeApplyAffineTransform(aRadius, aTransform);
110 aRadius = SQRT(aRadius.width * aRadius.width + aRadius.height * aRadius.height);
113 aPath.current = _CGPointMake(x + aRadius * COS(anEndAngle), y + aRadius * SIN(anEndAngle));
114 aPath.elements[aPath.count++] = { type:
kCGPathElementAddArc, x:x, y:y, radius:aRadius, startAngle:aStartAngle, endAngle:anEndAngle };
119 var p1 = _CGPointMake(x1, y1),
120 p2 = _CGPointMake(x2, y2);
124 p1 = _CGPointApplyAffineTransform(p1, aTransform);
125 p2 = _CGPointApplyAffineTransform(p2, aTransform);
134 var cp1 = _CGPointMake(cp1x, cp1y),
135 cp2 = _CGPointMake(cp2x, cp2y),
136 end = _CGPointMake(x, y);
140 cp1 = _CGPointApplyAffineTransform(cp1, aTransform);
141 cp2 = _CGPointApplyAffineTransform(cp2, aTransform);
142 end = _CGPointApplyAffineTransform(end, aTransform);
154 var count = points.length;
156 if (!aPath || count < 2)
161 for (; i < count; ++i)
167 var point = _CGPointMake(x, y);
169 if (aTransform != NULL)
170 point = _CGPointApplyAffineTransform(point, aTransform);
173 aPath.current = point;
178 for (var i = 0, count = anotherPath.count; i < count; ++i)
180 var element = anotherPath.elements[i];
182 switch (element.type)
188 element.cp1x, element.cp1y,
189 element.cp2x, element.cp2y,
190 element.x, element.y);
194 element.radius, element.startAngle,
195 element.endAngle, element.isClockwise);
199 element.p1x, element.p1y,
200 element.p2x, element.p2y,
205 element.cpx, element.cpy,
206 element.x, element.y);
220 var cp = _CGPointMake(cpx, cpy),
221 end = _CGPointMake(x, y);
225 cp = _CGPointApplyAffineTransform(cp, aTransform);
226 end = _CGPointApplyAffineTransform(end, aTransform);
243 var count = rects.length;
245 for (; i < count; ++i)
249 CGPathMoveToPoint(aPath, aTransform, _CGRectGetMinX(rect), _CGRectGetMinY(rect));
260 var point = _CGPointMake(x, y),
263 if (aTransform != NULL)
264 point = _CGPointApplyAffineTransform(point, aTransform);
267 aPath.current = point;
269 var previous = aPath.elements[count - 1];
273 previous.x = point.x;
274 previous.y = point.y;
280 var
KAPPA = 4.0 * ((SQRT2 - 1.0) / 3.0);
286 if (_CGRectGetWidth(aRect) == _CGRectGetHeight(aRect))
287 CGPathAddArc(path, nil, _CGRectGetMidX(aRect), _CGRectGetMidY(aRect), _CGRectGetWidth(aRect) / 2.0, 0.0, 2 * PI, YES);
290 var axis = _CGSizeMake(_CGRectGetWidth(aRect) / 2.0, _CGRectGetHeight(aRect) / 2.0),
291 center = _CGPointMake(_CGRectGetMinX(aRect) + axis.width, _CGRectGetMinY(aRect) + axis.height);
295 CGPathAddCurveToPoint(path, nil, center.x + (
KAPPA * axis.width), center.y - axis.height, center.x + axis.width, center.y - (
KAPPA * axis.height), center.x + axis.width, center.y);
296 CGPathAddCurveToPoint(path, nil, center.x + axis.width, center.y + (
KAPPA * axis.height), center.x + (
KAPPA * axis.width), center.y + axis.height, center.x, center.y + axis.height);
297 CGPathAddCurveToPoint(path, nil, center.x - (
KAPPA * axis.width), center.y + axis.height, center.x - axis.width, center.y + (
KAPPA * axis.height), center.x - axis.width, center.y);
298 CGPathAddCurveToPoint(path, nil, center.x - axis.width, center.y - (
KAPPA * axis.height), center.x - (
KAPPA * axis.width), center.y - axis.height, center.x, center.y - axis.height);
309 xMin = _CGRectGetMinX(aRect),
310 xMax = _CGRectGetMaxX(aRect),
311 yMin = _CGRectGetMinY(aRect),
312 yMax = _CGRectGetMaxY(aRect);
355 var count = aPath.count;
366 if (aPath == anotherPath)
369 if (aPath.count != anotherPath.count || !_CGPointEqualToPoint(aPath.start, anotherPath.start) || !_CGPointEqualToPoint(aPath.current, anotherPath.current))
375 for (; i < count; ++i)
377 var element = aPath[i],
378 anotherElement = anotherPath[i];
380 if (element.type != anotherElement.type)
384 element.radius != anotherElement.radius)
387 var j = element.points.length;
390 if (!_CGPointEqualToPoint(element.points[j], anotherElement.points[j]))
399 return _CGPointCreateCopy(aPath.current);
404 return !aPath || aPath.count == 0;
412 if (!aPath || !aPath.count)
413 return _CGRectMakeZero();
421 function addPoint(x, y)
429 for (var i = 0, count = aPath.count; i < count; ++i)
431 var element = aPath.elements[i];
435 switch (element.type)
440 addPoint(movePoint.x, movePoint.y);
444 addPoint(element.x, element.y);
450 addPoint(movePoint.x, movePoint.y);
454 addPoint(element.cp1x, element.cp1y);
455 addPoint(element.cp2x, element.cp2y);
456 addPoint(element.x, element.y);
462 addPoint(movePoint.x, movePoint.y);
466 addPoint(element.x, element.y);
472 addPoint(movePoint.x, movePoint.y);
476 addPoint(element.p1x, element.p1y);
477 addPoint(element.p2x, element.p2y);
483 addPoint(movePoint.x, movePoint.y);
487 addPoint(element.cpx, element.cpy);
488 addPoint(element.x, element.y);
492 movePoint = _CGPointMake(element.x, element.y);
498 addPoint(movePoint.x, movePoint.y);
506 return _CGRectMake(ox, oy, rx - ox, ry - oy);