This is Mask.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import <stdio.h>
#import <string.h>
#import <stdlib.h>
#import <libc.h>
#import "Mask.h"
#import <appkit/Text.h>
#import <appkit/Matrix.h>
#import <appkit/Form.h>
#import <appkit/Cell.h>
#import <appkit/Application.h>
#import <appkit/OpenPanel.h>
@implementation Mask
- updateSize:sender
{
int i,j;
int sz;
int w, h;
float **old_msk;
int old_sz;
NXRect mrect;
NXRect srect;
NXSize cellSize;
[self new: self];
old_msk = [self getFloatMask: &old_sz];
sz = [size intValueAt: 0];
if(sz != old_sz)
if(sz > 0) {
[[mask renewRows:sz cols:sz] sizeToCells];
for(i=0;i<sz;i++)
for(j=0;j<sz;j++) {
[[[mask cellAt:i :j] setAlignment: NX_CENTERED] setBordered: YES];
if(i < old_sz && j < old_sz) // set old rows and cols
[[mask cellAt:i :j] setFloatValue: old_msk[i][j]];
if(sz > old_sz && i >= old_sz) // init new rows
[[mask cellAt:i :j] setFloatValue: 0.0];
if(sz > old_sz && j >= old_sz) // init new cols
[[mask cellAt:i :j] setFloatValue: 0.0];
}
[mask getBounds: &mrect];
[mask getCellSize:&cellSize];
[size getBounds: &srect];
h = mrect.size.height + cellSize.height +
srect.size.height;
w = mrect.size.width + cellSize.width;
if(w < srect.size.width)
w = srect.size.width;
[maskWindow sizeWindow:w :h];
[maskWindow display];
NXPing();
}
else {
NXRunAlertPanel("MASK","Illegal Size",NULL,NULL,NULL);
return nil;
}
cur_size = sz;
changed = YES;
return self;
}
- (int) getsize
{
return cur_size;
}
- (float) getval: (int)x :(int) y
{
return [[mask cellAt:x :y] floatValue];
}
- new:sender
{
free(file);
file = (char *)malloc((strlen("Untitled.mask")+1)*sizeof(char));
strcpy(file,"Untitled.mask");
[maskWindow setTitle: file];
return self;
}
- open:sender
{
char tpath [500];
char tfile[500];
char *opentypes[2] = {"mask",NULL};
id openpanel;
int loop;
openpanel = [OpenPanel new];
[openpanel allowMultipleFiles: NO];
if([openpanel runModalForTypes:opentypes]) {
loop = 0;
while ([openpanel filenames] [loop]) {
strcpy (tpath, [openpanel directory]);
strcpy (tfile, [openpanel filenames] [loop]);
file = (char *)malloc((strlen(tfile)+1)*sizeof(char));
strcpy(file,tfile);
path = (char *)malloc((strlen(tpath)+1)*sizeof(char));
strcpy(path,tpath);
[self openfile];
++loop;
}
}
return self;
}
- openfile
{
FILE *fp;
int i,j;
int sz;
char fullPath[500];
char *newfile;
float val;
strcpy(fullPath,path);
strcat(fullPath,"/");
strcat(fullPath,file);
newfile = (char *)malloc((strlen(file)+1)*sizeof(char));
strcpy(newfile,file);
if((fp = fopen(fullPath,"r")) == NULL) {
NXRunAlertPanel("MASK","Can't open mask file",NULL,NULL,NULL);
return nil;
}
fscanf(fp,"%d",&sz);
[size setIntValue: sz at:0];
[self updateSize: self]; // this overrides filename
for(i=0;i<sz;i++) {
for(j=0;j<sz;j++) {
fscanf(fp,"%f",&val);
[[mask cellAt:i :j] setFloatValue: val];
}
}
fclose(fp);
file = (char *)malloc((strlen(newfile)+1)*sizeof(char));
strcpy(file,newfile);
[maskWindow setTitle: file];
[maskWindow makeKeyAndOrderFront:maskWindow];
[maskWindow display];
changed = YES;
return self;
}
- save:sender
{
FILE *fp;
int i,j;
int sz;
char fullPath[500];
float **msk;
if(!path || !file)
[self saveAs: self];
strcpy(fullPath,path);
strcat(fullPath,"/");
strcat(fullPath,file);
if((fp = fopen(fullPath,"w")) == NULL) {
NXRunAlertPanel("MASK","Can't open file for writing",NULL,NULL,NULL);
return nil;
}
msk = [self getFloatMask: &sz];
fprintf(fp,"%d\n",sz);
for(i=0;i<sz;i++) {
for(j=0;j<sz;j++) {
fprintf(fp,"%f ",[[mask cellAt:i :j] floatValue]);
}
fprintf(fp,"\n");
}
fclose(fp);
return self;
}
- saveAs:sender
{
char tpath [500];
char tfile[500];
id savepanel;
savepanel = [SavePanel new];
if([savepanel runModal]) {
strcpy (tpath, [savepanel directory]);
strcpy (tfile, strrchr([savepanel filename],'/'));
strcat (tfile, ".mask");
file = (char *)malloc((strlen(tfile)+1)*sizeof(char));
strcpy(file,tfile);
path = (char *)malloc((strlen(tpath)+1)*sizeof(char));
strcpy(path,tpath);
[self save: self];
[maskWindow setTitle: file];
}
return self;
}
- (BOOL) hasNotChanged
{
if(changed) {
changed = NO;
return YES;
}
else return YES;
}
- (float **) getFloatMask: (int *)maskSize
{
int i,j;
int rows, cols;
float **theMask;
[mask getNumRows: &rows numCols: &cols];
*maskSize = rows;
theMask = (float **)malloc(rows*sizeof(float *));
for(i=0;i<rows;i++) theMask[i] = (float *)malloc(cols*sizeof(float));
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
theMask[i][j] = [[mask cellAt:i :j] floatValue];
return theMask;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.