home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / autocad / hrsh2acd.arc / FONTX.C < prev    next >
Text File  |  1988-07-15  |  8KB  |  357 lines

  1. /* --- FONTX.C -- Compiles a subset of AutoCAD font files (*.SHP) into packed
  2.  |         binary format for faster loading and drawing.
  3.  |     Compiled file fomat is totally incompatible from AutoCAD "*.SHX"
  4.  |         file format.  We don't know the format for "*.SHX" files.
  5.  |     To acknowledge this difference, this program produces compiled
  6.  |         files with suffix ".XSH".
  7.  |     Compiled fonts can be viewed using the accompanying program FONTDEMO.C.
  8.  |     There is NO DOCUMENTATION for the format of our compiled font in "*.XSH"
  9.  |         files.  Please read FONTDEMO.C code for details.
  10.  |     This program is hereby released into the public domain.
  11.  |     This program has been developed to use Hershey Font in our locally
  12.  |         developed graphics package.
  13.  |     This program supports only a subset of AutoCAD "*.SHP" font definitions.
  14.  |         Vertical text mode will be ignored, and "*.SHP" files containing
  15.  |         ARC commands cannot be compiled.
  16.  |         
  17.  |     Author:     Wayne C. Crawford,   6-20-88 starting.
  18.  *-------------------------------------------------------------------------- */
  19.  
  20. #include <stdio.h>
  21. #include <string.h>
  22.  
  23. FILE *fpinp;
  24. FILE *fpdataout;
  25. unsigned int ptarray[128];
  26. unsigned int fontarray[6000];
  27. int junk, garbage;
  28. int pendowner;
  29. char string[128];
  30. char readfile[80], *rfileptr;
  31. char writefile[80], *wfileptr;
  32. int count = 1;          /* position of array that we are presently in */
  33. int ignore = 0;
  34. float xpos,ypos;
  35. float fontscale;
  36.  
  37.  
  38. /*------ mani() starts here -----------------------------------------------*/
  39. main(argc,argv)
  40. int argc;
  41. char *argv[];
  42. {
  43. int inpnum;
  44. char line[255];
  45. register int i;
  46. char *stringptr;
  47.  
  48.     if (argc != 2)
  49.     {
  50.         printf("Usage: FONTX FONTNAME.SHP (enter)\n\n");
  51.         printf("    Compiles Hershey Font in AutoCAD SHP format into\n");
  52.         printf("    packed binary format, and output results to\n");
  53.         printf("    a file FONTNAME.XSH\n");
  54.         exit(1);
  55.     }
  56.  
  57.     strcpy( readfile, strupr(argv[1]) );
  58.     strcpy( writefile, readfile);
  59.     /* Check if filename is OK */
  60.     stringptr = readfile;
  61.     while ( *(++stringptr) != '\0' );
  62.     --stringptr; --stringptr; --stringptr;
  63.     if( strcmp( stringptr, "SHP") != 0 )
  64.     {
  65.         printf("Input file suffix must be .SHP\n");
  66.         exit(2);
  67.     }    
  68.  
  69.     if ((fpinp= fopen(argv[1],"r")) == NULL)
  70.     {
  71.         printf("Couldn't open file: %s\n",argv[1]);
  72.         exit(2);
  73.     }
  74.  
  75.     for( i = 0; i < 128; i++)
  76.         ptarray[i] = 0;          /* INITIALIZE POINTER ARRAY */
  77.     
  78.     fgets(line,80,fpinp);
  79.     get_next_integer(&inpnum,&garbage);
  80.     fontscale = 21./(float)inpnum;
  81.     fgets(line,80,fpinp);
  82.     printf("Fontscale = %.2f\n",fontscale);
  83.     while ( inpnum != -1)
  84.     {
  85.         inpnum = get_one_command();
  86.     }
  87.     printf("count = %d\n",count);
  88.     wrt_fontfile(writefile);
  89.     fclose(fpinp); 
  90. }    
  91.  
  92.  
  93. get_one_command()
  94. {
  95. int inpnum,newinp;
  96. int endof = 0;
  97.     
  98.     endof = get_next_integer(&inpnum,&newinp);
  99.     if (endof == -1)
  100.         return(-1);
  101.     if (newinp)
  102.     {
  103.         ptarray[inpnum] = count;
  104.         xpos = 20.;
  105.         ypos = 20.; /* The "20"s are to offset the character box */
  106.     }
  107.     else
  108.     {
  109.         switch(inpnum)
  110.         {
  111.         case 0:    end_of_shape();
  112.             break;
  113.         case 1:    pendown(1);
  114.             break;
  115.         case 2: pendown(0);
  116.             break;
  117.         case 3:
  118.         case 4:    if (!ignore)
  119.                 printf("Multiply/Divide Error\n");
  120.             get_next_integer(&junk,&garbage);
  121.             break;
  122.         case 5:    
  123.         case 6:    
  124.         case 7:    
  125.         case 10:    
  126.         case 11:    
  127.         case 12:    
  128.         case 13: printf("TERMINAL Error!\n");
  129.             return(-1);
  130.             break;    
  131.         case 8: convert_to_screen();
  132.             break;    
  133.         case 9: while (convert_to_screen());
  134.             break;    
  135.         case 14: ignore = 1;
  136.             get_one_command();
  137.             ignore = 0;
  138.             break;    
  139.         default: convert_to_xy(inpnum);
  140.             break;    
  141.         }
  142.     }
  143.     return(inpnum);
  144. }    
  145.  
  146.  
  147. get_next_integer(number, newone)
  148. int *number, *newone;
  149. {
  150. int c;
  151.  
  152.     c = getc(fpinp);
  153.     while ( ((c > '9') || (c < '0')) && ((c != '*') && (c != '-')) && (c != -1) )
  154.         c = getc(fpinp);
  155.     if (c == -1)
  156.         return (-1);
  157.     else if (c == '*')
  158.     {
  159.         c = getc(fpinp);    /* ADVANCE STREAM POINTER BY ONE */
  160.         *number = grabnum(c);
  161.             fgets(string,80,fpinp);
  162.         *newone = 1;
  163.     }
  164.     else
  165.     {
  166.         *number = grabnum(c);
  167.         *newone = 0;
  168.     }
  169.     return(0);
  170. }
  171.  
  172.  
  173. grabnum(c)
  174. int c;
  175. {
  176. int value;
  177.  
  178.      if (c == '0') /* GET HEXIDECIMAL NUMBER */
  179.     {
  180.         value = decodedhex(c);
  181.         while ( decodedhex(c = getc(fpinp)) >= 0 )
  182.         {
  183.             value = value*16 + decodedhex(c);
  184.         }
  185.     }
  186.     else if (c == '-')  /* negative value */
  187.     {
  188.         value = getc(fpinp) - '0';
  189.         c = getc(fpinp);
  190.         while ( (c >= '0') && (c <= '9') )
  191.         {
  192.             value = value*10 + c - '0';
  193.             c = getc(fpinp);
  194.         }
  195.         value *= -1;
  196.     }
  197.     else               /* positive integer */
  198.     {
  199.         value = c - '0';
  200.         c = getc(fpinp);
  201.         while ( (c >= '0') && (c <= '9') )
  202.         {
  203.             value = value*10 + c - '0';
  204.             c = getc(fpinp);
  205.         }
  206.     }
  207.     return(value);
  208. }
  209.  
  210.  
  211. decodedhex(c)
  212. int c;
  213. {
  214.     int value;
  215.  
  216.     if ( (c >= 'a')&&(c <= 'f') )
  217.         value = 10 + c - 'a';
  218.     else if ( (c >= 'A')&&(c <= 'F') )
  219.         value = 10 + c - 'A';
  220.     else if ( (c >= '0')&&(c <= '9') )
  221.         value = c - '0';
  222.     else value = -1;
  223.     return(value);
  224. }
  225.  
  226.  
  227. /****************************************************************************/
  228. /******************** NOW FOR THE COMMAND HANDLING PART *********************/
  229. /****************************************************************************/
  230.  
  231. end_of_shape()
  232.     if (!ignore)
  233.     {
  234.         fontarray[count++] = 0x4000;
  235.     }
  236.     return(0);
  237. }
  238.  
  239. pendown(penval)
  240. int penval;
  241. {
  242.     if (!ignore)
  243.     {
  244.         fontarray[count++] = 0x2000 + penval*0x1000;
  245.     }
  246.     return(0);
  247. }
  248.  
  249. convert_to_screen()
  250. {
  251. int x,y,junk;
  252.  
  253.     get_next_integer(&x,&junk);
  254.     get_next_integer(&y,&junk);
  255.     if (!ignore)
  256.     {
  257.         if ((x == 0) && (y == 0))
  258.             return(0); 
  259.         xpos += (float)x*fontscale;
  260.         ypos += (float)y*fontscale;
  261.         fontarray[count++]
  262.           = (((int)(xpos+0.1) & 0x3f) << 6) + ((int)(ypos+0.1) & 0x3f);
  263.     }
  264.     return(1);
  265. }
  266.  
  267. convert_to_xy(hexnum)
  268. int hexnum;
  269. {
  270. float xtimes,ytimes;
  271. unsigned int dirhex, maghex;
  272.  
  273.     if (!ignore)
  274.     {
  275.         dirhex = hexnum & 0x0f;
  276.         maghex = (hexnum & 0xf0) >> 4;
  277.         switch (dirhex)
  278.         {
  279.             case 0:    xtimes = 1.; ytimes = 0.;
  280.             break;
  281.             case 1:    xtimes = 1.; ytimes = .5;
  282.             break;
  283.             case 2:    xtimes = 1.; ytimes = 1.;
  284.             break;
  285.             case 3:    xtimes = .5; ytimes = 1.;
  286.             break;
  287.             case 4:    xtimes = 0.; ytimes = 1.;
  288.             break;
  289.             case 5:    xtimes = -.5; ytimes = 1.;
  290.             break;
  291.             case 6:    xtimes = -1.; ytimes = 1.;
  292.             break;
  293.             case 7:    xtimes = -1.; ytimes = .5;
  294.             break;
  295.             case 8:    xtimes = -1.; ytimes = 0.;
  296.             break;
  297.             case 9:    xtimes = -1.; ytimes = -.5;
  298.             break;
  299.             case 10:xtimes = -1.; ytimes = -1.;
  300.             break;
  301.             case 11:xtimes = -.5; ytimes = -1.;
  302.             break;
  303.             case 12:xtimes = 0.; ytimes = -1.;
  304.             break;
  305.             case 13:xtimes = .5; ytimes = -1.;
  306.             break;
  307.             case 14:xtimes = 1.; ytimes = -1.;
  308.             break;
  309.             case 15:xtimes = 1.; ytimes = -.5;
  310.             break;
  311.         default:printf("BIG Direction mistake\n");
  312.             break;
  313.         }
  314.         xpos += maghex*xtimes*fontscale;
  315.         ypos += maghex*ytimes*fontscale;
  316.                fontarray[count++]
  317.         = (((int)(xpos+0.1) & 0x3f) << 6) + ((int)(ypos+0.1) & 0x3f);
  318.     }
  319.     return(0);
  320. }
  321.  
  322. /****************************************************************************/
  323.  
  324. /* ----- Write compiled font file ---------------------------------- */
  325. wrt_fontfile(wfilename)
  326. char *wfilename;
  327. {
  328. int it;
  329. int numwritten;
  330. int *fontptr;
  331. char *stringptr;
  332.  
  333.     stringptr = wfilename;
  334.     while ( *(++stringptr) != '\0' );    /* change suffix to XSH */
  335.     *(--stringptr) = 'H';
  336.     *(--stringptr) = 'S';
  337.     *(--stringptr) = 'X';
  338.  
  339.     fpdataout = fopen(wfilename, "wb");
  340.     if (fpdataout == NULL)
  341.     {
  342.         printf("Compiled font file: %s cannot be opened.\n",writefile);
  343.         return(1);
  344.     }
  345.     /* OK file opened, write the size of the font array*/
  346.         numwritten = fwrite( (char *)&count, sizeof(unsigned), 1, fpdataout);
  347.         numwritten = fwrite( (char *)ptarray, sizeof(unsigned), 128, fpdataout);
  348.     numwritten = fwrite( (char *)fontarray, sizeof(unsigned), count+2, fpdataout);
  349.     if( numwritten != (count+ 2))
  350.     {
  351.         printf("Can't write compiled font file fully.\n");
  352.     }
  353.     fclose(fpdataout);
  354. }
  355.  
  356.