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
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
|