1 // Copyright (c) 2009 Yanagi Asakura
3 // This software is provided 'as-is', without any express or implied
4 // warranty. In no event will the authors be held liable for any damages
5 // arising from the use of this software.
7 // Permission is granted to anyone to use this software for any purpose,
8 // including commercial applications, and to alter it and redistribute it
9 // freely, subject to the following restrictions:
11 // 1. The origin of this software must not be misrepresented; you must not
12 // claim that you wrote the original software. If you use this software
13 // in a product, an acknowledgment in the product documentation would be
14 // appreciated but is not required.
16 // 2. Altered source versions must be plainly marked as such, and must not be
17 // misrepresented as being the original software.
19 // 3. This notice may not be removed or altered from any source
26 // Created by 柳 on 09/09/15.
27 // Copyright 2009 __MyCompanyName__. All rights reserved.
30 #import "ElisEffect.h"
33 @implementation ElisEffect
35 // Elisでは、種類がエフェクトを隠蔽する!
36 - (id)initWithName:(NSString*)aname
39 filter = [[CIFilter filterWithName:aname] retain];
41 params = [[NSMutableDictionary alloc] init];
42 attrs = [filter attributes];
44 colors = [[NSMutableArray alloc] init];
45 vecs = [[NSMutableArray alloc] init];
46 affine = [[NSMutableArray alloc] init]; // アフィン変換なエフェクトなんて一つしか使わないのに、これってどうなの。
47 NSDictionary* inputKeys = [filter inputKeys];
49 for(key in inputKeys){
50 if([key isEqualToString:@"inputImage"]){
54 input = [attrs valueForKey:key];
55 if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"CIColor"]){
56 [colors addObject:key];
57 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"red"]];
58 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"green"]];
59 [colors addObject:[NSString stringWithFormat:@"%@ %@", key, @"blue"]];
60 [self setEffectTrueValueForTime:
61 [NSString stringWithFormat:@"%@ %@", key, @"red"] value:1.0 time:QTZeroTime];
62 [self setEffectTrueValueForTime:
63 [NSString stringWithFormat:@"%@ %@", key, @"green"] value:1.0 time:QTZeroTime];
64 [self setEffectTrueValueForTime:
65 [NSString stringWithFormat:@"%@ %@", key, @"blue"] value:1.0 time:QTZeroTime];
67 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"CIVector"]){
69 [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"X"]];
70 [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"Y"]];
71 [self setEffectTrueValueForTime:
72 [NSString stringWithFormat:@"%@ %@", key, @"X"] value:[[input valueForKey:kCIAttributeDefault] X] time:QTZeroTime];
73 [self setEffectTrueValueForTime:
74 [NSString stringWithFormat:@"%@ %@", key, @"Y"] value:[[input valueForKey:kCIAttributeDefault] Y] time:QTZeroTime];
76 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"NSAffineTransform"]){
77 [affine addObject:key];
78 [affine addObject:[NSString stringWithFormat:@"%@ %@", key, @"Scale"]];
79 [affine addObject:[NSString stringWithFormat:@"%@ %@", key, @"Angle"]];
80 [self setEffectTrueValueForTime:
81 [NSString stringWithFormat:@"%@ %@", key, @"Scale"] value:1.0 time:QTZeroTime];
82 [self setEffectTrueValueForTime:
83 [NSString stringWithFormat:@"%@ %@", key, @"Angle"] value:0.0 time:QTZeroTime];
85 else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"NSNumber"]){
86 [self setEffectTrueValueForTime:key value:[[input valueForKey:kCIAttributeDefault] floatValue] time:QTZeroTime];
90 name = [attrs valueForKey:kCIAttributeFilterDisplayName];
91 // [inputKeys release];
96 - (void)setEffectValue:(NSString*)key value:(id)v
98 [filter setValue:v forKey:key];
102 - (void)setEffectValueForTime:(NSString *)key value:(float)v time:(QTTime)time
106 if([colors indexOfObject:key] != NSNotFound){
109 }else if([vecs indexOfObject:key] != NSNotFound){
110 max = ProjectMovieSize.size.width*2;
111 min = -ProjectMovieSize.size.width*2;
112 }else if([affine indexOfObject:key] != NSNotFound){
113 if([key isEqualToString:@"inputTransform Angle"]){
121 max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
122 min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
126 v = (max - min)*v + min;
128 if([params valueForKey:key]){
129 k = [params valueForKey:key];
130 [k setValueForTime:v time:time];
133 k = [[ElisKeyframe alloc] init];
134 [k setValueForTime:v time:time];
135 [params setValue:k forKey:key];
140 - (void)setEffectTrueValueForTime:(NSString *)key value:(float)v time:(QTTime)time
144 if([colors indexOfObject:key] != NSNotFound){
147 }else if([vecs indexOfObject:key] != NSNotFound){
148 max = ProjectMovieSize.size.width*2;
149 min = -ProjectMovieSize.size.width*2;
150 }else if([affine indexOfObject:key] != NSNotFound){
151 if([key isEqualToString:@"inputTransform Angle"]){
159 max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
160 min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
167 if([params valueForKey:key]){
168 k = [params valueForKey:key];
169 [k setValueForTime:v time:time];
172 k = [[ElisKeyframe alloc] init];
173 [k setValueForTime:v time:time];
174 [params setValue:k forKey:key];
179 - (float)getEffectValue:(NSString*)key forTime:(QTTime)time
182 if([colors indexOfObject:key] != NSNotFound){
185 }else if([vecs indexOfObject:key] != NSNotFound){
186 max = ProjectMovieSize.size.width*2;
187 min = -ProjectMovieSize.size.width*2;
188 }else if([affine indexOfObject:key] != NSNotFound){
189 if([key isEqualToString:@"inputTransform Angle"]){
197 max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
198 min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
201 if([params valueForKey:key])
202 return ([[params valueForKey:key] getValueForTime:time] - min)/(max - min);
207 - (float)getEffectTrueValue:(NSString*)key forTime:(QTTime)time
209 if([params valueForKey:key])
210 return [[params valueForKey:key] getValueForTime:time];
215 - (void)setInputImage:(CIImage*)cm
218 [filter setValue:cm forKey:@"inputImage"];
221 - (CIImage*)getImage:(QTTime)time
223 NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
227 int i, size = [colors count];
228 for(i = 0; i < size; i += 4){
229 key = [colors objectAtIndex:i];
230 col = [CIColor colorWithRed:[[params valueForKey:[colors objectAtIndex:i+1]] getValueForTime:time]/255.0
231 green:[[params valueForKey:[colors objectAtIndex:i+2]] getValueForTime:time]/255.0
232 blue:[[params valueForKey:[colors objectAtIndex:i+3]] getValueForTime:time]/255.0];
233 [filter setValue:col forKey:key];
236 for(i = 0; i < size; i += 3){
237 key = [vecs objectAtIndex:i];
238 vec = [CIVector vectorWithX:[[params valueForKey:[vecs objectAtIndex:i+1]] getValueForTime:time]
239 Y:[[params valueForKey:[vecs objectAtIndex:i+2]] getValueForTime:time]];
240 [filter setValue:vec forKey:key];
242 size = [affine count];
243 for(i = 0; i < size; i += 3){
244 key = [affine objectAtIndex:i];
245 NSAffineTransform* aft = [NSAffineTransform transform];
246 [aft scaleBy:[[params valueForKey:[affine objectAtIndex:i+1]] getValueForTime:time]];
247 [aft rotateByDegrees:[[params valueForKey:[affine objectAtIndex:i+2]] getValueForTime:time]*ANGLE_MAX*2];
248 [filter setValue:aft forKey:key];
252 if([colors indexOfObject:key] == NSNotFound && [vecs indexOfObject:key] == NSNotFound && [affine indexOfObject:key] == NSNotFound)
253 [filter setValue:[NSNumber numberWithFloat:[[params valueForKey:key] getValueForTime:time]] forKey:key];
256 return [filter valueForKey:@"outputImage"];
259 - (NSMutableDictionary*)getParamDictionary
269 - (void)removeKeyframe:(NSString*)key
271 float v = [[params valueForKey:key] getValueForTime:QTZeroTime];
272 ElisKeyframe* k = [[ElisKeyframe alloc] init];
273 [k setValueForTime:v time:QTZeroTime];
274 [params setValue:k forKey:key];
277 - (void)encodeWithCoder:(NSCoder*)encoder
279 [encoder encodeObject:[attrs valueForKey:kCIAttributeFilterName] forKey:@"filterName"];
280 [encoder encodeObject:name forKey:@"name"];
281 [encoder encodeObject:attrs forKey:@"attrs"];
282 [encoder encodeObject:colors forKey:@"colors"];
283 [encoder encodeObject:vecs forKey:@"vecs"];
284 [encoder encodeObject:affine forKey:@"affine"];
285 [encoder encodeObject:params forKey:@"params"];
286 [encoder encodeBool:generator forKey:@"generator"];
289 - (id)initWithCoder:(NSCoder*)coder
291 name = [coder decodeObjectForKey:@"name"];
292 attrs = [coder decodeObjectForKey:@"attrs"];
293 colors = [coder decodeObjectForKey:@"colors"];
294 vecs = [coder decodeObjectForKey:@"vecs"];
295 affine = [coder decodeObjectForKey:@"affine"];
296 params = [coder decodeObjectForKey:@"params"];
297 generator = [coder decodeBoolForKey:@"generator"];
299 NSString* filterName = [coder decodeObjectForKey:@"filterName"];
300 filter = [[CIFilter filterWithName:filterName] retain];
301 [filter setDefaults];