home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Archimedes sprite to StarBase format bitmap converter *
- * *
- * Uses new sprite/io library routines *
- * *
- * Version 5.00 (23-Aug-1993) *
- * *
- * (C) 1989/1992/1993 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "io.h"
- #include "sprite.h"
- #include "sb.h"
-
-
- int main(int argc, char **argv)
- {
- FILE *inf, *outf, *errf;
- int i,j,x,y,Y;
- uint r,g,b,p;
- uint *ptr;
- uchar *sb_buf;
- uchar *buf_ptr;
- spr_info_str spr;
- bf_header hdr;
- float cmap[256][3];
- char string[256];
-
- file_args(argc, argv, &inf, &outf, &errf);
-
- read_sprite(&spr, inf);
-
- if(spr.bpp > 8)
- {
- fprintf(errf,"Only images with <= 8 BPP can be converted\n");
- return(1);
- }
-
- for(i=0; i<spr.cols; i++)
- {
- r = (spr.palette[i] >> 8) & 0xFF;
- g = (spr.palette[i] >> 16) & 0xFF;
- b = (spr.palette[i] >> 24) & 0xFF;
-
- cmap[i][0] = (float)r / (float)255.0;
- cmap[i][1] = (float)g / (float)255.0;
- cmap[i][2] = (float)b / (float)255.0;
-
- for(j=0; j<3; j++)
- {
- ptr = (uint*)&cmap[i][j];
- *ptr = endian(BE,*ptr);
- }
- }
-
- /* account for square/reqtangular pixels */
-
- if(spr.Yasp == 2)
- Y = spr.Y*2;
- else
- Y = spr.Y;
-
- if((sb_buf = (uchar*)malloc(spr.X+4*8)) == 0) /* + wastage */
- {
- fprintf(errf,"Unable to allocate sb buffer\n");
- exit(1);
- }
-
- strcpy(hdr.file_id, "Bitmapfile");
- strcpy(hdr.device_id, "spr2sb");
- hdr.rev = 1;
- hdr.bm_loc = spr.cols*4*3+sizeof(bf_header);
- hdr.eod_loc = hdr.bm_loc + spr.X*Y;
- hdr.xstart = 0;
- hdr.ystart = 0;
- hdr.xlen = spr.X;
- hdr.ylen = Y;
- hdr.bm_mode = -1;
- hdr.depth = spr.bpp;
- hdr.pixel_align = 8;
- hdr.num_banks = 1;
- hdr.disp_en = 255;
- hdr.cmap_mode = 0;
- hdr.csize = spr.cols;
- hdr.back_index = 0;
-
- write_struct(BE, (BYTE*)&hdr, bf_header_descr, outf);
- fwrite(cmap, sizeof(float)*3, spr.cols, outf);
-
- sprintf(string,"Generating bitmap %dx%dx%d:",spr.X,Y,hdr.depth);
- progress_start(string);
-
- for(y=0; y<Y; y+=spr.Yasp)
- {
- buf_ptr = sb_buf;
-
- for(x=0; x<spr.line_size; x++)
- {
- p = spr.spr_data[x+(y/spr.Yasp)*spr.line_size];
-
- switch(spr.bpp)
- {
- case 1:
- buf_ptr[0] = p & 1;
- buf_ptr[1] = (p>>1) & 1;
- buf_ptr[2] = (p>>2) & 1;
- buf_ptr[3] = (p>>3) & 1;
- buf_ptr[4] = (p>>4) & 1;
- buf_ptr[5] = (p>>5) & 1;
- buf_ptr[6] = (p>>6) & 1;
- buf_ptr[7] = (p>>7) & 1;
- buf_ptr += 8;
- break;
- case 2:
- buf_ptr[0] = p & 3;
- buf_ptr[1] = (p>>2) & 3;
- buf_ptr[2] = (p>>4) & 3;
- buf_ptr[3] = (p>>6) & 3;
- buf_ptr += 4;
- break;
- case 4:
- buf_ptr[0] = p & 0xF;
- buf_ptr[1] = p >> 4;
- buf_ptr += 2;
- break;
- case 8:
- *buf_ptr++ = p;
- break;
- }
- }
- fwrite(sb_buf, spr.X, 1, outf);
- if(spr.Yasp==2)
- fwrite(sb_buf, spr.X, 1, outf);
-
- progress(y,Y);
- }
-
- progress_finish();
- }
-