This is MorphView.m in view mode; [Download] [Up]
#import "MorphView.h"
#import <appkit/appkit.h>
#define MORPH_DELAY 2000
@implementation MorphView
static void myWait(int millisecs)
/* Because the unix function usleep() is not thread-safe, I wrote a little
* function to delay the sorts for a specified number of milliseconds.
* Basically it allocates a port for itself and then tries to receive a
* message on that port. I don't send any messages to that port, so it is
* waiting futilely. However, I indicate the msg_receive should time out in
* the number of milliseconds I wanted to wait.
*/
{
msg_header_t nullMsg;
port_t aPort;
if (port_allocate(task_self(), &aPort) != KERN_SUCCESS) return;
nullMsg.msg_local_port = aPort;
nullMsg.msg_size = sizeof(nullMsg);
msg_receive(&nullMsg,RCV_TIMEOUT,millisecs);// wait until timeout
port_deallocate(task_self(),aPort); // clean up
}
- initFrame: (const NXRect *) theFrame
{
return [self initFrame: theFrame images: 0 delay: 1 delta: 0.05];
}
- initFrame:(const NXRect *) theFrame images: images delay:(int) delay
delta:(float) delta
{
[super initFrame: theFrame];
[self setImages: images delay: delay delta: delta];
return self;
}
- setImages: images delay:(int) delay delta:(float) delta
{
if( imageList != 0 )
[imageList free];
if( images != nil )
imageList = [images copy];
else
imageList = [[List alloc] initCount: 0];
imageDelta = delta;
imageDelay = delay;
imageIndex = -1;
return self;
}
- setDelegate: newDelegate
{
id oldDelegate = delegate;
delegate = newDelegate;
return oldDelegate;
}
- morph: sender
{
float delta;
int count;
id image0, image1;
if( [sender isKindOf: [Button class]] == YES )
morphTrigger = [sender setEnabled: NO];
count = [imageList count];
imageIndex ++;
image0 = [imageList objectAt: imageIndex];
image1 = [imageList objectAt: imageIndex + 1];
[self lockFocus];
if( [delegate hasDrawMethodFor: image0 imageNum: imageIndex] == YES )
[delegate performDrawFor: image0 imageNum: imageIndex inView: self];
// Perform the dissolution
for(delta = 0; delta <= 1.0; delta += imageDelta)
{
[image0 composite:NX_SOVER toPoint: &bounds.origin];
[image1 dissolve: delta toPoint: &bounds.origin];
[window flushWindow];
myWait(imageDelay);
}
[image1 composite: NX_SOVER toPoint: &bounds.origin];
[window flushWindow];
[self unlockFocus];
if( imageIndex < count - 1 )
{
[self perform: _cmd with: self
afterDelay: MORPH_DELAY cancelPrevious: YES];
}
else
{
imageIndex = -1;
[morphTrigger setEnabled: YES];
[self display];
}
return self;
}
- drawSelf:(const NXRect *) rects :(int) rectCount
{
[[imageList objectAt: 0] composite: NX_SOVER toPoint: &bounds.origin];
return self;
}
- (int) count
{
return [imageList count];
}
- (float) delta
{
return imageDelta;
}
@end
/* RCS Information:
$Author: me $;
$Date: 93/02/23 02:00:54 $;
$Source: /usr1/me/NeXTSrc/MyClasses/RCS/MorphView.m,v $;
Revision: 1.3 $;
*/
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.