This is InfoLifeView.m in view mode; [Download] [Up]
/*
* InfoLifeView is a life view with some texts for the Titles and stuff.
* It is used for a nifty InfoPanel. Some people (see Help) clued me in on
* the way to dislpay stuff in the background...
*
* Copyright (c) 1993 Gil Rivlis
*/
#import "InfoLifeView.h"
@implementation InfoLifeView
- initFrame:(NXRect *)frameRect
{
int i;
[super initFrame:frameRect];
if(population) free(population);
zoomSize = 1.5; /* init zoom Size */
universe.height = 60;
universe.width = 60;
population = malloc(sizeof(char)*universe.height*universe.width);
for (i = 0; i<universe.width*universe.height; i++) {
population[i] = 0;
}
[super initFrame:frameRect];
[self sizeTo:(float)(FONT_SIZE*universe.width)
:(float)(FONT_SIZE*universe.height) ];
[self setDrawSize:(float)universe.width :(float)universe.height];
[self setDrawOrigin:-0.5 :-0.5];
[self setOpaque:NO];
return [self display];
}
/* overwrite drawself. We don't need grid, and we want to draw in gray.
* Also we need to draw the text each time on top.
*/
- drawSelf:(const NXRect *)rects :(int)rectCount
{
float oldX = 0.0, oldY = 0.0; /* Hold the last full one */
float *xyPositions; /* pairs of positions... */
char *charString; /* put enough 'special' chars */
float firstX = 0.0, firstY = 0.0; /* hold the first for xyshow */
int i, j;
PSWDefineFont("LifeFont",1.0); /* Get the special font */
/* Allocate the correct memory size */
xyPositions = calloc( 2*popSize - 1, sizeof(float) );
charString = calloc( popSize + 1, sizeof(char) );
/* Fill in the character */
for(j=0; j< popSize; j++) {
charString[j] = 'a';
}
charString[popSize] = 0;
/* skip begining of population array */
i=0;
while( (population[i++] == 0) && (i<universe.width*universe.height) );
j = i - 1;
if(population[j]==10) {
firstX = (float)(j % universe.width) - oldX;
firstY = (float)(j / universe.width) - oldY;
oldY = (float)( j / universe.width );
oldX = (float)( j % universe.width );
}
/* continue the array. Now we need relative distances */
j = 0;
for(; i < universe.width*universe.height; i++) {
if(population[i] == 10) {
xyPositions[2*j] = (float)( i % universe.width ) - oldX;
xyPositions[2*j + 1] = (float)( i / universe.width ) - oldY;
oldY = (float)( i / universe.width );
oldX = (float)( i % universe.width );
j++;
}
}
/* Now we draw, at last */
PSsetgray(NX_LTGRAY);
NXRectFill(&bounds); /* for the background */
PSsetgray(NX_DKGRAY);
PSWXYShow( firstX, firstY, charString, xyPositions, 2*popSize);
[popSizeField setIntValue:popSize];
/* free old stuff */
cfree(xyPositions);
cfree(charString);
/* Now for text drawing. We disable flush window, so that we can
* flush all at once. Otherwise it flickers a lot.
*/
[[self window] disableFlushWindow];
[copyrightText display];
[versionText display];
[authorText display];
[theAppButton display];
[theBox display];
[theTitle display];
[[[self window] reenableFlushWindow] flushWindow];
return self;
}
/* disable mouse down drawing */
- mouseDown:(NXEvent *)theEvent
{
return self;
}
- window
{
return window;
}
- free
{
free(population);
[super free];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.