home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * spr3spr.c *
- * *
- * Converts between extended sprite format and *
- * three 8 bit red/green/blue plane sprites in a file *
- * *
- * Version 1.10 (15-Jul-1994) *
- * *
- * (C) 1993/4 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "io.h"
- #include "sprite.h"
-
-
- int main(int argc, char **argv)
- {
- FILE *inf, *outf, *errf;
- int i, j, x, y;
- int red_i, green_i, blue_i, in_i, out_i;
- int pal_size, spr_size;
- uint r, g, b, rgb;
- uint words[2];
- char name[3][12];
- spr_info_str spr[4];
- spritefile sprite;
- char string[256];
-
- file_args(argc, argv, &inf, &outf, &errf);
-
- /* read first sprite from file */
-
- read_struct(LE, (BYTE*)&sprite, spritefile_descr, inf);
-
- if(sprite.offset != 16)
- {
- fprintf(stderr,"Error: bad sprite header offset (corrupt or not a sprite?)\n");
- exit(1);
- }
-
- mode_info(&spr[0], &sprite);
- read_palette(&spr[0], sprite.sprite-44, inf);
-
- if(sprite.number == 3)
- {
- /*
- * if three sprites in file
- * read data from the first one
- * and then read the other two
- */
-
- memcpy(name[0], sprite.name, 12);
- alloc_spr_data(&spr[0]);
- fread(spr[0].spr_data, spr[0].line_size, spr[0].Y, inf);
-
- for(i=1; i<3; i++)
- {
- /* WARNING ignoring possible gap between sprites */
-
- read_struct(LE, (BYTE*)&sprite.next,
- &spritefile_descr[3], inf);
- mode_info(&spr[i], &sprite);
- read_palette(&spr[i], sprite.sprite-44, inf);
- memcpy(name[i], sprite.name, 12);
- alloc_spr_data(&spr[i]);
- fread(spr[i].spr_data,spr[i].line_size,spr[i].Y,inf);
- }
-
- /* get indexes of red green and blue sprites */
-
- red_i = 0;
- green_i = 1;
- blue_i = 2;
- out_i = 3;
-
- for(i=0; i<3; i++)
- {
- if(strncmp(name[i],"red", 12)==0) red_i =i;
- if(strncmp(name[i],"green",12)==0) green_i=i;
- if(strncmp(name[i],"blue", 12)==0) blue_i =i;
- }
-
- /*
- * make details of extended sprite
- * and allocate line buffer only for memory conservation
- */
-
- spr[out_i].X = spr[0].X;
- spr[out_i].Y = spr[0].Y;
- spr[out_i].Xasp = spr[0].Xasp;
- spr[out_i].Yasp = spr[0].Yasp;
- spr[out_i].pix = 0;
- spr[out_i].bpp = 24;
-
- fill_info(&spr[out_i]);
- alloc_spr_line(&spr[out_i]);
- write_sprite_header(&spr[out_i], outf);
-
- sprintf(string,"Generating sprite %dx%dx%d:",spr[out_i].X,
- spr[out_i].Y,
- spr[out_i].bpp);
- progress_start(string);
-
- for(y=0; y<spr[out_i].Y; y++)
- {
- for(x=0; x<spr[out_i].X; x++)
- {
- r = read_pixel_val(&spr[red_i], x,y);
- g = read_pixel_val(&spr[green_i],x,y);
- b = read_pixel_val(&spr[blue_i], x,y);
-
- rgb = (b<<24) | (g<<16) | (r<<8);
-
- write_pixel_val(&spr[out_i], x,0, rgb);
- }
- fwrite(spr[out_i].spr_data, spr[out_i].line_size, 1, outf);
-
- progress(y,spr[out_i].Y);
- }
- progress_finish();
-
- fclose(inf);
- fclose(outf);
- fclose(errf);
- }
- else
- {
- /*
- * allocate line buffer only for extened sprite
- * copy details of input sprite to all 3 output sprites
- * and allocated full data buffers
- */
-
- alloc_spr_line(&spr[0]);
-
- in_i = 0;
- red_i = 1;
- green_i = 2;
- blue_i = 3;
-
- for(i=1; i<4; i++)
- {
- spr[i].X = spr[in_i].X;
- spr[i].Y = spr[in_i].Y;
- spr[i].Xasp = spr[in_i].Xasp;
- spr[i].Yasp = spr[in_i].Yasp;
- spr[i].pix = 8;
- spr[i].bpp = 8;
-
- fill_info(&spr[i]);
- alloc_spr_data(&spr[i]);
-
- /* make read/green/blue plane palette */
-
- for(j=0; j<256; j++)
- {
- spr[i].palette[j] = j * 0x01010100;
- }
- }
-
- sprintf(string,"Generating triples %dx%dx8:",spr[in_i].X,
- spr[in_i].Y);
- progress_start(string);
-
- for(y=0; y<spr[in_i].Y; y++)
- {
- fread(spr[in_i].spr_data, spr[in_i].line_size, 1, inf);
-
- for(x=0; x<spr[in_i].X; x++)
- {
- rgb = read_pixel_RGB(&spr[in_i],x,0);
-
- r = (rgb >> 8) & 0xFF;
- g = (rgb >> 16) & 0xFF;
- b = (rgb >> 24) & 0xFF;
-
- write_pixel_val(&spr[red_i], x,y, r);
- write_pixel_val(&spr[green_i], x,y, g);
- write_pixel_val(&spr[blue_i], x,y, b);
- }
-
- progress(y,spr[in_i].Y);
- }
-
- /* write tripple sprites */
-
- out_i = red_i;
-
- pal_size = spr[out_i].cols*8;
- spr_size = spr[out_i].line_size * spr[out_i].Y;
-
- sprite.number = 3;
- sprite.offset = 16;
- sprite.free = sprite.offset + (spr_size+pal_size+44)*3 ;
-
- for(i=1; i<4; i++)
- {
- sprite.next = spr_size + pal_size + 44;
- sprite.width = spr[i].line_size/4 -1;
- sprite.height = spr[i].Y-1;
- sprite.left = 0;
- sprite.right = 31 - (spr[i].line_size*8 -
- spr[i].X*spr[i].pix);
- sprite.sprite = pal_size + 44;
- sprite.mask = sprite.sprite;
- sprite.mode = spr[i].mode;
-
- memset(sprite.name, 0, 12);
-
- if(i==red_i) strncpy(sprite.name,"red",12);
- if(i==green_i) strncpy(sprite.name,"green",12);
- if(i==blue_i) strncpy(sprite.name,"blue",12);
-
- if(i==1)
- {
- write_struct(LE, (BYTE*)&sprite,
- spritefile_descr, outf);
- }
- else
- {
- write_struct(LE, (BYTE*)&sprite.next,
- &spritefile_descr[3], outf);
- }
-
- for(j=0; j<spr[i].cols; j++)
- {
- words[0] = endian(LE,spr[i].palette[j]);
- words[1] = words[0];
- fwrite((char*)words, 8, 1, outf);
- }
-
- fwrite(spr[i].spr_data, spr[i].line_size,
- spr[i].Y, outf);
- }
-
- progress_finish();
-
- fclose(inf);
- fclose(outf);
- fclose(errf);
- }
-
- return(0);
- }
-