home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / tcl / tcl_1 / !tclnew_c_newsprites < prev    next >
Encoding:
Text File  |  1996-01-19  |  3.5 KB  |  125 lines

  1. /* wimp sprite creator */
  2. /* (c) C.T.Stretch */
  3. /* Sat,03 Sep 1994 */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <limits.h>
  9. #include "h.osspriteop"
  10. #include "h.colourtrans"
  11. #include "h.font"
  12.  
  13. #define ASIZE 10240
  14. #define FLAGS osspriteop_USER_AREA|osspriteop_NAME
  15.  
  16. static osspriteop_area *a;
  17. static unsigned int pal[32]=
  18. { 0xFFFFFF00,0xFFFFFF00,
  19.   0xDDDDDD00,0xDDDDDD00,
  20.   0xBBBBBB00,0xBBBBBB00,
  21.   0x99999900,0x99999900,
  22.   0x77777700,0x77777700,
  23.   0x55555500,0x55555500,
  24.   0x33333300,0x33333300,
  25.   0x00000000,0x00000000,
  26.   0x99440000,0x99440000,
  27.   0x00EEEE00,0x00EEEE00,
  28.   0x00CC0000,0x00CC0000,
  29.   0x0000DD00,0x0000DD00,
  30.   0xBBEEEE00,0xBBEEEE00,
  31.   0x00885500,0x00885500,
  32.   0x00BBFF00,0x00BBFF00,
  33.   0xFFBB0000,0xFFBB0000
  34. };
  35.  
  36. static void savesprites(char *dir,char *leaf)
  37. { char buf[257];
  38.   sprintf(buf,"%.245s.%s",dir,leaf);
  39.   xosspriteop_save_sprite_file(FLAGS,a,buf);
  40. }
  41.  
  42. int inlist[]={128,129,130,131,136,137,153,154,-1};
  43.  
  44. static void makesprite(os_mode m,int size,char *called,char *letter)
  45. { int ex,ey,i;
  46.   int xsize,ysize;
  47.   int x,y,fsize;
  48.   int dx,dy,widest;
  49.   font_f f;
  50.   font_scan_block fsb[1];
  51.   osspriteop_header *h;
  52.   unsigned int *p;
  53.   char *fontname="Trinity.Bold";
  54.   int outlist[20];
  55.   os_read_mode_variable (m,4,&ex);
  56.   os_read_mode_variable (m,5,&ey);
  57.   for(xsize=size;ex;ex--) xsize=(xsize+1)/2;
  58.   for(ysize=size;ey;ey--) ysize=(ysize+1)/2;
  59.   if(xfont_find_font(fontname,160,160,0,0,&f,0,0)) f=0;
  60.   font_scan_string(f,letter,font_RETURN_BBOX|font_GIVEN_BLOCK|font_GIVEN_FONT,
  61.                    INT_MAX,INT_MAX,fsb,0,0,0,0,0,0);
  62.   font_lose_font(f);
  63.   dx=fsb->bbox.x1-fsb->bbox.x0;
  64.   dy=fsb->bbox.y1-fsb->bbox.y0;
  65.   widest=(dx>dy)?dx:dy;
  66.   fsize=(400*160*size)/widest;
  67.   x=-(fsb->bbox.x0*fsize)/160;y=-(fsb->bbox.y0*fsize)/160;
  68.   if(dx>dy) y+=((dx-dy)*fsize)/320;
  69.   else x+=((dy-dx)*fsize)/320;
  70.  
  71.   osspriteop_create_sprite(FLAGS,a,called,TRUE,xsize,ysize,m);
  72.   osspriteop_create_mask(FLAGS,a,(osspriteop_id)called);
  73.   h=osspriteop_select_sprite(FLAGS,a,(osspriteop_id)called);
  74.   p=(unsigned int*)(h+1);
  75.   for(i=0;i<32;i++) p[i]=pal[i];
  76.   osspriteop_switch_output_to_sprite(FLAGS,a,(osspriteop_id)called,0,0,0,0,0);
  77.   os_writec(18);os_writec(0);os_writec(128+1);os_writec(16);
  78.   xos_plot(os_MOVE_TO,0,0);xos_plot(7|os_PLOT_RECTANGLE,xsize,ysize);
  79.   xos_read_vdu_variables((os_vdu_var_list*)inlist,outlist);
  80.  
  81.   if(xfont_find_font(fontname,fsize,fsize,0,0,&f,0,0)) f=0;
  82.   if(f)
  83.   { colourtrans_set_font_colours(f,os_COLOUR_VERY_LIGHT_GREY,
  84.                                  os_COLOUR_BLACK,14,0,0,0);
  85.  
  86.     font_paint(f,letter,0,x,y,0,0,0);
  87.     font_lose_font(f);
  88.   }
  89.   osspriteop_switch_output_to_sprite(FLAGS,a,0,
  90.       (osspriteop_save_area*)1,0,0,0,0);
  91.   osspriteop_remove_palette(FLAGS,a,(osspriteop_id)called);
  92. }
  93.  
  94. int main(int argc,char **argv)
  95. { char name[16];
  96.   char sm_name[16];
  97.   char letter[2];
  98.   if(argc!=3)
  99.   { printf("newsprites needs two arguments\n");
  100.     exit(1);
  101.   }
  102.   sprintf(name,"!%.8s",argv[1]);
  103.   sprintf(sm_name,"sm!%.8s",argv[1]);
  104.   letter[0]=argv[1][0];letter[1]=0;
  105.   a=malloc(ASIZE);
  106.   if(!a)
  107.   { printf("Insufficient memory\n");
  108.     exit(2);
  109.   }
  110.   a->size=ASIZE;
  111.   a->sprite_count=0;
  112.   a->first=sizeof(osspriteop_area);
  113.   a->used=sizeof(osspriteop_area);
  114.   makesprite((os_mode)20,68,name,letter);
  115.   makesprite((os_mode)20,34,sm_name,letter);
  116.   savesprites(argv[2],"!sprites22");
  117.   a->sprite_count=0;
  118.   a->used=sizeof(osspriteop_area);
  119.   makesprite((os_mode)12,68,name,letter);
  120.   makesprite((os_mode)12,34,sm_name,letter);
  121.   savesprites(argv[2],"!sprites");
  122.   return 0;
  123. }
  124.  
  125.