mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-18 11:30:04 +00:00
101 lines
2.7 KiB
Objective-C
101 lines
2.7 KiB
Objective-C
//
|
|
// 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
|