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];
236 - (void)encodeWithCoder:(NSCoder*)encoder
238 [encoder encodeObject:[attrs valueForKey:kCIAttributeFilterName] forKey:@"filterName"];
239 [encoder encodeObject:name forKey:@"name"];
240 [encoder encodeObject:attrs forKey:@"attrs"];
241 [encoder encodeObject:colors forKey:@"colors"];
242 [encoder encodeObject:vecs forKey:@"vecs"];
243 [encoder encodeObject:affine forKey:@"affine"];
244 [encoder encodeObject:params forKey:@"params"];
245 [encoder encodeBool:generator forKey:@"generator"];
248 - (id)initWithCoder:(NSCoder*)coder
250 name = [coder decodeObjectForKey:@"name"];
251 attrs = [coder decodeObjectForKey:@"attrs"];
252 colors = [coder decodeObjectForKey:@"colors"];
253 vecs = [coder decodeObjectForKey:@"vecs"];
254 affine = [coder decodeObjectForKey:@"affine"];
255 params = [coder decodeObjectForKey:@"params"];
256 generator = [coder decodeBoolForKey:@"generator"];
258 NSString* filterName = [coder decodeObjectForKey:@"filterName"];
259 filter = [[CIFilter filterWithName:filterName] retain];
260 [filter setDefaults];