ARTRadialGradient.m 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import <React/ARTRadialGradient.h>
  8. #import <React/RCTLog.h>
  9. #import "RCTConvert+ART.h"
  10. @implementation ARTRadialGradient
  11. {
  12. CGGradientRef _gradient;
  13. CGPoint _focusPoint;
  14. CGPoint _centerPoint;
  15. CGFloat _radius;
  16. CGFloat _radiusRatio;
  17. }
  18. - (instancetype)initWithArray:(NSArray<NSNumber *> *)array
  19. {
  20. if ((self = [super initWithArray:array])) {
  21. if (array.count < 7) {
  22. RCTLogError(@"-[%@ %@] expects 7 elements, received %@",
  23. self.class, NSStringFromSelector(_cmd), array);
  24. return nil;
  25. }
  26. _radius = [RCTConvert CGFloat:array[3]];
  27. _radiusRatio = [RCTConvert CGFloat:array[4]] / _radius;
  28. _focusPoint.x = [RCTConvert CGFloat:array[1]];
  29. _focusPoint.y = [RCTConvert CGFloat:array[2]] / _radiusRatio;
  30. _centerPoint.x = [RCTConvert CGFloat:array[5]];
  31. _centerPoint.y = [RCTConvert CGFloat:array[6]] / _radiusRatio;
  32. _gradient = CGGradientRetain([RCTConvert CGGradient:array offset:7]);
  33. }
  34. return self;
  35. }
  36. - (void)dealloc
  37. {
  38. CGGradientRelease(_gradient);
  39. }
  40. - (void)paint:(CGContextRef)context
  41. {
  42. CGAffineTransform transform = CGAffineTransformMakeScale(1, _radiusRatio);
  43. CGContextConcatCTM(context, transform);
  44. CGGradientDrawingOptions extendOptions = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation;
  45. CGContextDrawRadialGradient(context, _gradient, _focusPoint, 0, _centerPoint, _radius, extendOptions);
  46. }
  47. @end