home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / Graphics / ToyViewer-2.6a / src / ImageSave.bproj / ImageSvXBM.m < prev    next >
Encoding:
Text File  |  1996-12-03  |  3.2 KB  |  148 lines

  1. #import "../ImageSave.h"
  2. #import <appkit/NXImage.h>
  3. #import <appkit/SavePanel.h>
  4. #import <stdio.h>
  5. #import <libc.h>
  6. #import <string.h>
  7. #import "../ToyView.h"
  8. #import "../ToyWin.h"
  9. #import "../strfunc.h"
  10. #import "../common.h"
  11. #import "save.h"
  12.  
  13. @implementation ImageSave (SaveXBM)
  14.  
  15. static unsigned char flipbits[256];
  16.  
  17. static void init_table(NXColorSpace cspace)
  18. {
  19.     int i, n, nr, m;
  20.     static NXColorSpace svCSpace;
  21.  
  22.     if (flipbits[1]) { /* flipbits was initialized */
  23.         if (svCSpace != cspace)
  24.         for (i = 0; i < 256; i++)
  25.             flipbits[i] ^= 0xff;
  26.     }else {
  27.         for (n = nr = 0; ; n++) {
  28.             flipbits[n] = nr;
  29.             if (n >= 255) break;
  30.             for (i = 1; nr & (m = 0x100 >> i); i++)
  31.                 ;
  32.             nr = (nr & (0xff >> i)) | m;
  33.         }
  34.         if (cspace == NX_OneIsWhiteColorSpace)
  35.             for (i = 0; i < 256; i++)
  36.                 flipbits[i] ^= 0xff;
  37.     }
  38.     svCSpace = cspace;
  39. }
  40.  
  41. static char *getNickname(const char *sav)
  42. {
  43.     int i, j, cc, slash, period;
  44.     char buf[256], *nick;
  45.  
  46.     period = slash = 0;
  47.     for (i = 0; sav[i]; i++) {
  48.         if (sav[i] == '/') slash = i + 1;
  49.         else if (sav[i] == '.') period = i;
  50.     }
  51.     strcpy(buf, &sav[slash]);
  52.     if (period > slash) buf[period - slash] = 0;
  53.     nick = (char *)malloc(strlen(buf) + 2);
  54.     j = 0;
  55.     if (buf[0] >= '0' && buf[0] <= '9')
  56.         nick[j++] = 'x';
  57.     for (i = 0; (cc = buf[i]) != 0; i++)
  58.         if ((cc >= 'a' && cc <= 'z')
  59.         || (cc >= 'A' && cc <= 'Z') || (cc >= '0' && cc <= '9'))
  60.             nick[j++] = cc;
  61.     if (j == 0) nick[j++] = 'x';
  62.     nick[j] = 0;
  63.     return nick;
  64. }
  65.  
  66. - saveAsXBM: sender
  67. {
  68.     FILE    *fp;
  69.     char    *sav, *nickname = NULL;
  70.     commonInfo *cinf;
  71.     unsigned char *map[MAXPLANE];
  72.     int    x, y, xb, xbytes, cnt, err;
  73.     unsigned char *pp, *pmap = NULL;
  74.  
  75.     cinf = [toyView commonInfo];
  76.     if (cinf->bits > 2 || cinf->numcolors != 1
  77.             || cinf->cspace == NX_CMYKColorSpace) {
  78.         /* ignore alpha, ignore 2 bits gray. Because of EPS... */
  79.         warnAlert([toyWin filename], Err_SAV_IMPL);
  80.         return self;
  81.     }
  82.     sav = [self getSavename:[toyWin filename] with: Type_xbm];
  83.     if (sav == NULL) /* canceled */
  84.         return self;
  85.     if ((fp = fopen(sav, "w")) == NULL) {
  86.         errAlert(sav, Err_SAVE);
  87.         return self;
  88.     }
  89.     if ((err = [toyWin getBitmap:map info: &cinf]) != 0)
  90.         goto EXIT;
  91.  
  92.     xbytes = xb = (cinf->width + 7) >> 3;
  93.     if (cinf->alpha || cinf->bits != 1) {
  94.         if ((err = initGetPixel(cinf)) != 0)
  95.             goto EXIT;
  96.         resetPixel(map, 0);
  97.         pmap = pp = allocBilevelMap(cinf);
  98.         if (!pp) {
  99.             err = Err_MEMORY;
  100.             goto EXIT;
  101.         }
  102.         init_table(NX_OneIsBlackColorSpace);
  103.     }else {
  104.         init_table(cinf->cspace);
  105.         pp = map[0];
  106.         xbytes = cinf->xbytes;
  107.     }
  108.  
  109.     cnt = 0;
  110.     nickname = getNickname(sav);
  111.     fprintf(fp, "#define %s_width  %d\n", nickname, cinf->width);
  112.     fprintf(fp, "#define %s_height %d\n", nickname, cinf->height);
  113.     fprintf(fp, "static char %s_bits[] = {\n ", nickname);
  114.     for (y = 1; y < cinf->height; y++) {
  115.         for (x = 0; x < xb; x++) {
  116.             fprintf(fp, "0x%02x,", flipbits[*pp++]);
  117.             if (++cnt >= 10) {
  118.                 fprintf(fp, "\n ");
  119.                 cnt = 0;
  120.             }
  121.         }
  122.         for ( ; x < xbytes; x++) ++pp;
  123.     }
  124.     for (x = 0; ; ) {
  125.         fprintf(fp, "0x%02x", flipbits[*pp++]);
  126.         if (++x >= xb) break;
  127.         putc(',', fp);
  128.         if (++cnt >= 10) {
  129.             fprintf(fp, "\n ");
  130.             cnt = 0;
  131.         }
  132.     }
  133.     fprintf(fp, "};\n");
  134.  
  135. EXIT:
  136.     if (fp) (void)fclose(fp);
  137.     if (err) {
  138.         errAlert(sav, err);
  139.         (void)unlink(sav);
  140.     }else
  141.         [toyWin resetFilename:sav];
  142.     if (nickname) free((void *)nickname);
  143.     if (pmap) free((void *)pmap);
  144.     return self;
  145. }
  146.  
  147. @end
  148.