5 // Created by 柳 on 09/09/15.
6 // Copyright 2009 __MyCompanyName__. All rights reserved.
12 @implementation ElisEffect
14 // Elisでは、種類がエフェクトを隠蔽する!
15 - (id)initWithName:(NSString*)aname
18 filter = [[CIFilter filterWithName:aname] retain];
20 params = [[NSMutableDictionary alloc] init];
21 attrs = [filter attributes];
23 colors = [[NSMutableArray alloc] init];
24 vecs = [[NSMutableArray alloc] init];
25 affine = [[NSMutableArray alloc] init]; // アフィン変換なエフェクトなんて一つしか使わないのに、これってどうなの。
26 NSDictionary* inputKeys = [filter inputKeys];
28 for(key in inputKeys){
29 if([key isEqualToString:@"inputImage"]){
33 input = [attrs valueForKey:key];
34 if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"CIColor"]){
35 [self setEffectTrueValueForTime:
36 [NSString stringWithFormat:@"%@ %@", key, @"red"] value:1.0 time:QTZeroTime];
37 [self setEffectTrueValueForTime:
38 [NSString stringWithFormat:@"%@ %@", key, @"green"] value:1.0 time:QTZeroTime];
39 [self setEffectTrueValueForTime:
40 [NSString stringWithFormat:@"%@ %@", key, @"blue"] value:1.0 time:QTZeroTime];
41 [colors addObject:key];
42 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"red"]];
43 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"green"]];
44 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"blue"]];
46 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"CIVector"]){
47 [self setEffectTrueValueForTime:
48 [NSString stringWithFormat:@"%@ %@", key, @"X"] value:[[input valueForKey:kCIAttributeDefault] X] time:QTZeroTime];
49 [self setEffectTrueValueForTime:
50 [NSString stringWithFormat:@"%@ %@", key, @"Y"] value:[[input valueForKey:kCIAttributeDefault] Y] time:QTZeroTime];
52 [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"X"]];
53 [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"Y"]];
55 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"NSAffineTransform"]){
56 // [self setEffectTrueValueForTime:
57 // [NSString stringWithFormat:@"%@ %@", key, @"Position X"] value:0.0 time:QTZeroTime];
58 [self setEffectTrueValueForTime:
59 [NSString stringWithFormat:@"%@ %@", key, @"Scale"] value:1.0 time:QTZeroTime];
60 [self setEffectTrueValueForTime:
61 [NSString stringWithFormat:@"%@ %@", key, @"Angle"] value:0.0 time:QTZeroTime];
62 [affine addObject:key];
63 // [affine addObject:[NSString stringWithFormat:@"%@ %@", key, @"Position X"]];
64 [affine addObject:[NSString stringWithFormat:@"%@ %@", key, @"Scale"]];
65 [affine addObject:[NSString stringWithFormat:@"%@ %@", key, @"Angle"]];
67 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"NSNumber"]){
68 [self setEffectTrueValueForTime:key value:[[input valueForKey:kCIAttributeDefault] floatValue] time:QTZeroTime];
72 name = [attrs valueForKey:kCIAttributeFilterDisplayName];
73 // [inputKeys release];
78 - (void)setEffectValue:(NSString*)key value:(id)v
80 [filter setValue:v forKey:key];
84 - (void)setEffectValueForTime:(NSString *)key value:(float)v time:(QTTime)time
88 if([colors indexOfObject:key] != NSNotFound){
91 }else if([vecs indexOfObject:key] != NSNotFound){
92 max = ProjectMovieSize.size.width*2;
93 min = -ProjectMovieSize.size.width*2;
94 }else if([affine indexOfObject:key] != NSNotFound){
95 if([key isEqualToString:@"inputTransform Angle"]){
103 max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
104 min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
108 v = (max - min)*v + min;
110 if([params valueForKey:key]){
111 k = [params valueForKey:key];
112 [k setValueForTime:v time:time];
115 k = [[ElisKeyframe alloc] init];
116 [k setValueForTime:v time:time];
117 [params setValue:k forKey:key];
122 - (void)setEffectTrueValueForTime:(NSString *)key value:(float)v time:(QTTime)time
126 if([params valueForKey:key]){
127 k = [params valueForKey:key];
128 [k setValueForTime:v time:time];
131 k = [[ElisKeyframe alloc] init];
132 [k setValueForTime:v time:time];
133 [params setValue:k forKey:key];
138 - (float)getEffectValue:(NSString*)key forTime:(QTTime)time
141 if([colors indexOfObject:key] != NSNotFound){
144 }else if([vecs indexOfObject:key] != NSNotFound){
145 max = ProjectMovieSize.size.width*2;
146 min = -ProjectMovieSize.size.width*2;
147 }else if([affine indexOfObject:key] != NSNotFound){
148 if([key isEqualToString:@"inputTransform Angle"]){
156 max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
157 min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
160 if([params valueForKey:key])
161 return ([[params valueForKey:key] getValueForTime:time] - min)/(max - min);
166 - (float)getEffectTrueValue:(NSString*)key forTime:(QTTime)time
168 if([params valueForKey:key])
169 return [[params valueForKey:key] getValueForTime:time];
174 - (void)setInputImage:(CIImage*)cm
177 [filter setValue:cm forKey:@"inputImage"];
180 - (CIImage*)getImage:(QTTime)time
182 NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
186 int i, size = [colors count];
187 for(i = 0; i < size; i += 4){
188 key = [colors objectAtIndex:i];
189 col = [CIColor colorWithRed:[[params valueForKey:[colors objectAtIndex:i+1]] getValueForTime:time]/255.0
190 green:[[params valueForKey:[colors objectAtIndex:i+2]] getValueForTime:time]/255.0
191 blue:[[params valueForKey:[colors objectAtIndex:i+3]] getValueForTime:time]/255.0];
192 [filter setValue:col forKey:key];
195 for(i = 0; i < size; i += 3){
196 key = [vecs objectAtIndex:i];
197 vec = [CIVector vectorWithX:[[params valueForKey:[vecs objectAtIndex:i+1]] getValueForTime:time]
198 Y:[[params valueForKey:[vecs objectAtIndex:i+2]] getValueForTime:time]];
199 [filter setValue:vec forKey:key];
201 size = [affine count];
202 for(i = 0; i < size; i += 3){
203 key = [affine objectAtIndex:i];
204 NSAffineTransform* aft = [NSAffineTransform transform];
205 [aft scaleBy:[[params valueForKey:[affine objectAtIndex:i+1]] getValueForTime:time]];
206 [aft rotateByDegrees:[[params valueForKey:[affine objectAtIndex:i+2]] getValueForTime:time]*ANGLE_MAX*2];
207 [filter setValue:aft forKey:key];
211 if([colors indexOfObject:key] == NSNotFound && [vecs indexOfObject:key] == NSNotFound && [affine indexOfObject:key] == NSNotFound)
212 [filter setValue:[NSNumber numberWithFloat:[[params valueForKey:key] getValueForTime:time]] forKey:key];
215 return [filter valueForKey:@"outputImage"];
218 - (NSMutableDictionary*)getParamDictionary
228 - (void)removeKeyframe:(NSString*)key
230 float v = [[params valueForKey:key] getValueForTime:QTZeroTime];
231 ElisKeyframe* k = [[ElisKeyframe alloc] init];
232 [k setValueForTime:v time:QTZeroTime];
233 [params setValue:k forKey:key];