Files
react-native-svg/apple/Utils/RNSVGBezierElement.m
2020-11-25 16:31:39 -08:00

78 lines
2.0 KiB
Objective-C

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