This is HipsImage.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import <stdio.h> #import <stdlib.h> #import <string.h> #import <libc.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> #import <appkit/graphics.h> #import <appkit/tiff.h> #import <streams/streams.h> #import <sys/file.h> #import <sys/vnode.h> #import "Mask.h" #import "HipsImage.h" char *read_line(FILE *fp,int *size); @implementation HipsImage:View + open:sender { char tpath [500]; char tfile[500]; char *opentypes[2] = {"hips",NULL}; id openpanel; int loop; self = [super new]; 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); name = (char *)malloc((strlen(tfile)+1)*sizeof(char)); strncpy(name,file,strlen(file)-5); name[strlen(file)-5] = '\0'; path = (char *)malloc((strlen(tpath)+1)*sizeof(char)); strcpy(path,tpath); [self openfile]; ++loop; } } return self; } - openfile { int i,j,k=0; int ich; int sz; char *buf; char fullPath[500]; FILE *fp; NXRect temprect; strcpy(fullPath,path); strcat(fullPath,"/"); strcat(fullPath,file); if((fp = fopen(fullPath,"r")) == NULL) return [self errormsg: "Can't open image file"]; if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; orig_name = (char *)malloc((strlen(buf)+1)*sizeof(char)); strcpy(orig_name,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; seq_name = (char *)malloc((strlen(buf)+1)*sizeof(char)); strcpy(seq_name,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; num_frame = atoi(buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; orig_date = (char *)malloc((strlen(buf)+1)*sizeof(char)); strcpy(orig_date,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; rows = atoi(buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; cols = atoi(buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; bits_per_pixel = atoi(buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; bit_packing = atoi(buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; pixel_format = atoi(buf); seq_history = (char *)malloc(sizeof(char)); strcpy(seq_history,"\0"); seq_desc = (char *)malloc(sizeof(char)); strcpy(seq_desc,"\0"); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; while (sz > 1 && buf[sz-1] == '|' && buf[sz] == '\\' ) { seq_history = (char *)realloc(seq_history,(strlen(seq_history)+sz+2)*sizeof( char)); seq_history = (char *)strcat(seq_history,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; } if(sz > 1) { seq_history = (char *)realloc(seq_history,(strlen(seq_history)+sz+2)*sizeof(char)); seq_history = (char *)strcat(seq_history,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; } while ( strcmp( buf, "." ) ) { seq_desc = (char *)realloc(seq_desc,(strlen(seq_desc)+sz+2)*sizeof(char)); seq_desc = (char *)strcat(seq_desc,buf); if((buf = read_line(fp,&sz)) == NULL) return [self errormsg: "Error reading file"]; } if(strcmp(buf,".")) return [self errormsg: "Error reading header"]; data = (int *)malloc(rows*cols*sizeof(int)); udata = (int *)malloc(rows*cols*sizeof(int)); odata = (int *)malloc(rows*cols*sizeof(int)); switch(pixel_format) { case HIPS_PFBYTE: if(bits_per_pixel != 8) return [self errormsg: "Can't handle unusual bits per pixel"]; if(bit_packing != 0) return [self errormsg: "Can't handle bit packing"]; break; default: return [self errormsg: "Error reading image"]; } for(i=0;i<rows;i++) { for(j=0;j<cols;j++) { ich = getc(fp); if(ich == EOF) return [self errormsg: "EOF reached prematurely"]; odata[k] = udata[k] = data[k] = ich; k++; } } fclose(fp); temprect.size.width = cols; temprect.size.height = rows; temprect.origin.x = 0; temprect.origin.y = 0; hipsWindow = [Window newContent:&temprect style:NX_SIZEBARSTYLE backing:NX_BUFFERED buttonMask:NX_ALLBUTTONS defer:NO]; [[hipsWindow moveTo:400 :250] setFreeWhenClosed: NO]; [self display]; return(self); } - drawSelf:(const NXRect *)rects :(int)rectCount { NXRect temprect; [self getFrame:&temprect]; temprect.origin.x = 0.0; temprect.origin.y = 0.0; NXImageBitmap(&temprect, // Rect cols, // pixelsWide rows, // pixelsHigh bits_per_pixel, // bps (bits per sample) 1, // spp (samples per pixel) NX_MESHED, // config NX_MONOTONICMASK, // mask [self getcdata], // data1 NULL, // data2 NULL, // data3 NULL, // data4 NULL); // data5 return self; } - revert { int k; for(k=0;k<rows*cols;k++) data[k] = odata[k]; return self; } - undo { int k; for(k=0;k<rows*cols;k++) data[k] = udata[k]; return self; } - display { [hipsWindow setTitle: name]; [hipsWindow sizeWindow:cols :rows]; [hipsWindow makeKeyAndOrderFront:hipsWindow]; [hipsWindow setContentView: self]; [hipsWindow display]; NXPing(); return self; } - writeheader: (FILE *)fp { fprintf(fp,"%s\n",orig_name); fprintf(fp,"%s\n",seq_name); fprintf(fp,"%d\n",num_frame); fprintf(fp,"%s\n",orig_date); fprintf(fp,"%d\n",rows); fprintf(fp,"%d\n",cols); fprintf(fp,"%d\n",bits_per_pixel); fprintf(fp,"%d\n",bit_packing); fprintf(fp,"%d\n",pixel_format); fprintf(fp,"%s\n",seq_history); fprintf(fp,"%s\n",seq_desc); fprintf(fp,".\n"); return(self); } - save:sender { FILE *fp; int i; char fullPath[500]; if(!path || !file) [self setPath: self]; strcpy(fullPath,path); strcat(fullPath,"/"); strcat(fullPath,name); strcat(fullPath,".hips"); if((fp = fopen(fullPath,"w")) == NULL) return [self errormsg: "Can't open file for writing"]; [self writeheader: fp]; for(i=0;i<rows*cols;i++) putc(data[i],fp); fclose(fp); return self; } - saveToTIFF:sender { NXStream *fStream; int fDesc; char fullPath[500]; NXImageInfo image; if(!path || !file) [self setPath: self]; strcpy(fullPath,path); strcat(fullPath,"/"); strcat(fullPath,name); strcat(fullPath,".tiff"); if((fDesc = open(fullPath,O_CREAT | O_TRUNC | O_WRONLY,0644)) == -1) return [self errormsg: "fDesc: Can't open fucking TIFF file for writing"]; if((fStream = NXOpenFile(fDesc,NX_WRITEONLY)) == NULL) return [self errormsg: "fStream: Can't open TIFF file for writing"]; image.width = cols; image.height = rows; image.bitsPerSample = bits_per_pixel; image.samplesPerPixel = 1; image.planarConfig = NX_MESHED; image.photoInterp = NX_MONOTONICMASK; NXWriteTIFF(fStream,&image,data); NXClose(fStream); close(fDesc); return self; } - saveAs:sender { return [[self setPath: self] save:self]; } - convolve: (id) mask { int i,j,mx,my,dx,dy,r,c,k; int mrows,mcols,msize; float min,max; float **d,**cd; [self update]; mrows = mcols = msize = [mask getsize]; d = [self getdata:&r :&c]; cd = (float **)malloc(r*c*sizeof(float *)); for(k=0;k<r;k++) cd[k] = (float *)malloc(c*sizeof(float)); max = -37267.0; min = 37267.0; for(i=0;i<r;i++) { for(j=0;j<c;j++) { cd[i][j] = 0.0; for(mx=0, dx=i-msize/2; mx<mrows; mx++, dx++) { for(my=0, dy=j-msize/2; my<mcols; my++, dy++) { if(dx >= 0 && dy >= 0 && dx < r && dy < c) cd[i][j] += [mask getval:mx :my]*d[dx][dy]; } } if(cd[i][j] > max) max = cd[i][j]; if(cd[i][j] < min) min = cd[i][j]; } } k=0; for(i=0;i<r;i++) { for(j=0;j<c;j++) { data[k] = (int)(255.0*(cd[i][j] - min)/(max - min)); k++; } } return self; } - invert { int i,j,k; [self update]; k=0; for(i=0;i<rows;i++) for(j=0;j<cols;j++) { data[k] = 255 - data[k]; k++; } return self; } - threshold:(int) l :(int) h { int i,j,k; [self update]; k=0; for(i=0;i<rows;i++) for(j=0;j<cols;j++) { if(data[k] >= l && data[k] <= h) data[k] = 255; else data[k] = 0; k++; } return self; } - update { int k; for(k=0; k<rows*cols; k++) udata[k] = data[k]; return self; } - setPath:sender { char tpath [500]; char tfile[500]; id savepanel; savepanel = [SavePanel new]; if([savepanel runModal]) { strcpy (tpath, [savepanel directory]); strcpy (tfile, strrchr([savepanel filename],'/')); file = (char *)malloc((strlen(tfile)+6)*sizeof(char)); strcpy(file,tfile); name = (char *)malloc((strlen(file)+1)*sizeof(char)); strcpy(name,file); path = (char *)malloc((strlen(tpath)+1)*sizeof(char)); strcpy(path,tpath); [hipsWindow setTitle: name]; } return self; } - (id) gethipsWindow { return(hipsWindow); } - (char *) getpath { char *p; p = (char *)malloc((strlen(path)+1)*sizeof(char)); strcpy(p,path); return p; } - (char *) getfile { char *f; f = (char *)malloc((strlen(file)+1)*sizeof(file)); strcpy(f,file); return f; } - (char *) getname { char *n; n = (char *)malloc((strlen(name)+1)*sizeof(name)); strcpy(n,name); return n; } - (char *) getorig_name { char *on; on = (char *)malloc((strlen(orig_name)+1)*sizeof(char)); strcpy(on,orig_name); return(on); } - (char *) getseq_name { char *sn; sn = (char *)malloc((strlen(seq_name)+1)*sizeof(char)); strcpy(sn,seq_name); return(sn); } - (int) getnum_frame { return(num_frame); } - (char *) getorig_date { char *od; od = (char *)malloc((strlen(orig_date)+1)*sizeof(char)); strcpy(od,orig_date); return(od); } - (int) getrows { return(rows); } - (int) getcols { return(cols); } - (int) getbits_per_pixel { return(bits_per_pixel); } - (int) getbit_packing { return(bit_packing); } - (int) getpixel_format { return(pixel_format); } - (char *) getseq_history { char *sh; sh = (char *)malloc((strlen(seq_history)+1)*sizeof(char)); strcpy(sh,seq_history); return(sh); } - (char *) getseq_desc { char *sd; sd = (char *)malloc((strlen(seq_desc)+1)*sizeof(char)); strcpy(sd,seq_desc); return(sd); } - (char *) getcdata { int i; char *d; d = (char *)malloc(rows*cols*sizeof(char)); for(i=0;i<rows*cols;i++) d[i] = data[i]; return(d); } - (int *) getdata { int i; int *d; d = (int *)malloc(rows*cols*sizeof(int)); for(i=0;i<rows*cols;i++) d[i] = data[i]; return(d); } - (float **) getdata: (int *)theRows :(int *)theCols { int k; float **fdata; *theRows = rows; *theCols = cols; fdata = (float **)malloc(rows*sizeof(float *)); for(k=0;k<rows;k++) fdata[k] = (float *)malloc(cols*sizeof(float)); for(k=0;k<rows*cols;k++) fdata[k/rows][k%cols] = (float)(data[k]); return fdata; } - free { [hipsWindow close]; free(orig_name); free(seq_name); free(orig_date); free(orig_name); free(seq_history); free(seq_desc); free(data); free(udata); free(odata); [super free]; return nil; } - errormsg: (char *)msg { NXRunAlertPanel("IMAGE",msg,NULL,NULL,NULL); return self; } @end char *read_line(FILE *fp,int *size) { int i=0, c; char buf[5000]; c = fgetc(fp); while( (c != '\n') && !feof(fp) && (i < 5000)) { buf[i++] = c; c = fgetc(fp); } if(!i) { buf[0] = ' '; buf[1] = '\0'; } else buf[i] = '\0'; if(feof(fp)) { NXRunAlertPanel("HIPS ERROR","EOF reached prematurely",NULL,NULL,NULL); } *size = strlen(buf); return(buf); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.