home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Viewers / aa_m68k_Intel_Only / ToyViewer1.2 / Source / bmpsave.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-12  |  2.2 KB  |  102 lines

  1. #include <stdio.h>
  2. #include <libc.h>
  3. #include "bmp.h"
  4. #include "save.h"
  5.  
  6. static void saveBmpHeader(FILE *fp, commonInfo *cinf, int bits, paltype *pal)
  7. {
  8.     int i;
  9.     unsigned char *p;
  10.     int colors = 1 << bits;
  11.  
  12.     putc('B', fp);
  13.     putc('M', fp);
  14.     put_long(0, fp);    /* Hot Spot */
  15.     put_long(0, fp);
  16.     put_long((bits == 24)? 54 : (54 + colors * 4), fp);
  17.     put_long(WIN3, fp);
  18.     put_long((long)cinf->width, fp);
  19.     put_long((long)cinf->height, fp);
  20.     put_short(1, fp);    /* plane */
  21.     put_short(bits, fp);
  22.     put_long(0, fp);    /* compression */
  23.     put_long(0, fp);
  24.     put_long(0, fp);    /* Pixels/Meter */
  25.     put_long(0, fp);
  26.     put_long(colors, fp);    /* colors */
  27.     put_long(colors, fp);
  28.  
  29.     if (bits != 24) {
  30.         for (i = 0; i < colors; i ++) {
  31.             p = pal[i];
  32.             putc(p[BLUE], fp);
  33.             putc(p[GREEN], fp);
  34.             putc(p[RED], fp);
  35.             putc(0, fp);
  36.         }
  37.     }
  38. }
  39.  
  40. int saveBmpbmap(FILE *fp, commonInfo *cinf,
  41.         int cnum, paltype *pal, unsigned char **planes)
  42. {
  43.     int    x, y, r, g, b;
  44.     int    cnt, bits;
  45.  
  46.     bits = (cnum <= 2) ? 1 :((cnum <= 16) ? 4 : 8);
  47.     if (pal) {
  48.         saveBmpHeader(fp, cinf, bits, pal);
  49.         for (y = cinf->height - 1; y >= 0; y--) {
  50.             cnt = 0;
  51.             resetPixel(planes, y);
  52.             if (cnum <= 2) {
  53.             int cc, mask;
  54.             for (x = 0; x < cinf->width; x += 8, cnt++) {
  55.                 cc = 0;
  56.                 for (mask = 0x80; mask; mask >>= 1) {
  57.                     (void) getPixel(&r, &g, &b);
  58.                     if (mapping(r, g, b))
  59.                         cc |= mask;
  60.                 }
  61.                 putc(cc, fp);
  62.             }
  63.             }else if (cnum <= 16) {
  64.             int cc, dd;
  65.             for (x = 0; x < cinf->width; x++, cnt++) {
  66.                 (void) getPixel(&r, &g, &b);
  67.                 cc = (mapping(r, g, b) << 4) & 0xf0;
  68.                 if (++x >= cinf->width) dd = 0;
  69.                 else {
  70.                     (void) getPixel(&r, &g, &b);
  71.                     dd = mapping(r, g, b) & 0x0f;
  72.                 }
  73.                 putc((cc|dd), fp);
  74.             }
  75.             }else { /* 8 bits */
  76.             for (x = 0; x < cinf->width; x++, cnt++) {
  77.                 (void) getPixel(&r, &g, &b);
  78.                 putc(mapping(r, g, b), fp);
  79.             }
  80.             }
  81.             while (cnt & 0x03) {
  82.             putc(0, fp);
  83.             cnt++;
  84.             }
  85.         }
  86.     }else { /* full color */
  87.         saveBmpHeader(fp, cinf, 24, pal);
  88.         for (y = cinf->height - 1; y >= 0; y--) {
  89.             resetPixel(planes, y);
  90.             for (x = 0; x < cinf->width; x++) {
  91.                 (void) getPixel(&r, &g, &b);
  92.                 putc(b, fp);
  93.                 putc(g, fp);
  94.                 putc(r, fp);
  95.             }
  96.             for (x *= 3 ; x & 0x03; x++)
  97.                 (void) getc(fp);
  98.         }
  99.     }
  100.     return 0;
  101. }
  102.