123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- //
- // LOTBezierData.m
- // Lottie
- //
- // Created by brandon_withrow on 7/10/17.
- // Copyright © 2017 Airbnb. All rights reserved.
- //
- #import "LOTBezierData.h"
- #import "CGGeometry+LOTAdditions.h"
- @implementation LOTBezierData {
- CGPoint *_vertices;
- CGPoint *_inTangents;
- CGPoint *_outTangents;
- }
- - (instancetype)initWithData:(NSDictionary *)bezierData
- {
- self = [super init];
- if (self) {
- [self initializeData:bezierData];
- }
- return self;
- }
- - (void)dealloc {
- free(_vertices);
- free(_inTangents);
- free(_outTangents);
- }
- - (CGPoint)vertexAtIndex:(NSInteger)index {
- NSAssert((index < _count &&
- index >= 0),
- @"Lottie: Index out of bounds");
- return _vertices[index];
- }
- - (CGPoint)inTangentAtIndex:(NSInteger)index {
- NSAssert((index < _count &&
- index >= 0),
- @"Lottie: Index out of bounds");
- return _inTangents[index];
- }
- - (CGPoint)outTangentAtIndex:(NSInteger)index {
- NSAssert((index < _count &&
- index >= 0),
- @"Lottie: Index out of bounds");
- return _outTangents[index];
- }
- - (void)initializeData:(NSDictionary *)bezierData {
- NSArray *pointsArray = bezierData[@"v"];
- NSArray *inTangents = bezierData[@"i"];
- NSArray *outTangents = bezierData[@"o"];
-
- if (pointsArray.count == 0) {
- NSLog(@"%s: Warning: shape has no vertices", __PRETTY_FUNCTION__);
- return ;
- }
-
- NSAssert((pointsArray.count == inTangents.count &&
- pointsArray.count == outTangents.count),
- @"Lottie: Incorrect number of points and tangents");
- _count = pointsArray.count;
- _vertices = (CGPoint *)malloc(sizeof(CGPoint) * pointsArray.count);
- _inTangents = (CGPoint *)malloc(sizeof(CGPoint) * pointsArray.count);
- _outTangents = (CGPoint *)malloc(sizeof(CGPoint) * pointsArray.count);
- if (bezierData[@"c"]) {
- _closed = [bezierData[@"c"] boolValue];
- }
- for (int i = 0; i < pointsArray.count; i ++) {
- CGPoint vertex = [self _vertexAtIndex:i inArray:pointsArray];
- CGPoint outTan = LOT_PointAddedToPoint(vertex, [self _vertexAtIndex:i inArray:outTangents]);
- CGPoint inTan = LOT_PointAddedToPoint(vertex, [self _vertexAtIndex:i inArray:inTangents]);
- // BW BUG Straight Lines - Test Later
- // Bake fix for lines here
- _vertices[i] = vertex;
- _inTangents[i] = inTan;
- _outTangents[i] = outTan;
- }
- }
- - (CGPoint)_vertexAtIndex:(NSInteger)idx inArray:(NSArray *)points {
- NSAssert((idx < points.count),
- @"Lottie: Vertex Point out of bounds");
-
- NSArray *pointArray = points[idx];
-
- NSAssert((pointArray.count >= 2 &&
- [pointArray.firstObject isKindOfClass:[NSNumber class]]),
- @"Lottie: Point Data Malformed");
-
- return CGPointMake([(NSNumber *)pointArray[0] floatValue], [(NSNumber *)pointArray[1] floatValue]);
- }
- @end
|