This is Image.m in view mode; [Download] [Up]
#import "Image.h"
#import <stdio.h>
#import <stdlib.h>
#import <strings.h>
#import <libc.h>
#import <zone.h>
#import <mach.h>
#import <streams/streams.h>
#import <sys/file.h>
#import <appkit/Application.h>
#import <appkit/SavePanel.h>
#import <appkit/PopUpList.h>
#import <appkit/Control.h>
#import <appkit/Matrix.h>
#import <appkit/nextstd.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/Window.h>
#import <appkit/Panel.h>
#import <appkit/Pasteboard.h>
#import <appkit/graphics.h>
#import <appkit/tiff.h>
// Image.m
//
// Written by Vince DeMarco
// demarco@cpsc.ucalgary.ca
//
// This program is In the Public Domain. If you make any improvements to this
// program please let me know
//
#define XOFFSET 5.0 // Offset of subsequent windows
#define YOFFSET -20.0
@implementation Image:View
- init
{
const char *validSendTypes[2];
validSendTypes[0] = NXTIFFPboardType;
validSendTypes[1] = NULL;
self = [super init];
savePanelAccessoryWindow = [NXApp loadNibSection:"savepanel.nib" owner:self];
newZone = NXCreateZone(vm_page_size,vm_page_size,NO);
compressionType = NX_TIFF_COMPRESSION_NONE;
saveType = 1;
numColors = 3;
return(self);
}
- displayImage
{
unsigned char *planes[4];
NXSetRect(&temprect, 150.0, (800.0 - (double)ysize),(double)xsize, (double)ysize);
thiswindow = [[Window allocFromZone:newZone]
initContent:&temprect
style:NX_TITLEDSTYLE
backing:NX_RETAINED
buttonMask:NX_CLOSEBUTTONMASK | NX_MINIATURIZEBUTTONMASK | NX_RESIZEBUTTONMASK
defer:NO];
[thiswindow setDelegate:self];
[thiswindow setFreeWhenClosed:YES];
[thiswindow setTitleAsFilename:fileName];
if (windowIconName[0]){
[thiswindow setMiniwindowIcon:(const char *)windowIconName];
}
[thiswindow makeKeyAndOrderFront:nil];
[thiswindow display];
NXPing();
if (r == NULL){ // Check if there is anything to display if there isn't
return self; // just return
}
planes[0] = r;
planes[1] = g;
planes[2] = b;
planes[3] = a;
tiffimage = [[NXBitmapImageRep allocFromZone:newZone]
initDataPlanes: planes
pixelsWide: xsize
pixelsHigh: ysize
bitsPerSample: 8
samplesPerPixel: (numColors == 1 ? 3 : numColors)
hasAlpha: (numColors == 4 ? YES: NO )
isPlanar: YES
colorSpace: NX_RGBColorSpace
bytesPerRow: xsize*8
bitsPerPixel: 8];
[thiswindow setContentView:self];
[thiswindow display];
return(self);
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
[self getFrame:&temprect];
temprect.origin.x = 0.0;
temprect.origin.y = 0.0;
[self lockFocus];
[tiffimage drawIn:&temprect];
[self unlockFocus];
return self;
}
- free
{
NX_FREE(a);
NX_FREE(r);
NX_FREE(g);
NX_FREE(b);
[super free];
return(self);
}
- saveAsTiff:(const char *)filename usingCompression:(int)compression
{
int fd;
NXStream *stream;
if ( (fd = open(filename,(O_RDWR|O_CREAT),0600)) < 0){
return(self);
}
stream = NXOpenFile(fd,NX_READWRITE);
[tiffimage writeTIFF:stream usingCompression:compression];
NXClose(stream);
close(fd);
return(self);
}
- saveAsEPS:(const char *)filename
{
int fd;
NXStream *stream;
if ( (fd = open(filename,(O_RDWR|O_CREAT),0600)) < 0){
return(self);
}
stream = NXOpenFile(fd,NX_READWRITE);
[self copyPSCodeInside:&temprect to:stream];
NXClose(stream);
close(fd);
return(self);
}
// window Delegation methods
- windowWillClose:sender
{
NX_FREE(a); // Free the alpha,red,green, and blue buffers
NX_FREE(r);
NX_FREE(g);
NX_FREE(b);
return(self);
}
- print:sender
{
[self printPSCode:sender];
return(self);
}
- save:sender
{
savepanel = [SavePanel new];
[savepanel setAccessoryView:savePanelAccessory];
if (saveType == 1){
[savepanel setRequiredFileType:"tiff"];
[savepanel setTitle:"Save To TIFF"];
[compPopUP setEnabled:YES];
}else{
[savepanel setRequiredFileType:"eps"];
[savepanel setTitle:"Save To EPS"];
[compPopUP setEnabled:NO];
}
if ([savepanel runModal]){
if (saveType == 1){
[self saveAsTiff:[savepanel filename] usingCompression:compressionType];
}else{
[self saveAsEPS:[savepanel filename]];
}
}
return(self);
}
- saveType:sender
{
switch ([sender selectedCol]){
case 0:
[savepanel setRequiredFileType:"tiff"];
[savepanel setTitle:"Save To TIFF"];
[compPopUP setEnabled:YES];
saveType = 1;
break;
case 1:
[savepanel setRequiredFileType:"eps"];
[savepanel setTitle:"Save To EPS"];
[compPopUP setEnabled:NO];
saveType = 2;
break;
}
return(self);
}
- compType:sender
{
const char *selected_Cell = [[sender selectedCell] title];
switch(selected_Cell[0]){
case 'L' :
compressionType = NX_TIFF_COMPRESSION_LZW;
break;
case 'P' :
compressionType = NX_TIFF_COMPRESSION_PACKBITS;
break;
case 'J' :
compressionType = NX_TIFF_COMPRESSION_JPEG;
break;
case 'N' :
compressionType = NX_TIFF_COMPRESSION_NONE;
break;
}
return self;
}
- copy:sender
{
NXStream *stream;
int length,maxlen;
char *data;
const char *types[3];
types[0] = NXTIFFPboardType;
stream = NXOpenMemory(NULL,0,NX_WRITEONLY);
[tiffimage writeTIFF:stream];
NXGetMemoryBuffer(stream,&data,&length,&maxlen);
[[Pasteboard new] declareTypes:types num:1 owner:[self class]];
[[Pasteboard new] writeType:NXTIFFPboardType data:data length:length];
NXCloseMemory(stream, NX_FREEBUFFER);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.