This is AVIView.m in view mode; [Download] [Up]
/*
* Copyright 1994, Black Adder Research, Inc. This source code may be
* redistributed and modified with one restriction - do not claim that
* you wrote it.
*
* Black Adder Research, Inc.
* 730 Norell Ave. North
* Stillwater, MN 55082
*
*/
#import "AVIView.h"
#import <appkit/appkit.h>
@implementation AVIView : View
- initSize: (const NXSize *) aSize
{
NXRect imageRect;
id retVal = nil;
NXSetRect(&imageRect, 0.0, 0.0, aSize->width, aSize->height);
[super initFrame:&imageRect];
strcpy(aviFile, "");
if((theData = (unsigned char *)malloc(3 * (int) (aSize->width * aSize->height))) != NULL) {
if((theBitmap = [[NXBitmapImageRep alloc] initData:theData
pixelsWide: (int) aSize->width
pixelsHigh: (int) aSize->height
bitsPerSample: 8
samplesPerPixel: 3
hasAlpha: NO
isPlanar: NO
colorSpace: NX_RGBColorSpace
bytesPerRow: 0
bitsPerPixel: 0]) != nil) {
retVal = self;
}
}
return(retVal);
}
- runFromFile: (char *) AVIFile
{
strcpy(aviFile, AVIFile);
[self runAgain];
return(self);
}
- runAgain
{
char command[256];
int numFrPix;
BOOL shouldLoop = YES;
FILE *ifp;
if (strcmp(aviFile, "") != 0) {
numFrPix = 3 * [theBitmap pixelsWide] * [theBitmap pixelsHigh];
sprintf(command, "%s/aviDecode %s", [[NXBundle mainBundle] directory], aviFile);
if ((ifp = popen(command, "r")) != NULL) {
fread(theData, 1, 2*sizeof(int), ifp); /* skip width and height */
[self lockFocus];
while(shouldLoop) {
if(NXUserAborted()) {
NXResetUserAbort();
if(NX_ALERTDEFAULT == NXRunAlertPanel("AVIStream",
"Stop Playback?", "Yes", "No", NULL) ) {
shouldLoop = NO;
break;
}
}
if(fread(theData, 1, numFrPix, ifp) != numFrPix) {
shouldLoop = NO;
break;
}
else {
[theBitmap draw];
NXPing();
}
}
[self unlockFocus];
pclose(ifp);
}
}
return(self);
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
[theBitmap draw];
return self;
}
- free
{
free(theData);
[theBitmap free];
return [super free];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.