home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Windows 3 BMP to extended sprite format bitmap converter *
- * *
- * Version 3.00 (02-Feb-1995) *
- * *
- * (C) 1993-5 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "io.h"
- #include "bmp.h"
- #include "sprite.h"
-
- int main(int argc, char** argv)
- {
- FILE *inf;
- FILE *outf;
- FILE *errf;
- int i;
- int x,y;
- uchar *bmp_buf;
- uchar p;
- uint rgb;
- int size;
- bmp_hdr_str bmp;
- spr_info_str spr;
- char string[256];
-
- file_args(argc, argv, &inf, &outf, &errf);
-
- read_struct(LE, (BYTE*)&bmp, bmp_rhdr_descr, inf);
-
-
- if(bmp.id[0]!='B' || bmp.id[1]!='M' || (bmp.subheader_size!=0x28 &&
- bmp.subheader_size!=12))
- {
- fprintf(errf, "BMP format not reqcognised\n");
- return(1);
- }
-
- if(bmp.subheader_size == 12)
- {
- bmp_shdr2_str sbmp;
-
- read_struct(LE, (BYTE*)&sbmp, bmp_shdr2_descr, inf);
-
- bmp.width = sbmp.width;
- bmp.height = sbmp.height;
- bmp.bit_planes = sbmp.bit_planes;
- bmp.bits_per_pixel = sbmp.bits_per_pixel;
-
- bmp.palette_entries = 1<<sbmp.bits_per_pixel;
- bmp.colours = 1<<sbmp.bits_per_pixel;
- bmp.compression = 0; /* ? */
- }
- else
- {
- read_struct(LE, (BYTE*)&bmp.width, bmp_shdr1_descr, inf);
- }
-
- if(bmp.bit_planes != 1)
- {
- fprintf(errf, "Only 1 bit plane images can be handled(%d)\n",
- bmp.bit_planes);
- return(2);
- }
-
- if(bmp.compression > 8)
- {
- fprintf(errf, "Only uncompressed images can be handled(%d)\n",
- bmp.compression);
- return(3);
- }
-
- spr.X = bmp.width;
- spr.Y = bmp.height;
- spr.Xasp = 1;
- spr.Yasp = 1;
- spr.bpp = bmp.bits_per_pixel;
-
- fill_info(&spr);
-
- /* read colour map */
-
- if(bmp.subheader_size == 12)
- {
- for(i=0; i<bmp.colours; i++)
- {
- spr.palette[i] = (fgetc(inf) << 24)
- | (fgetc(inf) << 16)
- | (fgetc(inf) << 8);
- }
- }
- else
- {
- for(i=0; i<bmp.colours; i++)
- {
- spr.palette[i] = endian(BE,fgetdLE(inf));
- }
- }
-
- /* skip additional info in header */
-
- for(i=(int)ftell(inf); i<bmp.bitmap_offset; i++)
- {
- p = fgetc(inf);
- }
-
- alloc_spr_data(&spr);
-
- size = spr.line_size;
-
- if((bmp_buf=(uchar*)malloc(size)) == 0)
- {
- fprintf(errf,"Unable to allocate bmp buffer\n");
- exit(5);
- }
-
- sprintf(string,"Generating sprite %dx%dx%d:",spr.X,spr.Y,spr.bpp);
- progress_start(string);
-
- for(y=spr.Y-1; y>=0; y--)
- {
- fread(bmp_buf, size, 1, inf);
-
- if(spr.bpp != 24)
- {
- for(x=0; x<spr.line_size; x++)
- {
- p = bmp_buf[x];
-
- switch(spr.bpp)
- {
- case 1:
- spr.spr_data[x+y*spr.line_size] = bit_swap(p);
- break;
-
- case 2:
- spr.spr_data[x+y*spr.line_size] = bit2_swap(p);
- break;
-
- case 4:
- spr.spr_data[x+y*spr.line_size] = bit4_swap(p);
- break;
-
- case 8:
- spr.spr_data[x+y*spr.line_size] = p;
- break;
-
- }
- }
- }
- else
- {
- for(x=0; x<spr.X; x++)
- {
- rgb = (bmp_buf[x*3+0] << 24) |
- (bmp_buf[x*3+1] << 16) |
- (bmp_buf[x*3+2] << 8);
-
- write_pixel_val(&spr, x, y, rgb);
- }
- }
- progress(spr.Y-y-1,spr.Y);
- }
-
- write_sprite(&spr, outf);
-
- progress_finish();
- }
-