This is OutputView.m in view mode; [Download] [Up]
#import "OutputView.h"
@implementation OutputView
- clearOutputImage
{
[outputImage lockFocus];
NXSetColor (NX_COLORCLEAR);
NXRectFill (&bounds);
[outputImage unlockFocus];
return self;
}
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
outputImage = [[NXImage alloc] initSize:&frame.size];
[outputImage setUnique:YES];
[outputImage setCacheDepthBounded:NO];
[outputImage useCacheWithDepth:NX_TwentyFourBitRGBDepth];
[self clearOutputImage];
return self;
}
- free
{
[outputImage free];
return [super free];
}
- showNotCompleteAlert
{
NXRunLocalizedAlertPanel (NULL, NULL,
"A complete image series is not available.", NULL, NULL, NULL);
return self;
}
- save:sender
{
int fd;
NXStream *stream;
if (!seriesComplete) {
[self showNotCompleteAlert];
return nil;
}
if (outputFilename) {
[[self window] setTitleAsFilename:outputFilename];
fd = creat (outputFilename, 0644);
stream = NXOpenFile (fd, NX_WRITEONLY);
[outputImage writeTIFF:stream allRepresentations:NO
usingCompression:NX_TIFF_COMPRESSION_LZW andFactor:0.];
NXClose (stream);
close (fd);
} else
[self saveAs:self];
return self;
}
- saveAs:sender
{
id savePanel;
if (!seriesComplete) {
[self showNotCompleteAlert];
return nil;
}
savePanel = [SavePanel new];
if ([[savePanel setRequiredFileType:"tiff"] runModal]) {
outputFilename = [savePanel filename];
if (outputFilename) [self save:self];
}
return self;
}
- beginSeriesOfFrames:(int)newNumFrames withSize:(int)newFrameSize
{
NXCoord width, height;
numFrames = newNumFrames;
frameSize = newFrameSize;
currentFrame = 0;
seriesComplete = NO;
[saveMenuItem setEnabled:NO];
[saveAsMenuItem setEnabled:NO];
width = (numFrames > 4) ?
(NXCoord)frameSize * 4. :
(NXCoord)frameSize * numFrames;
height = ((numFrames + 3) / 4) * (NXCoord)frameSize;
[self sizeTo:width :height];
return self;
}
- addFrame:newBitmap
{
if (seriesComplete) {
[newBitmap free];
return nil;
}
[outputImage lockFocus];
PStranslate ((float)(currentFrame % 4) * (float)frameSize,
(float)(currentFrame / 4) * (float)frameSize);
[newBitmap draw];
[outputImage unlockFocus];
[newBitmap free];
currentFrame++;
if (currentFrame == numFrames) {
seriesComplete = YES;
[saveMenuItem setEnabled:YES];
[saveAsMenuItem setEnabled:YES];
}
return self;
}
- (int)nextFrame
{
return currentFrame;
}
- (int)numFrames
{
return numFrames;
}
- (BOOL)seriesComplete
{
return seriesComplete;
}
- sizeTo:(NXCoord)width :(NXCoord)height
{
NXSize newSize = {width, height};
[super sizeTo:width :height];
[outputImage setSize:&newSize];
[self clearOutputImage];
return self;
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
NXSetColor (NX_COLORLTGRAY);
NXRectFill (&bounds);
[outputImage composite:NX_SOVER toPoint:&bounds.origin];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.