SVGAVideoSpriteFrameEntity.m 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // SVGAVideoSpriteFrameEntity.m
  3. // SVGAPlayer
  4. //
  5. // Created by 崔明辉 on 2017/2/20.
  6. // Copyright © 2017年 UED Center. All rights reserved.
  7. //
  8. #import "SVGAVideoSpriteFrameEntity.h"
  9. #import "SVGAVectorLayer.h"
  10. #import "SVGABezierPath.h"
  11. #import "Svga.pbobjc.h"
  12. @interface SVGAVideoSpriteFrameEntity ()
  13. @property (nonatomic, strong) SVGAVideoSpriteFrameEntity *previousFrame;
  14. @property (nonatomic, assign) CGFloat alpha;
  15. @property (nonatomic, assign) CGAffineTransform transform;
  16. @property (nonatomic, assign) CGRect layout;
  17. @property (nonatomic, assign) CGFloat nx;
  18. @property (nonatomic, assign) CGFloat ny;
  19. @property (nonatomic, strong) NSString *clipPath;
  20. @property (nonatomic, strong) CALayer *maskLayer;
  21. @property (nonatomic, strong) NSArray *shapes;
  22. @end
  23. @implementation SVGAVideoSpriteFrameEntity
  24. - (instancetype)initWithJSONObject:(NSDictionary *)JSONObject {
  25. self = [super init];
  26. if (self) {
  27. _alpha = 0.0;
  28. _layout = CGRectZero;
  29. _transform = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
  30. if ([JSONObject isKindOfClass:[NSDictionary class]]) {
  31. NSNumber *alpha = JSONObject[@"alpha"];
  32. if ([alpha isKindOfClass:[NSNumber class]]) {
  33. _alpha = [alpha floatValue];
  34. }
  35. NSDictionary *layout = JSONObject[@"layout"];
  36. if ([layout isKindOfClass:[NSDictionary class]]) {
  37. NSNumber *x = layout[@"x"];
  38. NSNumber *y = layout[@"y"];
  39. NSNumber *width = layout[@"width"];
  40. NSNumber *height = layout[@"height"];
  41. if ([x isKindOfClass:[NSNumber class]] && [y isKindOfClass:[NSNumber class]] && [width isKindOfClass:[NSNumber class]] && [height isKindOfClass:[NSNumber class]]) {
  42. _layout = CGRectMake(x.floatValue, y.floatValue, width.floatValue, height.floatValue);
  43. }
  44. }
  45. NSDictionary *transform = JSONObject[@"transform"];
  46. if ([transform isKindOfClass:[NSDictionary class]]) {
  47. NSNumber *a = transform[@"a"];
  48. NSNumber *b = transform[@"b"];
  49. NSNumber *c = transform[@"c"];
  50. NSNumber *d = transform[@"d"];
  51. NSNumber *tx = transform[@"tx"];
  52. NSNumber *ty = transform[@"ty"];
  53. 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]]) {
  54. _transform = CGAffineTransformMake(a.floatValue, b.floatValue, c.floatValue, d.floatValue, tx.floatValue, ty.floatValue);
  55. }
  56. }
  57. NSString *clipPath = JSONObject[@"clipPath"];
  58. if ([clipPath isKindOfClass:[NSString class]]) {
  59. self.clipPath = clipPath;
  60. }
  61. NSArray *shapes = JSONObject[@"shapes"];
  62. if ([shapes isKindOfClass:[NSArray class]]) {
  63. _shapes = shapes;
  64. }
  65. }
  66. CGFloat llx = _transform.a * _layout.origin.x + _transform.c * _layout.origin.y + _transform.tx;
  67. CGFloat lrx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * _layout.origin.y + _transform.tx;
  68. CGFloat lbx = _transform.a * _layout.origin.x + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
  69. CGFloat rbx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
  70. CGFloat lly = _transform.b * _layout.origin.x + _transform.d * _layout.origin.y + _transform.ty;
  71. CGFloat lry = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * _layout.origin.y + _transform.ty;
  72. CGFloat lby = _transform.b * _layout.origin.x + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
  73. CGFloat rby = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
  74. _nx = MIN(MIN(lbx, rbx), MIN(llx, lrx));
  75. _ny = MIN(MIN(lby, rby), MIN(lly, lry));
  76. }
  77. return self;
  78. }
  79. - (instancetype)initWithProtoObject:(SVGAProtoFrameEntity *)protoObject {
  80. self = [super init];
  81. if (self) {
  82. _alpha = 0.0;
  83. _layout = CGRectZero;
  84. _transform = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
  85. if ([protoObject isKindOfClass:[SVGAProtoFrameEntity class]]) {
  86. _alpha = protoObject.alpha;
  87. if (protoObject.hasLayout) {
  88. _layout = CGRectMake((CGFloat)protoObject.layout.x,
  89. (CGFloat)protoObject.layout.y,
  90. (CGFloat)protoObject.layout.width,
  91. (CGFloat)protoObject.layout.height);
  92. }
  93. if (protoObject.hasTransform) {
  94. _transform = CGAffineTransformMake((CGFloat)protoObject.transform.a,
  95. (CGFloat)protoObject.transform.b,
  96. (CGFloat)protoObject.transform.c,
  97. (CGFloat)protoObject.transform.d,
  98. (CGFloat)protoObject.transform.tx,
  99. (CGFloat)protoObject.transform.ty);
  100. }
  101. if ([protoObject.clipPath isKindOfClass:[NSString class]] && protoObject.clipPath.length > 0) {
  102. self.clipPath = protoObject.clipPath;
  103. }
  104. if ([protoObject.shapesArray isKindOfClass:[NSArray class]]) {
  105. _shapes = [protoObject.shapesArray copy];
  106. }
  107. }
  108. CGFloat llx = _transform.a * _layout.origin.x + _transform.c * _layout.origin.y + _transform.tx;
  109. CGFloat lrx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * _layout.origin.y + _transform.tx;
  110. CGFloat lbx = _transform.a * _layout.origin.x + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
  111. CGFloat rbx = _transform.a * (_layout.origin.x + _layout.size.width) + _transform.c * (_layout.origin.y + _layout.size.height) + _transform.tx;
  112. CGFloat lly = _transform.b * _layout.origin.x + _transform.d * _layout.origin.y + _transform.ty;
  113. CGFloat lry = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * _layout.origin.y + _transform.ty;
  114. CGFloat lby = _transform.b * _layout.origin.x + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
  115. CGFloat rby = _transform.b * (_layout.origin.x + _layout.size.width) + _transform.d * (_layout.origin.y + _layout.size.height) + _transform.ty;
  116. _nx = MIN(MIN(lbx, rbx), MIN(llx, lrx));
  117. _ny = MIN(MIN(lby, rby), MIN(lly, lry));
  118. }
  119. return self;
  120. }
  121. - (CALayer *)maskLayer {
  122. if (_maskLayer == nil && self.clipPath != nil) {
  123. SVGABezierPath *bezierPath = [[SVGABezierPath alloc] init];
  124. [bezierPath setValues:self.clipPath];
  125. _maskLayer = [bezierPath createLayer];
  126. }
  127. return _maskLayer;
  128. }
  129. @end