This is RLE.m in view mode; [Download] [Up]
#import "RLE.h" #import <stdio.h> #import <stdlib.h> #import <string.h> #import <libc.h> #import <zone.h> #import <mach.h> #import <appkit/Window.h> #import <appkit/Panel.h> #import <appkit/tiff.h> // RLE.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 // @implementation RLE:Image - init { self = [super init]; strncpy(windowIconName,"rle.icon.tiff",14); return(self); } - open:(char *)filename { int i,j,row_pos; rle_pixel **scan; thisview = self; rmap = 0; strncpy(fileName,filename,1024); rle_file_hdr.rle_file = rle_open_f_noexit("RLEViewer", fileName, "rb"); if (rle_file_hdr.rle_file == NULL) { NXRunAlertPanel("RLE ERROR", "Can't open %s", NULL, NULL, NULL, fileName); return(self); } //Read in the header from the RLE file if(rle_get_setup(&rle_file_hdr) != RLE_SUCCESS){ NXRunAlertPanel("RLE ERROR", "%s Not an RLE file ", NULL, NULL, NULL, fileName); return(self); } xsize = rle_file_hdr.xmax - rle_file_hdr.xmin + 1; ysize = rle_file_hdr.ymax - rle_file_hdr.ymin + 1; rle_file_hdr.xmax -= rle_file_hdr.xmin; rle_file_hdr.xmin = 0; numColors = rle_file_hdr.ncolors; if (rle_file_hdr.alpha && (numColors == 3)) numColors++; if (rle_row_alloc(&rle_file_hdr,&scan) < 0){ NXRunAlertPanel("RLE ERROR", "%s Malloc Error ", NULL, NULL, NULL, fileName); return(self); } r = (unsigned char *)NXZoneMalloc(newZone,ysize*xsize*(sizeof(unsigned char))); g = (unsigned char *)NXZoneMalloc(newZone,ysize*xsize*(sizeof(unsigned char))); b = (unsigned char *)NXZoneMalloc(newZone,ysize*xsize*(sizeof(unsigned char))); // Read each scan line into memory ready for displaying. if (numColors == 1){ for (i = ysize; i > 0; i--) { rle_getrow(&rle_file_hdr, scan); j = i*xsize; row_pos = 0; while(j <= (i*xsize)+xsize){ // Copy each scanline into a temp r[j]=scan[0][row_pos]; // dataspace g[j]=scan[0][row_pos]; b[j]=scan[0][row_pos]; j++; row_pos++; } } } if (numColors == 3){ for (i = ysize; i > 0; i--) { rle_getrow(&rle_file_hdr, scan); j = i*xsize; row_pos = 0; while(j <= (i*xsize)+xsize){ // Copy each scanline into a temp r[j]=scan[0][row_pos]; // dataspace g[j]=scan[1][row_pos]; b[j]=scan[2][row_pos]; j++; row_pos++; } } } if (numColors == 4){ a = (unsigned char *)NXZoneMalloc(newZone,ysize*xsize*(sizeof(unsigned char))); for (i = ysize; i > 0; i--) { rle_getrow(&rle_file_hdr, scan); j = i*xsize; row_pos = 0; while(j <= (i*xsize)+xsize){ // Copy each scanline into a temp r[j]=scan[0] [row_pos]; // dataspace g[j]=scan[1] [row_pos]; b[j]=scan[2] [row_pos]; a[j]=scan[-1][row_pos]; j++; row_pos++; } } } // Program WILL DIE if you have a file with a valid rle header but // nothing for it to read, it will read the NOTHING in but when you // try to render it, the program will die. rle_row_free(&rle_file_hdr,scan); fclose(rle_file_hdr.rle_file); [self displayImage]; return(self); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.