45 return { count:0, start:CGPointMake(0, 0), current:CGPointMake(0, 0), elements:[] };
79 function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, isClockwise)
83 var center = CGPointMake(x, y),
84 end = CGPointMake(COS(anEndAngle), SIN(anEndAngle)),
85 start = CGPointMake(COS(aStartAngle), SIN(aStartAngle));
94 var oldEndAngle = anEndAngle,
95 oldStartAngle = aStartAngle;
97 anEndAngle = ATAN2(end.y - aTransform.ty, end.x - aTransform.tx);
98 aStartAngle = ATAN2(start.y - aTransform.ty, start.x - aTransform.tx);
103 if (anEndAngle === aStartAngle && oldEndAngle !== oldStartAngle)
104 if (oldStartAngle > oldEndAngle)
105 anEndAngle = anEndAngle - PI2;
107 aStartAngle = aStartAngle - PI2;
109 aRadius = CGSizeMake(aRadius, 0);
111 aRadius = SQRT(aRadius.width * aRadius.width + aRadius.height * aRadius.height);
121 var arcEndX = x + aRadius * COS(anEndAngle),
122 arcEndY = y + aRadius * SIN(anEndAngle),
123 arcStartX = x + aRadius * COS(aStartAngle),
124 arcStartY = y + aRadius * SIN(aStartAngle);
128 if (aPath.current.x !== x || aPath.current.y !== y)
133 var arcStartX = x + aRadius * COS(aStartAngle),
134 arcStartY = y + aRadius * SIN(aStartAngle);
136 aPath.start = CGPointMake(arcStartX, arcStartY);
139 aPath.current = CGPointMake(arcEndX, arcEndY);
140 aPath.elements[aPath.count++] = { type:
kCGPathElementAddArc, x:x, y:y, radius:aRadius, startAngle:aStartAngle, endAngle:anEndAngle, isClockwise:isClockwise };
145 var p1 = CGPointMake(x1, y1),
146 p2 = CGPointMake(x2, y2);
163 if (aPath.current.x !== p1.x || aPath.current.y !== p1.y)
175 var cp1 = CGPointMake(cp1x, cp1y),
176 cp2 = CGPointMake(cp2x, cp2y),
177 end = CGPointMake(x, y);
192 if (count === null || count === undefined)
193 count = points.length;
195 if (!aPath || count < 1)
200 for (var i = 1; i < count; ++i)
206 var point = CGPointMake(x, y);
208 if (aTransform !== NULL)
212 aPath.current = point;
217 for (var i = 0, count = anotherPath.count; i < count; ++i)
219 var element = anotherPath.elements[i];
221 switch (element.type)
229 element.cp1x, element.cp1y,
230 element.cp2x, element.cp2y,
231 element.x, element.y);
236 element.radius, element.startAngle,
237 element.endAngle, element.isClockwise);
242 element.p1x, element.p1y,
243 element.p2x, element.p2y,
249 element.cpx, element.cpy,
250 element.x, element.y);
266 var cp = CGPointMake(cpx, cpy),
267 end = CGPointMake(x, y);
289 var count = rects.length;
291 for (; i < count; ++i)
306 var point = CGPointMake(x, y);
308 if (aTransform !== NULL)
311 aPath.start = aPath.current = point;
316 var previous = aPath.elements[aPath.count - 1];
320 previous.x = point.x;
321 previous.y = point.y;
329 var
KAPPA = 4.0 * ((SQRT2 - 1.0) / 3.0);
335 if (CGRectGetWidth(aRect) === CGRectGetHeight(aRect))
336 CGPathAddArc(path, nil, CGRectGetMidX(aRect), CGRectGetMidY(aRect), CGRectGetWidth(aRect) / 2.0, 0.0, 2 * PI, YES);
339 var axis = CGSizeMake(CGRectGetWidth(aRect) / 2.0, CGRectGetHeight(aRect) / 2.0),
340 center = CGPointMake(CGRectGetMinX(aRect) + axis.width, CGRectGetMinY(aRect) + axis.height);
344 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);
345 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);
346 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);
347 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);
358 xMin = CGRectGetMinX(aRect),
359 xMax = CGRectGetMaxX(aRect),
360 yMin = CGRectGetMinY(aRect),
361 yMax = CGRectGetMaxY(aRect);
404 var count = aPath.count;
411 aPath.current = CGPointCreateCopy(aPath.start);
417 if (aPath === anotherPath)
420 if (aPath.count !== anotherPath.count || !CGPointEqualToPoint(aPath.start, anotherPath.start) || !CGPointEqualToPoint(aPath.current, anotherPath.current))
426 for (; i < count; ++i)
428 var element = aPath[i],
429 anotherElement = anotherPath[i];
431 if (element.type !== anotherElement.type)
434 switch (element.type)
437 if (element.x !== anotherElement.x ||
438 element.y !== anotherElement.y ||
439 element.radius !== anotherElement.radius ||
440 element.startAngle !== anotherElement.startAngle ||
441 element.endAngle !== anotherElement.endAngle ||
442 element.isClockwise !== anotherElement.isClockwise)
449 if (element.p1x !== anotherElement.p1x ||
450 element.p1y !== anotherElement.p1y ||
451 element.p2x !== anotherElement.p2x ||
452 element.p2y !== anotherElement.p2y ||
453 element.radius !== anotherElement.radius)
460 if (element.cp1x !== anotherElement.cp1x ||
461 element.cp1y !== anotherElement.cp1y ||
462 element.cp2x !== anotherElement.cp2x ||
463 element.cp2y !== anotherElement.cp2y ||
464 element.x !== anotherElement.x ||
465 element.y !== anotherElement.y)
473 if (element.x !== anotherElement.x ||
474 element.y !== anotherElement.y)
481 if (element.cpx !== anotherElement.cpx ||
482 element.cpy !== anotherElement.cpy ||
483 element.x !== anotherElement.x ||
484 element.y !== anotherElement.y)
491 if (!CGPointEqualToPoint(element.start, anotherElement.start))
502 return CGPointCreateCopy(aPath.current);
507 return !aPath || aPath.count === 0;
515 if (!aPath || !aPath.count)
516 return CGRectMakeZero();
524 function addPoint(x, y)
532 for (var i = 0, count = aPath.count; i < count; ++i)
534 var element = aPath.elements[i];
538 switch (element.type)
543 addPoint(movePoint.x, movePoint.y);
547 addPoint(element.x, element.y);
553 addPoint(movePoint.x, movePoint.y);
557 addPoint(element.cp1x, element.cp1y);
558 addPoint(element.cp2x, element.cp2y);
559 addPoint(element.x, element.y);
565 addPoint(movePoint.x, movePoint.y);
569 addPoint(element.x, element.y);
575 addPoint(movePoint.x, movePoint.y);
579 addPoint(element.p1x, element.p1y);
580 addPoint(element.p2x, element.p2y);
586 addPoint(movePoint.x, movePoint.y);
590 addPoint(element.cpx, element.cpy);
591 addPoint(element.x, element.y);
595 movePoint = CGPointMake(element.x, element.y);
601 addPoint(movePoint.x, movePoint.y);
609 return CGRectMake(ox, oy, rx - ox, ry - oy);
626 return context.isPointInPath(point.x, point.y);