-
Notifications
You must be signed in to change notification settings - Fork 17
/
GPULifeSaverView.m
234 lines (193 loc) · 6.97 KB
/
GPULifeSaverView.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
//
// GPULifeSaverView.m
// GPULife
//
// Created by Michael Ash on 5/13/05.
// Copyright 2005 __MyCompanyName__. All rights reserved.
//
#import "GPULifeSaverView.h"
#import "GPULifeView.h"
@implementation GPULifeSaverView
static NSString * const kLimitFPSDefaultsName = @"LimitFPS";
static NSString * const kLimitFPSValueDefaultsName = @"LimitFPSValue";
static NSString * const kDisplayFPSDefaultsName = @"DisplayFPS";
static NSString * const kZoomDefaultsName = @"Zoom";
static NSString * const kInitialFillDefaultsName = @"InitialFill";
static NSString * const kGenerationDefaultsName = @"GenerationRate";
static NSString * const kCornerColorsDefaultsName = @"CornerColors";
+ (void)initialize
{
[[ScreenSaverDefaults defaultsForModuleWithName:
[[NSBundle bundleForClass:[self class]] bundleIdentifier]] registerDefaults:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kLimitFPSDefaultsName,
[NSNumber numberWithDouble:30.0], kLimitFPSValueDefaultsName,
[NSNumber numberWithBool:NO], kDisplayFPSDefaultsName,
[NSNumber numberWithInt:2], kZoomDefaultsName,
[NSNumber numberWithInt:12], kInitialFillDefaultsName,
[NSNumber numberWithInt:1], kGenerationDefaultsName,
[NSArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:
[NSColor redColor], [NSColor blueColor], [NSColor greenColor], [NSColor whiteColor], nil]],
kCornerColorsDefaultsName,
nil]];
}
- (GPULifeColor3)structForNSColor:(NSColor *)c
{
GPULifeColor3 ret;
c = [c colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
[c getRed:&ret.r green:&ret.g blue:&ret.b alpha:NULL];
float max = MAX(MAX(ret.r, ret.g), ret.b);
// make sure the color isn't too black so the shader can still find it
if(max < 0.101)
{
if(max == 0.0)
ret.r = ret.g = ret.b = 0.101;
else
{
ret.r *= 0.101 / max;
ret.g *= 0.101 / max;
ret.b *= 0.101 / max;
}
}
return ret;
}
- (void)reinitLifeView
{
[lifeView removeFromSuperview];
[lifeView release];
lifeView = [[GPULifeView alloc] initWithFrame:[self bounds]];
[lifeView setUsesTimer:NO];
ScreenSaverDefaults *defaults = [ScreenSaverDefaults defaultsForModuleWithName:
[[NSBundle bundleForClass:[self class]] bundleIdentifier]];
[lifeView setShowsFPS:[defaults boolForKey:kDisplayFPSDefaultsName]];
[lifeView setZoom:[defaults integerForKey:kZoomDefaultsName]];
[lifeView setGenerationRate:[defaults integerForKey:kGenerationDefaultsName]];
[lifeView setInitialFill:[defaults integerForKey:kInitialFillDefaultsName]];
GPULifeColor3 colorsArray[4];
NSArray *colors = [NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:kCornerColorsDefaultsName]];
int i;
for(i = 0; i < 4; i++)
colorsArray[i] = [self structForNSColor:[colors objectAtIndex:i]];
[lifeView setCornerColors:colorsArray];
[self addSubview:lifeView];
}
- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self reinitLifeView];
}
return self;
}
- (void)dealloc
{
[lifeView release];
[colorWells release];
[configureSheet release];
[super dealloc];
}
- (void)startAnimation
{
ScreenSaverDefaults *defaults = [ScreenSaverDefaults defaultsForModuleWithName:
[[NSBundle bundleForClass:[self class]] bundleIdentifier]];
if([defaults boolForKey:kLimitFPSDefaultsName])
[self setAnimationTimeInterval:1.0 / [[defaults objectForKey:kLimitFPSValueDefaultsName] doubleValue]];
else
[self setAnimationTimeInterval:0.0];
[super startAnimation];
}
- (void)stopAnimation
{
[super stopAnimation];
}
- (void)drawRect:(NSRect)rect
{
}
- (void)animateOneFrame
{
[lifeView display];
}
- (BOOL)hasConfigureSheet
{
return YES;
}
- (void)fillDictionary:(NSMutableDictionary*)dict withColorWellsInView:(NSView *)superview
{
NSEnumerator *enumerator = [[superview subviews] objectEnumerator];
NSView *view;
while((view = [enumerator nextObject]))
{
if([view isKindOfClass:[NSColorWell class]])
[dict setObject:view forKey:[NSNumber numberWithInt:[view tag]]];
else
[self fillDictionary:dict withColorWellsInView:view];
}
}
- (NSWindow*)configureSheet
{
if(!configureSheet)
{
[NSBundle loadNibNamed:@"ScreenSaver" owner:self];
NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
[self fillDictionary:tempDict withColorWellsInView:colorWellBox];
[colorWells release];
colorWells = [tempDict copy];
}
ScreenSaverDefaults *defaults = [ScreenSaverDefaults defaultsForModuleWithName:[[NSBundle bundleForClass:[self class]] bundleIdentifier]];
[limitFPSCheckbox setState:[defaults boolForKey:kLimitFPSDefaultsName] ? NSOnState : NSOffState];
double fpsLimit = [[defaults objectForKey:kLimitFPSValueDefaultsName] doubleValue];;
[fpsSlider setDoubleValue:fpsLimit];
[fpsField setDoubleValue:fpsLimit];
[displayFPSCheckbox setState:[defaults boolForKey:kDisplayFPSDefaultsName] ? NSOnState : NSOffState];
int zoom = [defaults integerForKey:kZoomDefaultsName];
[zoomSlider setIntValue:zoom];
[zoomField setIntValue:zoom];
[initialFillSlider setIntValue:[defaults integerForKey:kInitialFillDefaultsName]];
[generationField setIntValue:[defaults integerForKey:kGenerationDefaultsName]];
NSArray *colors = [NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:kCornerColorsDefaultsName]];
int i;
for(i = 0; i < 4; i++)
[[colorWells objectForKey:[NSNumber numberWithInt:i]] setColor:[colors objectAtIndex:i]];
[self limitFPSChecked:limitFPSCheckbox];
return configureSheet;
}
- (void)limitFPSChecked:sender
{
[fpsSlider setEnabled:[sender state] == NSOnState];
[fpsField setEnabled:[sender state] == NSOnState];
}
- (void)limitFPSSlider:sender
{
double fpsLimit = [fpsSlider doubleValue];
[fpsField setDoubleValue:fpsLimit];
}
- (void)limitFPSField:sender
{
double fpsLimit = [fpsField doubleValue];
[fpsSlider setDoubleValue:fpsLimit];
}
- (void)ok:sender
{
ScreenSaverDefaults *defaults = [ScreenSaverDefaults defaultsForModuleWithName:[[NSBundle bundleForClass:[self class]] bundleIdentifier]];
[defaults setBool:[limitFPSCheckbox state] == NSOnState forKey:kLimitFPSDefaultsName];
[defaults setObject:[NSNumber numberWithDouble:[fpsField doubleValue]] forKey:kLimitFPSValueDefaultsName];
[defaults setBool:[displayFPSCheckbox state] == NSOnState forKey:kDisplayFPSDefaultsName];
[defaults setInteger:[zoomField intValue] forKey:kZoomDefaultsName];
[defaults setInteger:[initialFillSlider intValue] forKey:kInitialFillDefaultsName];
[defaults setInteger:[generationField intValue] forKey:kGenerationDefaultsName];
NSMutableArray *array = [NSMutableArray array];
int i;
for(i = 0; i < 4; i++)
[array addObject:[[colorWells objectForKey:[NSNumber numberWithInt:i]] color]];
[defaults setObject:[NSArchiver archivedDataWithRootObject:array] forKey:kCornerColorsDefaultsName];
[defaults synchronize];
[NSApp endSheet:configureSheet];
[self reinitLifeView];
[[NSColorPanel sharedColorPanel] orderOut:nil];
}
- (void)cancel:sender
{
[NSApp endSheet:configureSheet];
[[NSColorPanel sharedColorPanel] orderOut:nil];
}
@end