home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * clr2spr.c *
- * *
- * clear bitmap to extened sprite format *
- * *
- * Version 2.10 (15-Jul-1994) *
- * *
- * (C) 1993 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "io.h"
- #include "sprite.h"
- #include "clear.h"
-
-
- int main(int argc, char** argv)
- {
- FILE *inf, *outf, *errf;
- int i,x,y;
- int line_size;
- int shift;
- uint rgb, r,g,b;
- uchar *clr_buf;
- spr_info_str spr;
- clear_hdr hdr;
- char string[256];
-
- file_args(argc, argv, &inf, &outf, &errf);
-
- /* read creator string */
-
- while(fgetc(inf) > 0);
-
- read_struct(LE, (BYTE*)&hdr, clear_hdr_descr, inf);
-
- if(hdr.width==0 || hdr.height==0 || hdr.bpp==0 || hdr.bpp>24)
- {
- fprintf(errf,"Corrupt or possibly not a clear file\n");
- return(1);
- }
-
- spr.X = hdr.width;
- spr.Y = hdr.height;
- spr.Xasp = 1;
- spr.Yasp = 1;
-
- switch(hdr.bpp)
- {
- case 1: spr.bpp = 1; break;
- case 2: spr.bpp = 2; break;
- case 3: spr.bpp = 4; break;
- case 4: spr.bpp = 4; break;
- case 5: spr.bpp = 8; break;
- case 6: spr.bpp = 8; break;
- case 7: spr.bpp = 8; break;
- case 8: spr.bpp = 8; break;
- default:
- /*
- * for bpp >8 & <24 round down from 9,12,15,18,21,24
- */
- if(hdr.bpp>8 && hdr.bpp<=16)
- {
- spr.bpp = 15;
- }
- if(hdr.bpp > 16)
- {
- spr.bpp = 24;
- }
- break;
- }
-
- fill_info(&spr);
-
- if(hdr.bpp <= 8)
- {
- spr.has_palette = (1<<hdr.bpp);
-
- for(i=0; i<spr.has_palette; i++)
- {
- r = fgetc(inf);
- g = fgetc(inf);
- b = fgetc(inf);
-
- spr.palette[i] = (b<<24) + (g<<16) + (r<<8);
- }
- }
-
- alloc_spr_data(&spr);
-
- line_size = (hdr.bpp<=8) ? hdr.width : hdr.width*3;
-
- if((clr_buf = (uchar*)malloc(line_size)) == 0)
- {
- fprintf(errf,"Unable to allocate clear buffer\n");
- exit(1);
- }
-
- sprintf(string,"Generating sprite %dx%dx%d:",spr.X,spr.Y,spr.bpp);
- progress_start(string);
-
- shift = hdr.bpp/3;
-
- for(y=0; y<spr.Y; y++)
- {
- fread(clr_buf, line_size, 1, inf);
-
- for(x=0; x<spr.X; x++)
- {
- if(hdr.bpp <= 8)
- {
- write_pixel_val(&spr, x, y, clr_buf[x]);
- }
- else
- {
- r = clr_buf[x*3+0];
- g = clr_buf[x*3+1];
- b = clr_buf[x*3+2];
-
- r |= (r >> shift);
- g |= (g >> shift);
- b |= (b >> shift);
-
- if(hdr.bpp <= 16)
- {
- rgb = ((b & 0xF8) << 7) |
- ((g & 0xF8) << 2) |
- ((r & 0xF8) >> 3);
- }
- else
- {
- rgb = (b << 24) | (g << 16) | (r << 8);
- }
-
- write_pixel_val(&spr, x, y, rgb);
- }
- }
- progress(y,spr.Y);
- }
-
- write_sprite(&spr,outf);
-
-
- progress_finish();
- }
-