home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <libc.h>
- #include "../bmp.h"
- #include "../common.h"
- #include "save.h"
-
- static void saveBmpHeader(FILE *fp,
- commonInfo *cinf, int bits, int cnum, paltype *pal)
- {
- int i;
- unsigned char *p;
- int colors = 1 << bits;
- long iSize = ((((cinf->width * bits) + 31) >> 3) & ~3) * cinf->height;
- long hSize = (bits == 24)? 54 : (54 + colors * 4);
-
- putc('B', fp);
- putc('M', fp);
- put_long(iSize + hSize + 2, fp); /* File Size */
- put_long(0, fp); /* Reserved */
- put_long(hSize, fp);
- put_long(WIN3, fp);
- put_long((long)cinf->width, fp);
- put_long((long)cinf->height, fp);
- put_short(1, fp); /* plane */
- put_short(bits, fp);
- put_long(0, fp); /* compression */
- put_long(iSize, fp); /* image size */
- put_long(2834, fp); /* Pixels/Meter */
- put_long(2834, fp); /* 2834 = 72bpi */
- put_long(colors, fp); /* colors */
- put_long(colors, fp);
-
- if (bits != 24 && pal) {
- for (i = 0; i < cnum; i ++) {
- p = pal[i];
- putc(p[BLUE], fp);
- putc(p[GREEN], fp);
- putc(p[RED], fp);
- putc(0, fp);
- }
- for ( ; i < colors; i ++) {
- putc(255, fp);
- putc(255, fp);
- putc(255, fp); /* white */
- putc(0, fp);
- }
- }
- }
-
- int saveBmpbmap(FILE *fp, commonInfo *cinf,
- int cnum, paltype *pal, unsigned char **planes)
- {
- int x, y, r, g, b, a;
- int cnt, bits;
-
- bits = (cnum <= 2) ? 1 :((cnum <= 16) ? 4 : 8);
- if (pal) {
- saveBmpHeader(fp, cinf, bits, cnum, pal);
- for (y = cinf->height - 1; y >= 0; y--) {
- cnt = 0;
- resetPixel(planes, y);
- if (cnum <= 2) {
- int cc, mask;
- for (x = 0; x < cinf->width; x += 8, cnt++) {
- cc = 0;
- for (mask = 0x80; mask; mask >>= 1) {
- (void) getPixel(&r, &g, &b, &a);
- if (mapping(r, g, b))
- cc |= mask;
- }
- putc(cc, fp);
- }
- }else if (cnum <= 16) {
- int cc, dd;
- for (x = 0; x < cinf->width; x++, cnt++) {
- (void) getPixel(&r, &g, &b, &a);
- cc = (mapping(r, g, b) << 4) & 0xf0;
- if (++x >= cinf->width) dd = 0;
- else {
- (void) getPixel(&r, &g, &b, &a);
- dd = mapping(r, g, b) & 0x0f;
- }
- putc((cc|dd), fp);
- }
- }else { /* 8 bits */
- for (x = 0; x < cinf->width; x++, cnt++) {
- (void) getPixel(&r, &g, &b, &a);
- putc(mapping(r, g, b), fp);
- }
- }
- while (cnt & 0x03) {
- putc(0, fp);
- cnt++;
- }
- }
- }else { /* full color */
- saveBmpHeader(fp, cinf, 24, 0, NULL);
- for (y = cinf->height - 1; y >= 0; y--) {
- resetPixel(planes, y);
- for (x = 0; x < cinf->width; x++) {
- (void) getPixel(&r, &g, &b, &a);
- putc(b, fp);
- putc(g, fp);
- putc(r, fp);
- }
- for (x *= 3 ; x & 0x03; x++)
- putc(0, fp);
- }
- }
- putc(0, fp);
- putc(0, fp);
- return 0;
- }
-