44 return { count:0, start:CGPointMake(0, 0), current:CGPointMake(0, 0), elements:[] };
78 function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, isClockwise)
82 var center = CGPointMake(x, y),
83 end = CGPointMake(COS(anEndAngle), SIN(anEndAngle)),
84 start = CGPointMake(COS(aStartAngle), SIN(aStartAngle));
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);
110 aRadius = SQRT(aRadius.width * aRadius.width + aRadius.height * aRadius.height);
120 var arcEndX = x + aRadius * COS(anEndAngle),
121 arcEndY = y + aRadius * SIN(anEndAngle),
122 arcStartX = x + aRadius * COS(aStartAngle),
123 arcStartY = y + aRadius * SIN(aStartAngle);
127 if (aPath.current.x !== x || aPath.current.y !== y)
132 var arcStartX = x + aRadius * COS(aStartAngle),
133 arcStartY = y + aRadius * SIN(aStartAngle);
135 aPath.start = CGPointMake(arcStartX, arcStartY);
138 aPath.current = CGPointMake(arcEndX, arcEndY);
139 aPath.elements[aPath.count++] = { type:
kCGPathElementAddArc, x:x, y:y, radius:aRadius, startAngle:aStartAngle, endAngle:anEndAngle, isClockwise:isClockwise };
144 var p1 = CGPointMake(x1, y1),
145 p2 = CGPointMake(x2, y2);
162 if (aPath.current.x !== p1.x || aPath.current.y !== p1.y)
174 var cp1 = CGPointMake(cp1x, cp1y),
175 cp2 = CGPointMake(cp2x, cp2y),
176 end = CGPointMake(x, y);
191 if (count === null || count === undefined)
192 count = points.length;
194 if (!aPath || count < 1)
199 for (var i = 1; i < count; ++i)
205 var point = CGPointMake(x, y);
207 if (aTransform !== NULL)
211 aPath.current = point;
216 for (var i = 0, count = anotherPath.count; i < count; ++i)
218 var element = anotherPath.elements[i];
220 switch (element.type)
228 element.cp1x, element.cp1y,
229 element.cp2x, element.cp2y,
230 element.x, element.y);
235 element.radius, element.startAngle,
236 element.endAngle, element.isClockwise);
241 element.p1x, element.p1y,
242 element.p2x, element.p2y,
248 element.cpx, element.cpy,
249 element.x, element.y);
265 var cp = CGPointMake(cpx, cpy),
266 end = CGPointMake(x, y);
288 var count = rects.length;
290 for (; i < count; ++i)
305 var point = CGPointMake(x, y);
307 if (aTransform !== NULL)
310 aPath.start = aPath.current = point;
315 var previous = aPath.elements[aPath.count - 1];
319 previous.x = point.x;
320 previous.y = point.y;
328 var
KAPPA = 4.0 * ((SQRT2 - 1.0) / 3.0);
334 if (CGRectGetWidth(aRect) === CGRectGetHeight(aRect))
335 CGPathAddArc(path, nil, CGRectGetMidX(aRect), CGRectGetMidY(aRect), CGRectGetWidth(aRect) / 2.0, 0.0, 2 * PI, YES);
338 var axis = CGSizeMake(CGRectGetWidth(aRect) / 2.0, CGRectGetHeight(aRect) / 2.0),
339 center = CGPointMake(CGRectGetMinX(aRect) + axis.width, CGRectGetMinY(aRect) + axis.height);
343 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);
344 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);
345 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);
346 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);
357 xMin = CGRectGetMinX(aRect),
358 xMax = CGRectGetMaxX(aRect),
359 yMin = CGRectGetMinY(aRect),
360 yMax = CGRectGetMaxY(aRect);
403 var count = aPath.count;
410 aPath.current = CGPointCreateCopy(aPath.start);
416 if (aPath === anotherPath)
419 if (aPath.count !== anotherPath.count || !CGPointEqualToPoint(aPath.start, anotherPath.start) || !CGPointEqualToPoint(aPath.current, anotherPath.current))
425 for (; i < count; ++i)
427 var element = aPath[i],
428 anotherElement = anotherPath[i];
430 if (element.type !== anotherElement.type)
433 switch (element.type)
436 if (element.x !== anotherElement.x ||
437 element.y !== anotherElement.y ||
438 element.radius !== anotherElement.radius ||
439 element.startAngle !== anotherElement.startAngle ||
440 element.endAngle !== anotherElement.endAngle ||
441 element.isClockwise !== anotherElement.isClockwise)
448 if (element.p1x !== anotherElement.p1x ||
449 element.p1y !== anotherElement.p1y ||
450 element.p2x !== anotherElement.p2x ||
451 element.p2y !== anotherElement.p2y ||
452 element.radius !== anotherElement.radius)
459 if (element.cp1x !== anotherElement.cp1x ||
460 element.cp1y !== anotherElement.cp1y ||
461 element.cp2x !== anotherElement.cp2x ||
462 element.cp2y !== anotherElement.cp2y ||
463 element.x !== anotherElement.x ||
464 element.y !== anotherElement.y)
472 if (element.x !== anotherElement.x ||
473 element.y !== anotherElement.y)
480 if (element.cpx !== anotherElement.cpx ||
481 element.cpy !== anotherElement.cpy ||
482 element.x !== anotherElement.x ||
483 element.y !== anotherElement.y)
490 if (!CGPointEqualToPoint(element.start, anotherElement.start))
501 return CGPointCreateCopy(aPath.current);
506 return !aPath || aPath.count === 0;
514 if (!aPath || !aPath.count)
515 return CGRectMakeZero();
523 function addPoint(x, y)
531 for (var i = 0, count = aPath.count; i < count; ++i)
533 var element = aPath.elements[i];
537 switch (element.type)
542 addPoint(movePoint.x, movePoint.y);
546 addPoint(element.x, element.y);
552 addPoint(movePoint.x, movePoint.y);
556 addPoint(element.cp1x, element.cp1y);
557 addPoint(element.cp2x, element.cp2y);
558 addPoint(element.x, element.y);
564 addPoint(movePoint.x, movePoint.y);
568 addPoint(element.x, element.y);
574 addPoint(movePoint.x, movePoint.y);
578 addPoint(element.p1x, element.p1y);
579 addPoint(element.p2x, element.p2y);
585 addPoint(movePoint.x, movePoint.y);
589 addPoint(element.cpx, element.cpy);
590 addPoint(element.x, element.y);
594 movePoint = CGPointMake(element.x, element.y);
600 addPoint(movePoint.x, movePoint.y);
608 return CGRectMake(ox, oy, rx - ox, ry - oy);
625 return context.isPointInPath(point.x, point.y);