This is ImageSvXBM.m in view mode; [Download] [Up]
#import "../ImageSave.h" #import <appkit/NXImage.h> #import <appkit/SavePanel.h> #import <stdio.h> #import <libc.h> #import <string.h> #import "../ToyView.h" #import "../ToyWin.h" #import "../strfunc.h" #import "../common.h" #import "save.h" @implementation ImageSave (SaveXBM) static unsigned char flipbits[256]; static void init_table(NXColorSpace cspace) { int i, n, nr, m; static NXColorSpace svCSpace; if (flipbits[1]) { /* flipbits was initialized */ if (svCSpace != cspace) for (i = 0; i < 256; i++) flipbits[i] ^= 0xff; }else { for (n = nr = 0; ; n++) { flipbits[n] = nr; if (n >= 255) break; for (i = 1; nr & (m = 0x100 >> i); i++) ; nr = (nr & (0xff >> i)) | m; } if (cspace == NX_OneIsWhiteColorSpace) for (i = 0; i < 256; i++) flipbits[i] ^= 0xff; } svCSpace = cspace; } static char *getNickname(const char *sav) { int i, j, cc, slash, period; char buf[256], *nick; period = slash = 0; for (i = 0; sav[i]; i++) { if (sav[i] == '/') slash = i + 1; else if (sav[i] == '.') period = i; } strcpy(buf, &sav[slash]); if (period > slash) buf[period - slash] = 0; nick = (char *)malloc(strlen(buf) + 2); j = 0; if (buf[0] >= '0' && buf[0] <= '9') nick[j++] = 'x'; for (i = 0; (cc = buf[i]) != 0; i++) if ((cc >= 'a' && cc <= 'z') || (cc >= 'A' && cc <= 'Z') || (cc >= '0' && cc <= '9')) nick[j++] = cc; if (j == 0) nick[j++] = 'x'; nick[j] = 0; return nick; } - saveAsXBM: sender { FILE *fp; char *sav, *nickname = NULL; commonInfo *cinf; unsigned char *map[MAXPLANE]; int x, y, xb, xbytes, cnt, err; unsigned char *pp, *pmap = NULL; cinf = [toyView commonInfo]; if (cinf->bits > 2 || cinf->numcolors != 1 || cinf->cspace == NX_CMYKColorSpace) { /* ignore alpha, ignore 2 bits gray. Because of EPS... */ warnAlert([toyWin filename], Err_SAV_IMPL); return self; } sav = [self getSavename:[toyWin filename] with: Type_xbm]; if (sav == NULL) /* canceled */ return self; if ((fp = fopen(sav, "w")) == NULL) { errAlert(sav, Err_SAVE); return self; } if ((err = [toyWin getBitmap:map info: &cinf]) != 0) goto EXIT; xbytes = xb = (cinf->width + 7) >> 3; if (cinf->alpha || cinf->bits != 1) { if ((err = initGetPixel(cinf)) != 0) goto EXIT; resetPixel(map, 0); pmap = pp = allocBilevelMap(cinf); if (!pp) { err = Err_MEMORY; goto EXIT; } init_table(NX_OneIsBlackColorSpace); }else { init_table(cinf->cspace); pp = map[0]; xbytes = cinf->xbytes; } cnt = 0; nickname = getNickname(sav); fprintf(fp, "#define %s_width %d\n", nickname, cinf->width); fprintf(fp, "#define %s_height %d\n", nickname, cinf->height); fprintf(fp, "static char %s_bits[] = {\n ", nickname); for (y = 1; y < cinf->height; y++) { for (x = 0; x < xb; x++) { fprintf(fp, "0x%02x,", flipbits[*pp++]); if (++cnt >= 10) { fprintf(fp, "\n "); cnt = 0; } } for ( ; x < xbytes; x++) ++pp; } for (x = 0; ; ) { fprintf(fp, "0x%02x", flipbits[*pp++]); if (++x >= xb) break; putc(',', fp); if (++cnt >= 10) { fprintf(fp, "\n "); cnt = 0; } } fprintf(fp, "};\n"); EXIT: if (fp) (void)fclose(fp); if (err) { errAlert(sav, err); (void)unlink(sav); }else [toyWin resetFilename:sav]; if (nickname) free((void *)nickname); if (pmap) free((void *)pmap); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.