home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Archimedes sprite to xwd format bitmap converter *
- * *
- * Version 1.50 (23-Aug-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, *outf, *errf;
- int i,x,y,Y;
- uchar *xwd_buf;
- uchar p;
- spr_info_str spr;
- xwd_header hdr;
- xwd_colour xcol[256];
- 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);
- }
-
- /* account for square/reqtangular pixels */
-
- if(spr.Yasp == 2)
- Y = spr.Y*2;
- else
- Y = spr.Y;
-
- if((xwd_buf = (uchar*)malloc(spr.line_size)) == 0)
- {
- fprintf(errf,"Unable to allocate xwd buffer\n");
- exit(1);
- }
-
- hdr.header_size = sizeof(xwd_header);
- hdr.file_version = 7;
- hdr.pixmap_format = 2;
- hdr.pixmap_depth = spr.pix;
- hdr.pixmap_width = spr.X;
- hdr.pixmap_height = Y;
- hdr.bits_per_pixel = spr.bpp;
- hdr.xoffset = 0;
- hdr.byte_order = 1;
- hdr.bitmap_bit_order = 1;
- hdr.bitmap_unit = spr.bpp==4 ? 8:32;
- hdr.bytes_per_line = spr.line_size;
- hdr.bitmap_pad = 32;
- hdr.visual_class = 3;
- hdr.red_mask = 0;
- hdr.green_mask = 0;
- hdr.blue_mask = 0;
- hdr.bits_per_rgb = spr.bpp;
- hdr.colourmap_entries = spr.cols;
- hdr.ncolours = spr.cols;
- hdr.window_width = spr.X;
- hdr.window_height = Y;
- hdr.window_x = 0;
- hdr.window_y = 0;
- hdr.window_bdrwidth = 0;
-
- write_struct(BE, (BYTE*)&hdr, xwd_header_descr, outf);
-
- sprintf(string,"Generating XWD %dx%dx%d:",spr.X,Y,hdr.bits_per_pixel);
- progress_start(string);
-
- for(i=0; i<spr.cols; i++)
- {
- xcol[i].pixel = i;
- xcol[i].red = ((spr.palette[i] & 0x0000FF00) >> 8) * 0x0101;
- xcol[i].green = ((spr.palette[i] & 0x00FF0000) >> 16) * 0x0101;
- xcol[i].blue = ((spr.palette[i] & 0xFF000000) >> 24) * 0x0101;
- xcol[i].flags = 0x07;
- write_struct(BE, (BYTE*)&xcol[i], xwd_colour_descr, outf);
- }
-
- for(y=0; y<Y; y+=spr.Yasp)
- {
- for(x=0; x<spr.line_size; x++)
- {
- p = spr.spr_data[x+(y/spr.Yasp)*spr.line_size];
-
- switch(spr.bpp)
- {
- case 1:
- xwd_buf[x] = bit_swap(p);
- break;
-
- case 2:
- xwd_buf[x] = bit2_swap(p);
- break;
-
- case 4:
- xwd_buf[x] = bit4_swap(p);
- break;
-
- case 8:
- xwd_buf[x] = p;
- break;
- }
- }
-
- /* write one or two lines depending on Y aspect */
-
- fwrite(xwd_buf, spr.line_size, 1, outf);
-
- if(spr.Yasp == 2)
- fwrite(xwd_buf, spr.line_size, 1, outf);
-
- progress(y,Y);
- }
-
- progress_finish();
- }
-