/ QuartzCore / CAMediaTimingFunction.m
CAMediaTimingFunction.m
 1  #import <Foundation/NSRaise.h>
 2  #import <Foundation/NSString.h>
 3  #import <QuartzCore/CAMediaTimingFunction.h>
 4  
 5  NSString *const kCAMediaTimingFunctionLinear = @"kCAMediaTimingFunctionLinear";
 6  NSString *const kCAMediaTimingFunctionEaseIn = @"kCAMediaTimingFunctionEaseIn";
 7  NSString *const kCAMediaTimingFunctionEaseOut =
 8          @"kCAMediaTimingFunctionEaseOut";
 9  NSString *const kCAMediaTimingFunctionEaseInEaseOut =
10          @"kCAMediaTimingFunctionEaseInEaseOut";
11  NSString *const kCAMediaTimingFunctionDefault =
12          @"kCAMediaTimingFunctionDefault";
13  
14  @implementation CAMediaTimingFunction
15  
16  - initWithControlPoints: (CGFloat)
17                      c1x: (CGFloat) c1y
18                         :(CGFloat) c2x
19                         :(CGFloat) c2y
20  {
21      _c1x = c1x;
22      _c1y = c1y;
23      _c2x = c2x;
24      _c2y = c2y;
25      return self;
26  }
27  
28  + functionWithControlPoints: (CGFloat)
29                          c1x: (CGFloat) c1y
30                             :(CGFloat) c2x
31                             :(CGFloat) c2y
32  {
33      return [[[self alloc] initWithControlPoints: c1x: c1y:c2x:c2y] autorelease];
34  }
35  
36  + functionWithName: (NSString *) name {
37      if ([name isEqualToString: kCAMediaTimingFunctionLinear])
38          return [self functionWithControlPoints: 0: 0:1:1];
39      if ([name isEqualToString: kCAMediaTimingFunctionEaseIn])
40          return [self functionWithControlPoints: 0.5: 0:1:1];
41      if ([name isEqualToString: kCAMediaTimingFunctionEaseOut])
42          return [self functionWithControlPoints: 0: 0:0.5:1];
43      if ([name isEqualToString: kCAMediaTimingFunctionEaseInEaseOut])
44          return [self functionWithControlPoints: 0.5: 0:0.5:1];
45      if ([name isEqualToString: kCAMediaTimingFunctionDefault])
46          return [self functionWithControlPoints: 0.25: 0.1:0.25:1];
47  
48      return nil;
49  }
50  
51  - (void) getControlPointAtIndex: (size_t) index values: (CGFloat[2]) ptr {
52  
53      switch (index) {
54  
55      default:
56      case 0:
57          ptr[0] = 0;
58          ptr[1] = 0;
59          break;
60  
61      case 1:
62          ptr[0] = _c1x;
63          ptr[1] = _c1y;
64          break;
65  
66      case 2:
67          ptr[0] = _c2x;
68          ptr[1] = _c2y;
69          break;
70  
71      case 3:
72          ptr[0] = 1;
73          ptr[1] = 1;
74          break;
75      }
76  }
77  
78  @end