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);
function CGPathWithRoundedRectangleInRect(aRect, xRadius, yRadius, ne, se, sw, nw)
CGPath kCGPathElementMoveToPoint
function CGPathGetBoundingBox(aPath)
function CGPathCloseSubpath(aPath)
function CGPathEqualToPath(aPath, anotherPath)
function CGPathAddRects(aPath, aTransform, rects, count)
function CGPathCreateCopy(aPath)
kCGPathElementAddLineToPoint
function CGContextClosePath(aContext)
function CGPathMoveToPoint(aPath, aTransform, x, y)
kCGPathElementAddArcToPoint
function CGPathAddLines(aPath, aTransform, points, count)
function CGPathAddCurveToPoint(aPath, aTransform, cp1x, cp1y, cp2x, cp2y, x, y)
function CGContextAddPath(aContext, aPath)
function CGPathWithEllipseInRect(aRect)
function CGPathIsEmpty(aPath)
function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, isClockwise)
kCGPathElementCloseSubpath
function CGContextBeginPath(aContext)
function CGPathCreateMutable()
function CGPathAddRect(aPath, aTransform, aRect)
function CGPathCreateMutableCopy(aPath)
function CGPathGetCurrentPoint(aPath)
function CGPathRetain(aPath)
function CGPathRelease(aPath)
kCGPathElementAddCurveToPoint
function CGPathAddLineToPoint(aPath, aTransform, x, y)
kCGPathElementAddQuadCurveToPoint
function CGPathContainsPoint(aPath, aTransform, point, eoFill)
function CGBitmapGraphicsContextCreate()
function CGPathAddPath(aPath, aTransform, anotherPath)
function CGPathAddArcToPoint(aPath, aTransform, x1, y1, x2, y2, aRadius)
function CGPathAddQuadCurveToPoint(aPath, aTransform, cpx, cpy, x, y)