home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * xwd to extended sprite format bitmap converter *
- * *
- * Reads stdio, outputs to out, with progress indication on err *
- * Uses new sprite library routines *
- * Handles different bit and byte orders *
- * *
- * Version 1.60 (18-Nov-1993) *
- * *
- * (C) 1993 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "io.h"
- #include "sprite.h"
- #include "xwd.h"
-
- int main(int argc, char** argv)
- {
- FILE *inf;
- FILE *outf;
- FILE *errf;
- int i;
- char c;
- int x,y;
- int line_off;
- uchar *xwd_buf;
- uchar p;
- int order;
- xwd_header hdr;
- xwd_colour xcol;
- spr_info_str spr;
- char string[256];
-
- file_args(argc, argv, &inf, &outf, &errf);
-
- read_struct(BE, (BYTE*)&hdr, xwd_header_descr, inf);
-
-
- if(hdr.file_version!=7 && hdr.pixmap_format!=2)
- {
- fprintf(errf, "Version and format not reqcognised (%d %d)\n",
- hdr.file_version, hdr.pixmap_format);
- return(1);
- }
-
- if(hdr.pixmap_depth != hdr.bits_per_pixel)
- {
- fprintf(errf, "Depth && BPP not equal (%d %d)\n",
- hdr.pixmap_depth, hdr.bits_per_pixel);
- return(2);
- }
-
- if(hdr.bits_per_pixel > 8)
- {
- fprintf(errf, "Only images with <= 8 BPP can be handled\n");
- return(3);
- }
-
- if(hdr.byte_order==1)
- order = BIG_ENDIAN;
- else
- order = LITTLE_ENDIAN;
-
- spr.X = hdr.window_width;
- spr.Y = hdr.window_height;
- spr.Xasp = 1;
- spr.Yasp = 1;
- spr.bpp = hdr.bits_per_pixel;
-
- fill_info(&spr);
-
- /* skip additional info in header */
-
- for(i=sizeof(xwd_header); i<hdr.header_size; i++)
- c = fgetc(inf);
-
- /* read colour map */
-
- for(i=0; i<hdr.ncolours; i++)
- {
- read_struct(BE, (BYTE*)&xcol, xwd_colour_descr, inf);
-
- /* colour map components are 16 bit */
-
- spr.palette[i] = ((xcol.blue & 0xFF00) << 16) |
- ((xcol.green & 0xFF00) << 8) |
- (xcol.red & 0xFF00);
- }
-
- alloc_spr_data(&spr);
-
- if((xwd_buf=(uchar*)malloc(hdr.bytes_per_line)) == 0)
- {
- fprintf(errf,"Unable to allocate xwd buffer\n");
- exit(5);
- }
-
- sprintf(string,"Generating sprite %dx%dx%d:",spr.X,spr.Y,spr.bpp);
- progress_start(string);
-
- for(y=0; y<spr.Y; y++)
- {
- fread(xwd_buf, hdr.bytes_per_line, 1, inf);
-
- line_off = y*spr.line_size;
-
- for(x=0; x<spr.line_size; x++)
- {
- p = xwd_buf[x];
-
- if(hdr.bitmap_bit_order==1)
- {
- switch(spr.bpp)
- {
- case 1:
- spr.spr_data[x+line_off] = bit_swap(p);
- break;
-
- case 2:
- spr.spr_data[x+line_off] = bit2_swap(p);
- break;
-
- case 4:
- spr.spr_data[x+line_off] = bit4_swap(p);
- break;
-
- case 8:
- spr.spr_data[x+line_off] = p;
- break;
- }
- }
- else
- {
- spr.spr_data[x+line_off] = p;
- }
- }
- progress(y,spr.Y);
- }
- write_sprite(&spr, outf);
-
- progress_finish();
- }
-