This is InfoView.m in view mode; [Download] [Up]
#import "InfoView.h"
#import <math.h>
#define RANDINT(n) (rand() % ((n)+1))
inline float restrictValue(float val, float max, float min)
{
if (val > max)
return max;
else if (val < min)
return min;
else
return val;
}
@implementation InfoView
- initWithFrame:(NSRect)frameRect;
{
[super initWithFrame:frameRect];
oldImage = frontImage = [NSImage imageNamed:@"OutOfTheWood"];
image = [NSImage imageNamed:@"Credits"];
bat = [NSImage imageNamed:@"bat"];
toggle = YES;
imageSize = [image size];
batSize = [bat size];
buffer = [[NSImage alloc] initWithSize:imageSize];
[self compositeWithDissolve:NO andDelta:0.0];
frontPage = YES;
animateTimer = nil;
return self;
}
- (void)dealloc;
{
[self removeTimer];
[image release];
[oldImage release];
[buffer release];
[bat release];
return [super dealloc];
}
- (void)compositeWithDissolve:(BOOL)aBool andDelta:(float)aDelta
{
NSPoint pt = {0.0,0.0};
[buffer lockFocus];
[oldImage compositeToPoint:pt operation:NSCompositeCopy];
if(aBool)
[image dissolveToPoint:pt fraction:aDelta];
[buffer unlockFocus];
}
- (void)compositeWithChecker:(BOOL)aBool andDelta:(float)aDelta
{
NSRect rects[64], r;
NSSize imgSize,rectSize;
NSPoint pt = {0.0,0.0};
float height,h;
int x, y, index;
id img;
[buffer lockFocus];
[oldImage compositeToPoint:pt operation:NSCompositeCopy];
if(!aBool){
[buffer unlockFocus];
return;
}
imgSize = [image size];
img = [[NSImage alloc] initWithSize:imgSize];
rectSize.width = imgSize.width / 8;
rectSize.height = imgSize.height / 8;
height = 2 * aDelta * rectSize.height;
h = height - rectSize.height;
for(x = 0; x < 8; x ++){
for(y = 0; y < 8; y ++){
index = x + y * 8;
if(height > rectSize.height){
if((x % 2) == (y % 2)){
rects[index] = NSMakeRect(x * rectSize.width, (y + 1) * rectSize.height - h, rectSize.width, h);
} else {
rects[index] = NSMakeRect(x * rectSize.width, y * rectSize.height, rectSize.width, rectSize.height);
}
} else {
if((x % 2) != (y % 2)){
rects[index] = NSMakeRect(x * rectSize.width, y * rectSize.height, rectSize.width, height);
} else {
rects[index] = NSMakeRect(0, 0, 0, 0);
}
}
}
}
[img lockFocus];
PSsetgray(0.0);
PSsetalpha(0.0);
r = NSMakeRect(0, 0, imgSize.width, imgSize.height);
NSRectFill(r);
PSsetalpha(1.0);
NSRectFillList(rects,64);
[image compositeToPoint:pt operation:NSCompositeSourceIn];
[img unlockFocus];
[img compositeToPoint:pt operation:NSCompositeSourceOver];
[buffer unlockFocus];
[img release];
}
- (void)drawRect:(NSRect)rect;
{
NSPoint p = {0.0, 0.0};
PSsetgray(NSLightGray);
NSRectFill([self bounds]);
[buffer compositeToPoint:p operation:NSCompositeCopy];
}
- (void)mouseDown:(NSEvent *)thisEvent
{
delta = 0.0;
[self compositeWithDissolve:NO andDelta:delta];
[self display];
animationDissolve =YES;
animationCrowl = NO;
animationStep = 0;
if(!animateTimer)
animateTimer = [[NSTimer scheduledTimerWithTimeInterval:.03
target:self selector:@selector(animationClick:)
userInfo:self repeats:YES] retain];
}
- (void)start:sender
{
[self display];
[self removeTimer];
animationDissolve = NO;
animationCrowl = YES;
animationStep = 0;
randDirection = 0;
batRect.origin.y = 50.0;
batRect.origin.x = 50.0;
batRect.size.width = batSize.width;
batRect.size.height = batSize.height / 4;
if(!animateTimer)
animateTimer = [[NSTimer scheduledTimerWithTimeInterval:.03
target:self selector:@selector(animationClick:)
userInfo:self repeats:YES] retain];
}
- (void)stop:(id)sender
{
[self removeTimer];
}
- (void)animationClick:(NSTimer *)timer
{
if(animationCrowl)
[self animateCrowl];
if(animationDissolve)
[self animateDissolve];
PSWait();
}
- (void)animateCrowl
{
NSRect tmpRect;
int nr;
[self lockFocus];
[self drawBackground:batRect];
if(animationStep % 11 == 0)
randDirection = RANDINT(7);
switch(randDirection){
case 0 :batRect.origin.x += 1;
break;
case 1 :batRect.origin.x += 1;
batRect.origin.y += 1;
break;
case 2 :batRect.origin.y += 1;
break;
case 3 :batRect.origin.x -= 1;
batRect.origin.y += 1;
break;
case 4 :batRect.origin.x -= 1;
break;
case 5 :batRect.origin.x -= 1;
batRect.origin.y -= 1;
break;
case 6 :batRect.origin.y -= 1;
break;
case 7 :batRect.origin.x += 1;
batRect.origin.y -= 1;
break;
}
animationStep++;
batRect.origin.x = restrictValue(batRect.origin.x,200,50);
batRect.origin.y = restrictValue(batRect.origin.y,230,50);
tmpRect = NSMakeRect(0, 0, batSize.width, batSize.height / 4);
nr = animationStep % 8;
switch(nr){
case 1:
case 6:
tmpRect.origin.y += batSize.height / 4;
break;
case 2:
case 5:
tmpRect.origin.y += batSize.height / 2;
break;
case 3:
case 4:
tmpRect.origin.y += 3 * batSize.height / 4;
break;
}
[bat compositeToPoint:batRect.origin fromRect:tmpRect operation:NSCompositeSourceOver];
[[self window] flushWindow];
[self unlockFocus];
}
- (void)animateDissolve
{
id dummy;
delta = delta + 0.20;
if(toggle)
[self compositeWithDissolve:YES andDelta:delta];
else
[self compositeWithChecker:YES andDelta:delta];
[self display];
if(delta < 1.0)
return;
toggle = !toggle;
dummy = oldImage;
oldImage = image;
image = dummy;
frontPage = (!frontPage);
[self removeTimer];
if(frontPage)
[self start:self];
}
- (void)removeTimer
{
if(animateTimer){
[animateTimer invalidate];
[animateTimer release];
animateTimer = nil;
}
}
- (void)drawBackground:(NSRect)rect
{
NSRect tmpRect = rect;
tmpRect.origin.x = floor(NSMinX(tmpRect));
tmpRect.origin.y = floor(NSMinY(tmpRect));
if ([[NSDPSContext currentContext] isDrawingToScreen]) {
PSsetgray(NSWhite);
PScompositerect(NSMinX(tmpRect), NSMinY(tmpRect),
NSWidth(tmpRect), NSHeight(tmpRect), NSCompositeSourceOver);
}
[frontImage compositeToPoint:tmpRect.origin fromRect:tmpRect operation:NSCompositeSourceOver];
}
- (BOOL)windowShouldClose:(id)sender
{
id dummy;
[self stop:self];
if(!frontPage){
toggle = !toggle;
frontPage = YES;
dummy = oldImage;
oldImage = image;
image = dummy;
[self compositeWithDissolve:NO andDelta:0.0];
}
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.