You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.8 KiB

/*
Erica Sadun, http://ericasadun.com
https://github.com/erica/iOS-Drawing/tree/master/C08/Quartz%20Book%20Pack/Bezier
*/
#import "RNSVGBezierElement.h"
#pragma mark - Bezier Element -
@implementation RNSVGBezierElement
- (instancetype)init
{
self = [super init];
if (self) {
_elementType = kCGPathElementMoveToPoint;
_point = RNSVGNULLPOINT;
_controlPoint1 = RNSVGNULLPOINT;
_controlPoint2 = RNSVGNULLPOINT;
}
return self;
}
+ (instancetype)elementWithPathElement:(CGPathElement)element
{
RNSVGBezierElement *newElement = [[self alloc] init];
newElement.elementType = element.type;
switch (newElement.elementType) {
case kCGPathElementCloseSubpath:
break;
case kCGPathElementMoveToPoint:
case kCGPathElementAddLineToPoint: {
newElement.point = element.points[0];
break;
}
case kCGPathElementAddQuadCurveToPoint: {
newElement.point = element.points[1];
newElement.controlPoint1 = element.points[0];
break;
}
case kCGPathElementAddCurveToPoint: {
newElement.point = element.points[2];
newElement.controlPoint1 = element.points[0];
newElement.controlPoint2 = element.points[1];
break;
}
default:
break;
}
return newElement;
}
// Convert one element to RNSVGBezierElement and save to array
void RNSVGBezierElement_getBezierElements(void *info, const CGPathElement *element)
{
NSMutableArray *bezierElements = (__bridge NSMutableArray *)info;
if (element)
[bezierElements addObject:[RNSVGBezierElement elementWithPathElement:*element]];
}
// Retrieve array of component elements
+ (NSArray *)elementsFromCGPath:(CGPathRef)path
{
NSMutableArray *elements = [NSMutableArray array];
CGPathApply(path, (__bridge void *)elements, RNSVGBezierElement_getBezierElements);
return elements;
}
@end