diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2010-05-25 21:05:40 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2010-05-25 21:05:40 +0000 |
commit | 69491c3dd52dffcb3fdbaffeffb63483fbd15088 (patch) | |
tree | 1e252f0d2df87be252f789540e639183d65bbfe5 /iPhone | |
parent | 6a112e24ac1ea05a7efe6af26e734445546ac7b8 (diff) |
[Author: dmaclach]
Makes the rounded rect calls fit the CG calling conventions.
R=thomasvl
Diffstat (limited to 'iPhone')
-rw-r--r-- | iPhone/GTMRoundedRectPath.h | 26 | ||||
-rw-r--r-- | iPhone/GTMRoundedRectPath.m | 93 |
2 files changed, 92 insertions, 27 deletions
diff --git a/iPhone/GTMRoundedRectPath.h b/iPhone/GTMRoundedRectPath.h index 1bc8a08..2b20fec 100644 --- a/iPhone/GTMRoundedRectPath.h +++ b/iPhone/GTMRoundedRectPath.h @@ -18,5 +18,31 @@ #import <CoreGraphics/CoreGraphics.h> +// Inscribe a round rectangle inside of rectangle |rect| with a corner radius +// of |radius| +// +// Args: +// rect: outer rectangle to inscribe into +// radius: radius of the corners. |radius| is clamped internally +// to be no larger than the smaller of half |rect|'s width or height +void GTMCGContextAddRoundRect(CGContextRef context, + CGRect rect, + CGFloat radius); + +// Adds a path which is a round rectangle inscribed inside of rectangle |rect| +// with a corner radius of |radius| +// +// Args: +// path: path to add the rounded rectangle to +// m: matrix modifying the round rect +// rect: outer rectangle to inscribe into +// radius: radius of the corners. |radius| is clamped internally +// to be no larger than the smaller of half |rect|'s width or height +void GTMCGPathAddRoundRect(CGMutablePathRef path, + const CGAffineTransform *m, + CGRect rect, + CGFloat radius); + // Allocates a new rounded corner rectangle path. +// DEPRECATED. Please use one of the above. CGPathRef GTMCreateRoundedRectPath(CGRect rect, CGFloat radius); diff --git a/iPhone/GTMRoundedRectPath.m b/iPhone/GTMRoundedRectPath.m index 194f53e..bb2c42c 100644 --- a/iPhone/GTMRoundedRectPath.m +++ b/iPhone/GTMRoundedRectPath.m @@ -17,34 +17,73 @@ // #include "GTMRoundedRectPath.h" -CGPathRef GTMCreateRoundedRectPath(CGRect rect, CGFloat radius) { - CGMutablePathRef path = CGPathCreateMutable(); - - CGPoint topLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect)); - CGPoint topRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect)); - CGPoint bottomRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect)); - CGPoint bottomLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect)); +void GTMCGContextAddRoundRect(CGContextRef context, + CGRect rect, + CGFloat radius) { + if (!CGRectIsEmpty(rect)) { + if (radius > 0.0) { + // Clamp radius to be no larger than half the rect's width or height. + radius = MIN(radius, 0.5 * MIN(rect.size.width, rect.size.height)); + + CGPoint topLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect)); + CGPoint topRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect)); + CGPoint bottomRight = CGPointMake(CGRectGetMaxX(rect), + CGRectGetMinY(rect)); + + CGContextMoveToPoint(context, CGRectGetMidX(rect), CGRectGetMaxY(rect)); + CGContextAddArcToPoint(context, topLeft.x, topLeft.y, rect.origin.x, + rect.origin.y, radius); + CGContextAddArcToPoint(context, rect.origin.x, rect.origin.y, + bottomRight.x, bottomRight.y, radius); + CGContextAddArcToPoint(context, bottomRight.x, bottomRight.y, + topRight.x, topRight.y, radius); + CGContextAddArcToPoint(context, topRight.x, topRight.y, + topLeft.x, topLeft.y, radius); + CGContextAddLineToPoint(context, CGRectGetMidX(rect), CGRectGetMaxY(rect)); + } else { + CGContextAddRect(context, rect); + } + } +} - CGPathMoveToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMinY(rect)); - CGPathAddArcToPoint(path, NULL, - topLeft.x, topLeft.y, - bottomLeft.x, bottomLeft.y, - radius); - CGPathAddArcToPoint(path, NULL, - bottomLeft.x, bottomLeft.y, - bottomRight.x, bottomRight.y, - radius); - CGPathAddArcToPoint(path, NULL, - bottomRight.x, bottomRight.y, - topRight.x, topRight.y, - radius); - CGPathAddArcToPoint(path, NULL, - topRight.x, topRight.y, - topLeft.x, topLeft.y, - radius); - CGPathCloseSubpath(path); +void GTMCGPathAddRoundRect(CGMutablePathRef path, + const CGAffineTransform *m, + CGRect rect, + CGFloat radius) { + if (!CGRectIsEmpty(rect)) { + if (radius > 0.0) { + // Clamp radius to be no larger than half the rect's width or height. + radius = MIN(radius, 0.5 * MIN(rect.size.width, rect.size.height)); + + CGPoint topLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect)); + CGPoint topRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect)); + CGPoint bottomRight = CGPointMake(CGRectGetMaxX(rect), + CGRectGetMinY(rect)); + + CGPathMoveToPoint(path, m, CGRectGetMidX(rect), CGRectGetMaxY(rect)); + CGPathAddArcToPoint(path, m, topLeft.x, topLeft.y, + rect.origin.x, rect.origin.y, radius); + CGPathAddArcToPoint(path, m, rect.origin.x, rect.origin.y, + bottomRight.x, bottomRight.y, radius); + CGPathAddArcToPoint(path, m, bottomRight.x, bottomRight.y, + topRight.x, topRight.y, radius); + CGPathAddArcToPoint(path, m, topRight.x, topRight.y, + topLeft.x, topLeft.y, radius); + CGPathAddLineToPoint(path, m, CGRectGetMidX(rect), CGRectGetMaxY(rect)); + } else { + CGPathAddRect(path, m, rect); + } + } +} - CGPathRef immutablePath = CGPathCreateCopy(path); - CGPathRelease(path); +CGPathRef GTMCreateRoundedRectPath(CGRect rect, CGFloat radius) { + CGPathRef immutablePath = NULL; + CGMutablePathRef path = CGPathCreateMutable(); + if (path) { + GTMCGPathAddRoundRect(path, NULL, rect, radius); + CGPathCloseSubpath(path); + immutablePath = CGPathCreateCopy(path); + CGPathRelease(path); + } return immutablePath; } |