home *** CD-ROM | disk | FTP | other *** search
/ gdead.berkeley.edu / gdead.berkeley.edu.tar / gdead.berkeley.edu / pub / cad-tools / ciftomann.tar / smash.c < prev   
C/C++ Source or Header  |  1988-01-28  |  5KB  |  211 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "ciftomann.h"
  4. #include "Out_Box.h"
  5. #include "fd.h"
  6.  
  7. #define BAD_BOX 1
  8. #define GOOD_BOX 0
  9.  
  10. #define round_up(x) ((int) ceil( (double) x ))
  11. #define round_even(x) ( (int) floor( ( (double) (x) ) + .5) )
  12.  
  13.     /*
  14.      * compute_inc is used to compute what size boxes are used
  15.      * to tile oversize boxes with. It is carefull to assure that
  16.      * the last box used to tile is not required to be smaller
  17.      * than is allowed
  18.      */
  19.  
  20. #define compute_inc(Orig, Max, Min, Inc, Num)\
  21. {\
  22.     Num = round_up( ((float) Orig)/Max );\
  23.     Inc = grid_size*round_up( ((float) Orig)/(grid_size*Num) );\
  24.     while ( (Orig - (Num-1)*Inc) < Min ) {\
  25.     Inc -= grid_size;\
  26.     Num = round_up( ((float) Orig)/Inc);\
  27.     }\
  28. }
  29.  
  30. #define LAST (OUT_BOX *) 0
  31.  
  32. char *LayerName[8] = {
  33.     "Not A Layer", 
  34.     "NG", 
  35.     "NI", 
  36.     "NB", 
  37.     "ND", 
  38.     "NP", 
  39.     "NM", 
  40.     "NC"
  41. };
  42.  
  43. int stage_min;
  44. int stage_max;
  45. int aperture_min;
  46. int aperture_max;
  47. int grid_size;
  48. float scale_factor;
  49.  
  50. int Layer;
  51. int CharCount;
  52. extern char *ProgName;
  53.  
  54. OUT_BOX *GetBox();    
  55.  
  56. main(argc, argv) 
  57. int argc;
  58. char **argv;
  59. {
  60.  
  61.     int H, W, X, Y, h_inc, w_inc, x_center, y_center;
  62.     int h_num, w_num, x_start, w_final, h_final, i, j;
  63.     OUT_BOX *boxptr;
  64.  
  65.     Layer = 2;
  66.  
  67.     ProgName = "Smash";
  68.  
  69.     /*
  70.      *    The various parameters of the target pattern
  71.      *    generator are read off of the command line
  72.      *    of the program
  73.      */
  74.  
  75.     sscanf(argv[1],"%d %d %d %d %d %f", &stage_min, &stage_max,
  76.         &aperture_min, &aperture_max, &grid_size, &scale_factor);
  77.  
  78.     while ( (boxptr = GetBox()) != LAST ) {
  79.  
  80.     if ( rescale(boxptr, &X, &Y, &W, &H) == BAD_BOX ) {
  81.         continue;
  82.     }
  83.  
  84.         /*
  85.          * the box is too big for the pattern generator,
  86.          * break it up into smaller boxes.
  87.          *
  88.          *       The boxes are made as big as possible, to 
  89.          * minimize the number of flashes. The last box is
  90.          * always smaller though, because the widths must 
  91.          * always be rounded to the resolution grid of the
  92.          * pattern  generator
  93.          */
  94.  
  95.     if ( H > aperture_max || W > aperture_max ) {
  96.         compute_inc(H, aperture_max, aperture_min, h_inc, h_num);
  97.         compute_inc(W, aperture_max, aperture_min, w_inc, w_num);
  98.  
  99.         y_center = Y - ( (float) H )/2. + ( (float) h_inc )/2.;
  100.         x_start = X - ( (float) W )/2. + ( (float) w_inc )/2.;
  101.  
  102.         for (i = 0; i < (h_num - 1); i++) {
  103.         
  104.         x_center = x_start;
  105.  
  106.         for (j = 0; j < (w_num - 1); j++) {
  107.             EmitBox(x_center, y_center, w_inc, h_inc);
  108.             x_center += w_inc;
  109.         }
  110.  
  111.         x_center = (x_center - w_inc/2 + X + W/2)/2;
  112.         w_final = 2*(X + W/2 - x_center);
  113.  
  114.         EmitBox(x_center, y_center, w_final, h_inc);
  115.  
  116.         y_center += h_inc;
  117.         }
  118.  
  119.         y_center = (y_center - h_inc/2 + Y + H/2)/2;
  120.         h_final = 2*(Y + H/2 - y_center);
  121.  
  122.         x_center = x_start;
  123.  
  124.         for (j = 0; j < (w_num - 1); j++) {
  125.         EmitBox(x_center, y_center, w_inc, h_final);
  126.         x_center += w_inc;
  127.         }
  128.  
  129.         x_center = (x_center - w_inc/2 + X + W/2)/2;
  130.         w_final = 2*(X + W/2 - x_center);
  131.  
  132.         EmitBox(x_center, y_center, w_final, h_final);
  133.  
  134.     } else {
  135.         EmitBox(X, Y, W, H);
  136.     }
  137.     }
  138.  
  139.     exit(0);
  140. }
  141.  
  142. #define grid_round(value, grid) ( grid*round_even( value*scale_factor\
  143.                 /( (float) grid) ) )
  144.  
  145.     /* 
  146.      *    Change the units of the coordinates and change the format
  147.      *    from left, bottom, right, top  to  center, width, height
  148.      */
  149.  
  150. rescale(boxptr, x, y, w, h)
  151. OUT_BOX *boxptr;
  152. int *x, *y, *w, *h;
  153. {
  154.     int xmax,ymax,xmin,ymin;
  155.  
  156.     xmax = grid_round(boxptr->xmax, grid_size);
  157.     ymax = grid_round(boxptr->ymax, grid_size);
  158.     xmin = grid_round(boxptr->xmin, grid_size);
  159.     ymin = grid_round(boxptr->ymin, grid_size);
  160.  
  161.     *x = (xmax + xmin)/2;
  162.     *y = (ymax + ymin)/2;
  163.     *w = (xmax - xmin);
  164.     *h = (ymax - ymin);
  165.  
  166.     if (*h < aperture_min || *w < aperture_min) {
  167.     fprintf(stderr,"box from (%d,%d) to (%d,%d) has been deleted because it is\n",
  168.     boxptr->xmin, boxptr->ymin, boxptr->xmax, boxptr->ymax);
  169.         
  170.     fprintf(stderr,"smaller than the minimum aperature size for the pattern generator\n");
  171.     return(BAD_BOX);
  172.     }
  173.  
  174.     return(GOOD_BOX);
  175. }
  176.  
  177. OUT_BOX *GetBox()
  178. {
  179.     int status;
  180.     static OUT_BOX box;
  181.  
  182.     status = fread(&box, sizeof(OUT_BOX), 1, stdin);
  183.  
  184.     if (status == 0) {
  185.     return(LAST);
  186.     }
  187.  
  188.     return(&box);
  189. }
  190.  
  191. EmitBox(X, Y, W, H)
  192. int X, Y, W, H;
  193. {
  194.  
  195. #ifdef DEBUG
  196.     fprintf(stderr, "Smash : Box %d by %d at %d, %d\n", W, H, X, Y);
  197.  
  198.     Layer = ((Layer - 1) % 6) + 2; /* increment, but keep <= 7,  >= 2 */
  199. #endif
  200.  
  201.     printf("B %d %d %d %d;\n",  W, H, X, Y);
  202.  
  203. }
  204.  
  205. error(str,x,y)
  206. char *str;
  207. int x,y;
  208. {
  209.     fprintf(stderr,"Error : %s at (%d,%d) \n",str,x,y);
  210. }
  211.