123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- //
- // SVGAVideoSpriteFrameEntity.m
- // SVGAPlayer
- //
- // Created by 崔明辉 on 2017/2/20.
- // Copyright © 2017年 UED Center. All rights reserved.
- //
- #import "SVGAVideoSpriteFrameEntity.h"
- #import "SVGAVectorLayer.h"
- #import "SVGABezierPath.h"
- #import "Svga.pbobjc.h"
- @interface SVGAVideoSpriteFrameEntity ()
- @property (nonatomic, strong) SVGAVideoSpriteFrameEntity *previousFrame;
- @property (nonatomic, assign) CGFloat alpha;
- @property (nonatomic, assign) CGAffineTransform transform;
- @property (nonatomic, assign) CGRect layout;
- @property (nonatomic, assign) CGFloat nx;
- @property (nonatomic, assign) CGFloat ny;
- @property (nonatomic, strong) NSString *clipPath;
- @property (nonatomic, strong) CALayer *maskLayer;
- @property (nonatomic, strong) NSArray *shapes;
- @end
- @implementation SVGAVideoSpriteFrameEntity
- - (instancetype)initWithJSONObject:(NSDictionary *)JSONObject {
- self = [super init];
- if (self) {
- _alpha = 0.0;
- _layout = CGRectZero;
- _transform = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
- if ([JSONObject isKindOfClass:[NSDictionary class]]) {
- NSNumber *alpha = JSONObject[@"alpha"];
- if ([alpha isKindOfClass:[NSNumber class]]) {
- _alpha = [alpha floatValue];
- }
- NSDictionary *layout = JSONObject[@"layout"];
- if ([layout isKindOfClass:[NSDictionary class]]) {
- NSNumber *x = layout[@"x"];
- NSNumber *y = layout[@"y"];
- NSNumber *width = layout[@"width"];
- NSNumber *height = layout[@"height"];
- if ([x isKindOfClass:[NSNumber class]] && [y isKindOfClass:[NSNumber class]] && [width isKindOfClass:[NSNumber class]] && [height isKindOfClass:[NSNumber class]]) {
- _layout = CGRectMake(x.floatValue, y.floatValue, width.floatValue, height.floatValue);
- }
- }
- NSDictionary *transform = JSONObject[@"transform"];
- if ([transform isKindOfClass:[NSDictionary class]]) {
- NSNumber *a = transform[@"a"];
- NSNumber *b = transform[@"b"];
- NSNumber *c = transform[@"c"];
- NSNumber *d = transform[@"d"];
- NSNumber *tx = transform[@"tx"];
- NSNumber *ty = transform[@"ty"];
- if ([a isKindOfClass:[NSNumber class]] && [b isKindOfClass:[NSNumber class]] && [c isKindOfClass:[NSNumber class]] && [d isKindOfClass:[NSNumber class]] && [tx isKindOfClass:[NSNumber class]] && [ty isKindOfClass:[NSNumber class]]) {
- _transform = CGAffineTransformMake(a.floatValue, b.floatValue, c.floatValue, d.floatValue, tx.floatValue, ty.floatValue);
- }
- }
- NSString *clipPath = JSONObject[@"clipPath"];
- if ([clipPath isKindOfClass:[NSString class]]) {
- self.clipPath = clipPath;
- }
- NSArray *shapes = JSONObject[@"shapes"];
- if ([shapes isKindOfClass:[NSArray class]]) {
- _shapes = shapes;
- }
- }
- CGFloat llx = _transform.a * _layout.origin.x + _transform.c * _layout.origin.y + _transform.tx;
- CGFloat lrx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * _layout.origin.y + _transform.tx;
- CGFloat lbx = _transform.a * _layout.origin.x + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
- CGFloat rbx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
- CGFloat lly = _transform.b * _layout.origin.x + _transform.d * _layout.origin.y + _transform.ty;
- CGFloat lry = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * _layout.origin.y + _transform.ty;
- CGFloat lby = _transform.b * _layout.origin.x + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
- CGFloat rby = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
- _nx = MIN(MIN(lbx, rbx), MIN(llx, lrx));
- _ny = MIN(MIN(lby, rby), MIN(lly, lry));
- }
- return self;
- }
- - (instancetype)initWithProtoObject:(SVGAProtoFrameEntity *)protoObject {
- self = [super init];
- if (self) {
- _alpha = 0.0;
- _layout = CGRectZero;
- _transform = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
- if ([protoObject isKindOfClass:[SVGAProtoFrameEntity class]]) {
- _alpha = protoObject.alpha;
- if (protoObject.hasLayout) {
- _layout = CGRectMake((CGFloat)protoObject.layout.x,
- (CGFloat)protoObject.layout.y,
- (CGFloat)protoObject.layout.width,
- (CGFloat)protoObject.layout.height);
- }
- if (protoObject.hasTransform) {
- _transform = CGAffineTransformMake((CGFloat)protoObject.transform.a,
- (CGFloat)protoObject.transform.b,
- (CGFloat)protoObject.transform.c,
- (CGFloat)protoObject.transform.d,
- (CGFloat)protoObject.transform.tx,
- (CGFloat)protoObject.transform.ty);
- }
- if ([protoObject.clipPath isKindOfClass:[NSString class]] && protoObject.clipPath.length > 0) {
- self.clipPath = protoObject.clipPath;
- }
- if ([protoObject.shapesArray isKindOfClass:[NSArray class]]) {
- _shapes = [protoObject.shapesArray copy];
- }
- }
- CGFloat llx = _transform.a * _layout.origin.x + _transform.c * _layout.origin.y + _transform.tx;
- CGFloat lrx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * _layout.origin.y + _transform.tx;
- CGFloat lbx = _transform.a * _layout.origin.x + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
- CGFloat rbx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
- CGFloat lly = _transform.b * _layout.origin.x + _transform.d * _layout.origin.y + _transform.ty;
- CGFloat lry = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * _layout.origin.y + _transform.ty;
- CGFloat lby = _transform.b * _layout.origin.x + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
- CGFloat rby = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
- _nx = MIN(MIN(lbx, rbx), MIN(llx, lrx));
- _ny = MIN(MIN(lby, rby), MIN(lly, lry));
- }
- return self;
- }
- - (CALayer *)maskLayer {
- if (_maskLayer == nil && self.clipPath != nil) {
- SVGABezierPath *bezierPath = [[SVGABezierPath alloc] init];
- [bezierPath setValues:self.clipPath];
- _maskLayer = [bezierPath createLayer];
- }
- return _maskLayer;
- }
- @end
|