home *** CD-ROM | disk | FTP | other *** search
- /* wimp sprite creator */
- /* (c) C.T.Stretch */
- /* Sat,03 Sep 1994 */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #include "h.osspriteop"
- #include "h.colourtrans"
- #include "h.font"
-
- #define ASIZE 10240
- #define FLAGS osspriteop_USER_AREA|osspriteop_NAME
-
- static osspriteop_area *a;
- static unsigned int pal[32]=
- { 0xFFFFFF00,0xFFFFFF00,
- 0xDDDDDD00,0xDDDDDD00,
- 0xBBBBBB00,0xBBBBBB00,
- 0x99999900,0x99999900,
- 0x77777700,0x77777700,
- 0x55555500,0x55555500,
- 0x33333300,0x33333300,
- 0x00000000,0x00000000,
- 0x99440000,0x99440000,
- 0x00EEEE00,0x00EEEE00,
- 0x00CC0000,0x00CC0000,
- 0x0000DD00,0x0000DD00,
- 0xBBEEEE00,0xBBEEEE00,
- 0x00885500,0x00885500,
- 0x00BBFF00,0x00BBFF00,
- 0xFFBB0000,0xFFBB0000
- };
-
- static void savesprites(char *dir,char *leaf)
- { char buf[257];
- sprintf(buf,"%.245s.%s",dir,leaf);
- xosspriteop_save_sprite_file(FLAGS,a,buf);
- }
-
- int inlist[]={128,129,130,131,136,137,153,154,-1};
-
- static void makesprite(os_mode m,int size,char *called,char *letter)
- { int ex,ey,i;
- int xsize,ysize;
- int x,y,fsize;
- int dx,dy,widest;
- font_f f;
- font_scan_block fsb[1];
- osspriteop_header *h;
- unsigned int *p;
- char *fontname="Trinity.Bold";
- int outlist[20];
- os_read_mode_variable (m,4,&ex);
- os_read_mode_variable (m,5,&ey);
- for(xsize=size;ex;ex--) xsize=(xsize+1)/2;
- for(ysize=size;ey;ey--) ysize=(ysize+1)/2;
- if(xfont_find_font(fontname,160,160,0,0,&f,0,0)) f=0;
- font_scan_string(f,letter,font_RETURN_BBOX|font_GIVEN_BLOCK|font_GIVEN_FONT,
- INT_MAX,INT_MAX,fsb,0,0,0,0,0,0);
- font_lose_font(f);
- dx=fsb->bbox.x1-fsb->bbox.x0;
- dy=fsb->bbox.y1-fsb->bbox.y0;
- widest=(dx>dy)?dx:dy;
- fsize=(400*160*size)/widest;
- x=-(fsb->bbox.x0*fsize)/160;y=-(fsb->bbox.y0*fsize)/160;
- if(dx>dy) y+=((dx-dy)*fsize)/320;
- else x+=((dy-dx)*fsize)/320;
-
- osspriteop_create_sprite(FLAGS,a,called,TRUE,xsize,ysize,m);
- osspriteop_create_mask(FLAGS,a,(osspriteop_id)called);
- h=osspriteop_select_sprite(FLAGS,a,(osspriteop_id)called);
- p=(unsigned int*)(h+1);
- for(i=0;i<32;i++) p[i]=pal[i];
- osspriteop_switch_output_to_sprite(FLAGS,a,(osspriteop_id)called,0,0,0,0,0);
- os_writec(18);os_writec(0);os_writec(128+1);os_writec(16);
- xos_plot(os_MOVE_TO,0,0);xos_plot(7|os_PLOT_RECTANGLE,xsize,ysize);
- xos_read_vdu_variables((os_vdu_var_list*)inlist,outlist);
-
- if(xfont_find_font(fontname,fsize,fsize,0,0,&f,0,0)) f=0;
- if(f)
- { colourtrans_set_font_colours(f,os_COLOUR_VERY_LIGHT_GREY,
- os_COLOUR_BLACK,14,0,0,0);
-
- font_paint(f,letter,0,x,y,0,0,0);
- font_lose_font(f);
- }
- osspriteop_switch_output_to_sprite(FLAGS,a,0,
- (osspriteop_save_area*)1,0,0,0,0);
- osspriteop_remove_palette(FLAGS,a,(osspriteop_id)called);
- }
-
- int main(int argc,char **argv)
- { char name[16];
- char sm_name[16];
- char letter[2];
- if(argc!=3)
- { printf("newsprites needs two arguments\n");
- exit(1);
- }
- sprintf(name,"!%.8s",argv[1]);
- sprintf(sm_name,"sm!%.8s",argv[1]);
- letter[0]=argv[1][0];letter[1]=0;
- a=malloc(ASIZE);
- if(!a)
- { printf("Insufficient memory\n");
- exit(2);
- }
- a->size=ASIZE;
- a->sprite_count=0;
- a->first=sizeof(osspriteop_area);
- a->used=sizeof(osspriteop_area);
- makesprite((os_mode)20,68,name,letter);
- makesprite((os_mode)20,34,sm_name,letter);
- savesprites(argv[2],"!sprites22");
- a->sprite_count=0;
- a->used=sizeof(osspriteop_area);
- makesprite((os_mode)12,68,name,letter);
- makesprite((os_mode)12,34,sm_name,letter);
- savesprites(argv[2],"!sprites");
- return 0;
- }
-
-