This is ToyView.m in view mode; [Download] [Up]
#import "ToyView.h"
#import <dpsclient/wraps.h>
#import <appkit/publicWraps.h>
#import <appkit/NXImage.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/Application.h>
#import <stdlib.h>
@implementation ToyView
/* Local Method */
- setupInfo
{
NXRect rect;
NXImageRep *rep;
int x;
[image getSize: &origSize];
if (origSize.width == 0 || origSize.height == 0)
return nil; /* maybe Filter error */
rawmap = NULL;
[image setScalable: YES];
[image setDataRetained: YES];
// [image setBackgroundColor: NX_COLORWHITE];
rep = [image bestRepresentation];
if ((x = [rep pixelsWide]) != NX_MATCHESDEVICE
&& x != origSize.width) {
origSize.width = x;
origSize.height = [rep pixelsHigh];
[image setSize: &origSize];
}
scaleFactor = 1.0;
backgray = 1.0; /* White */
rect.size = curSize = origSize;
rect.origin.x = rect.origin.y = 0;
[self initFrame: &rect];
comInfo = (commonInfo *)malloc(sizeof(commonInfo));
comInfo->width = origSize.width;
comInfo->height = origSize.height;
comInfo->bits = [rep bitsPerSample];
comInfo->numcolors = [rep numColors]; /* without alpha */
comInfo->alpha = [rep hasAlpha];
if ( [rep isKindOf:[NXBitmapImageRep class]] ) {
comInfo->xbytes = [(NXBitmapImageRep *)rep bytesPerRow];
comInfo->cspace = [(NXBitmapImageRep *)rep colorSpace];
comInfo->isplanar = [(NXBitmapImageRep *)rep isPlanar];
comInfo->type = Type_tiff;
}else {
comInfo->xbytes = 0;
// comInfo->cspace = 0; DON'T CARE
comInfo->alpha = YES;
comInfo->isplanar = YES; /* maybe... */
comInfo->type = Type_eps;
}
comInfo->palette = NULL;
comInfo->palsteps = 0;
comInfo->memo[0] = 0;
selectRect.size.width = 0.0;
selectRect.size.height = 0.0;
return self;
}
- initFromFile:(const char *)filename
{
if ((image = [[NXImage alloc] initFromFile: filename]) == nil)
return nil;
[ToyView cursor];
return [self setupInfo];
}
- initFromStream:(NXStream *)stream
{
if ((image = [[NXImage alloc] initFromStream: stream]) == nil)
return nil;
[ToyView cursor];
return [self setupInfo];
}
- initDataPlanes:(unsigned char **)planes info:(commonInfo *)cinf
{
NXRect frect;
NXBitmapImageRep *imageRep;
int spp;
frect.origin.x = frect.origin.y = 0;
origSize.width = cinf->width;
origSize.height = cinf->height;
frect.size = curSize = origSize;
scaleFactor = 1.0;
backgray = 1.0; /* White */
rawmap = planes[0];
comInfo = cinf;
[self initFrame: &frect];
spp = cinf->numcolors;
if (cinf->alpha) spp++;
imageRep = [[NXBitmapImageRep alloc] initDataPlanes: planes
pixelsWide: cinf->width pixelsHigh: cinf->height
bitsPerSample: cinf->bits samplesPerPixel: spp
hasAlpha: cinf->alpha isPlanar: YES
colorSpace: cinf->cspace bytesPerRow: cinf->xbytes
bitsPerPixel: cinf->bits];
if (imageRep == nil)
return nil;
if ((image = [[NXImage alloc] initSize:&origSize]) == nil) {
[imageRep free];
return nil;
}
[image setScalable: YES];
[image setDataRetained: YES];
[image useRepresentation:imageRep];
// [image setBackgroundColor: NX_COLORWHITE]; NO NEED!!
[ToyView cursor];
return self;
}
- setCommText: (TextField *)text
{
commText = text;
return self;
}
- (NXSize *)originalSize
{
return &origSize;
}
- (NXSize *)resize: (float)factor
{
int wd = (int)(origSize.width * factor + 0.5);
int ht = (int)(origSize.height * factor + 0.5);
if (wd > MAXWidth || ht > MAXWidth || wd < 4 || ht < 4)
return NULL;
curSize.width = wd;
curSize.height = ht;
scaleFactor = factor;
backgray = 1.0; /* White */
[self sizeTo: curSize.width : curSize.height];
[window invalidateCursorRectsForView:self];
[image setSize: &curSize];
[self clearDraggedLine];
return &curSize;
}
- free
{
if (image != nil)
[image free];
if (rawmap) free((void *)rawmap);
/* NXBitmapImageRep's Bug ??
Method "initDataPlanes: planes ..." allocates inside
an area of 20 bytes such as "unsigned char *planes[5]".
This area is not freed and becomes a leak node.
*/
if (comInfo) {
if (comInfo->palette) free((void *)comInfo->palette);
free((void *)comInfo);
}
return [super free];
}
- (NXImage *)image
{
return image;
}
- (commonInfo *)commonInfo
{
return comInfo;
}
- (NXRect *)selectedRect
{
return &selectRect;
}
- (NXRect *)selectedScaledRect
{
static NXRect rct;
if (scaleFactor == 1.0) return &selectRect;
rct.size.width = (int)(selectRect.size.width / scaleFactor + 0.5);
rct.size.height = (int)(selectRect.size.height / scaleFactor + 0.5);
rct.origin.x = (int)(selectRect.origin.x / scaleFactor + 0.5);
rct.origin.y = (int)(selectRect.origin.y / scaleFactor + 0.5);
return &rct;
}
- (float)scaleFactor
{
return scaleFactor;
}
/* Overload */
- beginPrologueBBox:(const NXRect *)boundingBox
creationDate:(const char *)dateCreated
createdBy:(const char *)anApplication
fonts:(const char *)fontNames
forWhom:(const char *)user
pages:(int)numPages
title:(const char *)aTitle
{
/* Not to use the title of the window as %%Title: of EPS file. */
char buf[MAXFILENAMELEN];
const char *p;
int i, cc;
p = aTitle;
if (!p)
p = [window title];
for (i = 0; ; i++) {
cc = p[i];
if (cc == 0 || (cc > 0 && cc <= ' ')
|| cc == '(' || cc == ')' ) break;
buf[i] = cc;
}
buf[i] = 0;
return [super beginPrologueBBox:boundingBox
creationDate:dateCreated
createdBy:anApplication
fonts:fontNames
forWhom:user
pages:numPages
title:(const char *)buf];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.