This is InfoView.m in view mode; [Download] [Up]
/* Author Cristian Cserveny, 1994.
Converted to the OpenStep version by Ovidiu Predescu, 1997.
*/
#import <AppKit/AppKit.h>
#import "InfoView.h"
#define PERIOD 0.005
#define TILES 16
#define GENERATOR 14
#define SMALLMARG 1
#define BIGMARG 2
@implementation InfoView
- (void)awakeFromNib
{
NSRect rect = [self bounds];
NSImage* appImage = [NSApp applicationIconImage];
NSSize size;
images = [NSMutableArray new];
[images addObject:appImage];
size = [appImage size];
point.x = (rect.size.width - size.width) / 2;
point.y = (rect.size.height - size.height) / 2;
xTile = (rect.size.width - SMALLMARG - BIGMARG) / TILES;
yTile = (rect.size.height - SMALLMARG - BIGMARG) / TILES;
resultImage = [[NSImage alloc] initWithSize:rect.size];
[resultImage lockFocus];
PSsetgray(NSLightGray);
NSRectFill(rect);
rect.origin.x++;
rect.size.height--;
rect.size.width--;
PSsetgray(NSBlack);
NSRectFill(rect);
rect.origin.x--;
rect.origin.y++;
PSsetgray(NSWhite);
NSRectFill(rect);
[appImage compositeToPoint:point operation:NSCompositeSourceOver];
[resultImage unlockFocus];
currentImageIndex = 1;
}
- (void)dealloc
{
[images release];
[resultImage release];
[super dealloc];
}
- (void)showImageNumber:(int)index
{
if (index < 0 || index >= [images count] || imagesToDisplay)
return;
currentImageIndex = index;
tickNo = 1;
imagesToDisplay = 1;
[NSTimer scheduledTimerWithTimeInterval:PERIOD
target:self
selector:@selector(animateOneImage:)
userInfo:nil
repeats:YES];
}
- (void)showAllImages
{
if ([images count] <= 1 || imagesToDisplay)
return;
imagesToDisplay = [images count];
tickNo = 1;
[NSTimer scheduledTimerWithTimeInterval:PERIOD
target:self
selector:@selector(animateAllImages:)
userInfo:nil
repeats:NO];
}
- (void)mouseDown:(NSEvent*)event
{
if (!imagesToDisplay)
[self showAllImages];
}
- (void)addImageNamed:(NSString*)imageName
{
NSBundle* bundle = [NSBundle bundleForClass:isa];
NSString* path = [bundle pathForResource:imageName ofType:@"tiff"];
NSImage* image = [[[NSImage alloc] initWithContentsOfFile:path]
autorelease];
[self addImage:image];
}
- (void)addImage:(NSImage*)image
{
// NSRect rect = { NSZeroPoint, [image size] };
[image lockFocus];
// PSsetgray(NSWhite);
// NSRectFill(rect);
[image compositeToPoint:NSZeroPoint operation:NSCompositeSourceOver];
[image unlockFocus];
[images addObject:image];
}
- (void)drawRect:(NSRect)frame
{
[resultImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
}
- (void)animateOneImage:(NSTimer*)timer
{
id image = [images objectAtIndex:currentImageIndex];
NSRect rect;
NSPoint targetPoint;
tickNo = tickNo * GENERATOR % (TILES * TILES + 1);
[resultImage lockFocus];
rect.origin.x = (tickNo % TILES) * xTile + SMALLMARG;
rect.origin.y = (tickNo / TILES) * yTile + BIGMARG;
rect.size.width = xTile;
rect.size.height = yTile;
targetPoint.x = point.x + rect.origin.x;
targetPoint.y = point.y + rect.origin.y;
if(tickNo == 1) {
[timer invalidate];
tickNo = 0;
rect.origin = NSZeroPoint;
rect.size = [image size];
rect.origin = point;
PSsetgray(NSWhite);
NSRectFill(rect);
[image compositeToPoint:point operation:NSCompositeSourceOver];
currentImageIndex++;
if (currentImageIndex == [images count])
currentImageIndex = 0;
imagesToDisplay--;
}
else
[image compositeToPoint:targetPoint
fromRect:rect
operation:NSCompositeSourceOver];
[resultImage unlockFocus];
[self display];
}
- (void)animateAllImages:(NSTimer*)timer
{
if (tickNo)
[self animateOneImage:timer];
/* Schedule a new timer if we still have to display parts of the current image. */
if (tickNo)
[NSTimer scheduledTimerWithTimeInterval:PERIOD
target:self
selector:@selector(animateAllImages:)
userInfo:nil
repeats:NO];
else if (imagesToDisplay) {
/* Setup a new timer after which we display the rest of images */
tickNo = 1;
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(animateAllImages:)
userInfo:nil
repeats:NO];
}
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.