/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import "RCTInterpolationAnimatedNode.h" #import "RCTAnimationUtils.h" @implementation RCTInterpolationAnimatedNode { __weak RCTValueAnimatedNode *_parentNode; NSArray *_inputRange; NSArray *_outputRange; NSString *_extrapolateLeft; NSString *_extrapolateRight; } - (instancetype)initWithTag:(NSNumber *)tag config:(NSDictionary *)config { if ((self = [super initWithTag:tag config:config])) { _inputRange = [config[@"inputRange"] copy]; NSMutableArray *outputRange = [NSMutableArray array]; for (id value in config[@"outputRange"]) { if ([value isKindOfClass:[NSNumber class]]) { [outputRange addObject:value]; } } _outputRange = [outputRange copy]; _extrapolateLeft = config[@"extrapolateLeft"]; _extrapolateRight = config[@"extrapolateRight"]; } return self; } - (void)onAttachedToNode:(RCTAnimatedNode *)parent { [super onAttachedToNode:parent]; if ([parent isKindOfClass:[RCTValueAnimatedNode class]]) { _parentNode = (RCTValueAnimatedNode *)parent; } } - (void)onDetachedFromNode:(RCTAnimatedNode *)parent { [super onDetachedFromNode:parent]; if (_parentNode == parent) { _parentNode = nil; } } - (void)performUpdate { [super performUpdate]; if (!_parentNode) { return; } CGFloat inputValue = _parentNode.value; self.value = RCTInterpolateValueInRange(inputValue, _inputRange, _outputRange, _extrapolateLeft, _extrapolateRight); } @end