OSDN Git Service

add small window mode
[eliscolors/main.git] / ElisEffect.m
1 //
2 //  ElisEffect.m
3 //  Elis Colors
4 //
5 //  Created by 柳 on 09/09/15.
6 //  Copyright 2009 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "ElisEffect.h"
10
11
12 @implementation ElisEffect
13
14 // Elisでは、種類がエフェクトを隠蔽する!
15 - (id)initWithName:(NSString*)aname
16 {
17     [super init];
18     filter = [[CIFilter filterWithName:aname] retain];
19     [filter setDefaults];
20     params = [[NSMutableDictionary alloc] init];
21     attrs = [filter attributes];
22     generator = YES;
23     colors = [[NSMutableArray alloc] init];
24     vecs = [[NSMutableArray alloc] init];
25     affine = [[NSMutableArray alloc] init]; // アフィン変換なエフェクトなんて一つしか使わないのに、これってどうなの。
26     NSDictionary* inputKeys = [filter inputKeys];
27     id key, input;
28     for(key in inputKeys){
29         if([key isEqualToString:@"inputImage"]){
30             generator = NO;
31             continue;
32         }
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"]];
45         }
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];
51             [vecs addObject:key];
52             [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"X"]];
53             [vecs addObject:[NSString stringWithFormat:@"%@ %@", key, @"Y"]];
54         }
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"]];
66         }
67         else if([[[attrs valueForKey:key] valueForKey:kCIAttributeClass] isEqualToString:@"NSNumber"]){  
68             [self setEffectTrueValueForTime:key value:[[input valueForKey:kCIAttributeDefault] floatValue] time:QTZeroTime];
69         }
70     }   
71     
72     name = [attrs valueForKey:kCIAttributeFilterDisplayName];
73     //    [inputKeys release];
74     
75     return self;
76 }
77
78 - (void)setEffectValue:(NSString*)key value:(id)v
79 {
80     [filter setValue:v forKey:key];
81 }
82
83 // valueは0.0 ~ 1.0。
84 - (void)setEffectValueForTime:(NSString *)key value:(float)v time:(QTTime)time
85 {
86     ElisKeyframe *k;
87     float max, min;
88     if([colors indexOfObject:key] != NSNotFound){
89         max = 255.0;
90         min = 0.0;
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"]){
96             max = ANGLE_MAX;
97             min = ANGLE_MIN;
98         } else {
99             max = 5.0;
100             min = 0.1;
101         }
102     }else{
103         max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
104         min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
105     }
106     
107     // 適切な値へマップする。
108     v = (max - min)*v + min;
109     
110     if([params valueForKey:key]){
111         k = [params valueForKey:key];
112         [k setValueForTime:v time:time];
113     }
114     else{
115         k = [[ElisKeyframe alloc] init];
116         [k setValueForTime:v time:time];
117         [params setValue:k forKey:key];
118     }
119 }
120
121 // valueは生の値を渡す。
122 - (void)setEffectTrueValueForTime:(NSString *)key value:(float)v time:(QTTime)time
123 {
124     ElisKeyframe *k;
125     
126     if([params valueForKey:key]){
127         k = [params valueForKey:key];
128         [k setValueForTime:v time:time];
129     }
130     else{
131         k = [[ElisKeyframe alloc] init];
132         [k setValueForTime:v time:time];
133         [params setValue:k forKey:key];
134     }
135 }
136
137
138 - (float)getEffectValue:(NSString*)key forTime:(QTTime)time
139 {
140     float max, min;
141     if([colors indexOfObject:key] != NSNotFound){
142         max = 255.0;
143         min = 0.0;
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"]){
149             max = ANGLE_MAX;
150             min = ANGLE_MIN;
151         } else {
152             max = 5.0;
153             min = 0.1;
154         }
155     }else{
156         max = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMax] floatValue];
157         min = [[[attrs valueForKey:key] valueForKey:kCIAttributeSliderMin] floatValue];
158     }
159     
160     if([params valueForKey:key])
161         return ([[params valueForKey:key] getValueForTime:time] - min)/(max - min);
162     
163     return 0;
164 }
165
166 - (float)getEffectTrueValue:(NSString*)key forTime:(QTTime)time
167 {
168     if([params valueForKey:key])
169         return [[params valueForKey:key] getValueForTime:time];
170     
171     return 0;
172 }
173
174 - (void)setInputImage:(CIImage*)cm
175 {
176     if(!generator)
177         [filter setValue:cm forKey:@"inputImage"];
178 }
179
180 - (CIImage*)getImage:(QTTime)time
181 {
182     NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
183     NSString *key, *sub;
184     CIColor *col;
185     CIVector* vec;
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];
193     }
194     size = [vecs count];
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];
200     }
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];
208     }
209     
210     for(key in params){
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];
213     }
214     [pool release];
215     return [filter valueForKey:@"outputImage"];
216 }
217
218 - (NSMutableDictionary*)getParamDictionary
219 {
220     return params;
221 }
222
223 - (NSString*)getName
224 {
225     return name;
226 }
227
228 - (void)removeKeyframe:(NSString*)key
229 {
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];
234 }
235
236 - (void)encodeWithCoder:(NSCoder*)encoder
237 {
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"];
246 }
247
248 - (id)initWithCoder:(NSCoder*)coder
249 {
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"];
257     
258     NSString* filterName = [coder decodeObjectForKey:@"filterName"];
259     filter = [[CIFilter filterWithName:filterName] retain];
260     [filter setDefaults];
261     
262     return self;
263 }
264
265
266 @end