home *** CD-ROM | disk | FTP | other *** search
/ Graphics 16,000 / graphics-16000.iso / sgi / editors / kali.lha / kali / kaliprint.c < prev    next >
C/C++ Source or Header  |  1992-10-09  |  3KB  |  161 lines

  1. /*                        */
  2. /*** kaliprint.c - Nina Amenta, Aug. 1989 ***/
  3. /*                        */
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include "symmetry.h"
  7.  
  8. #define WID 1.2
  9. #define PSSTACKSIZE 40
  10.  
  11. LINE *ReadPattern();
  12. LINE *NewLine();
  13. RECTANGLE clip;
  14. LINE *MakeCurrentObject();
  15. void DrawLine();
  16. LINE *SpewObject();
  17.  
  18. /* stubs for things defined in kali.c referred to in symmetry.c */
  19. WINDOW win = 0;
  20. void PickLine() {;}
  21.  
  22. main(argc, argv)
  23. int    argc;
  24. char    *argv[];
  25. {
  26.   FILE *pat;
  27.   int i;
  28.   RECTANGLE win_rect,bounds;
  29.   POINT *sym_pts;
  30.   int count;
  31.   SYMMETRY *sym;
  32.   float xforms[5][4];
  33.   LINE *cur,*Lines,*obj;
  34.   float scale;
  35.   
  36.   if (argc<2) {
  37.       printf("file name on command line please!\n");
  38.   }
  39.   else 
  40.     {
  41.     pat = fopen(argv[1],"r");
  42.  
  43.     fscanf(pat,"%d\n",&i);
  44.     sym = &SYMTAB[i];
  45.     fscanf(pat,"%f %f\n",&win_rect.width,&win_rect.height);
  46.     fscanf(pat,"%f %f\n",&(sym->v1.x),&(sym->v1.y));
  47.     fscanf(pat,"%f %f\n",&(sym->v2.x),&(sym->v2.y));
  48.     fscanf(pat,"%f\n",&scale);
  49.  
  50.     win_rect.x = win_rect.y = 0.0;
  51.     init_postscript(&win_rect);
  52.     count = SetUpSymmetry(sym,&sym_pts,xforms,&win_rect);
  53.     DrawClippingRectangle(&win_rect);
  54.     Lines = NULL;
  55.     Lines = ReadPattern(Lines,pat);
  56.     obj = MakeCurrentObject(Lines,sym,xforms,&bounds);
  57.     /* Draw the object in pieces if necessary, to avoid
  58.        overflowing the Postscript stack */
  59.     while (obj != NULL)
  60.         {
  61.         obj = SpewObject(obj);
  62.         ReplicateObject(&win_rect,obj,sym_pts,count,&bounds,
  63.                 &(sym->v1),&(sym->v2),DrawLine);
  64.         }
  65.     close_postscript();
  66.     }
  67. }
  68.  
  69. DrawDot(p)
  70. POINT *p;
  71. {;}
  72.  
  73. Flush() {;}
  74.  
  75. LogTranslation(i)
  76. int i;
  77. {;}
  78.  
  79. TranslateCoordinates(x,y,z)
  80. float x,y,z;
  81. {
  82.     printf("gsave %6.3f %6.3f translate\n",x,y);
  83. }
  84.  
  85. TranslateBack()
  86. {
  87.     printf("grestore\n");
  88. }
  89.  
  90. void DrawLine(l)
  91. LINE *l;
  92. {
  93.     printf("%6.3f %6.3f moveto\n",l->m[EX],l->m[EY]);
  94.     printf("%6.3f %6.3f lineto\n",l->m[SX],l->m[SY]);
  95. }  
  96.  
  97.  
  98. DrawClippingRectangle(rec)
  99. RECTANGLE *rec;
  100. {
  101.   printf("%6.3f %6.3f moveto\n",rec->x,rec->y);
  102.   printf("%6.3f %6.3f lineto\n",rec->x,rec->height);
  103.   printf("%6.3f %6.3f lineto\n",rec->width,rec->height);
  104.   printf("%6.3f %6.3f lineto\n",rec->width,rec->y);
  105.   printf("%6.3f %6.3f lineto\n",rec->x,rec->y);
  106.   printf("closepath gsave stroke grestore\n");
  107.   printf("clip newpath\n");
  108. }
  109.  
  110.  
  111. init_postscript (rec)
  112. RECTANGLE *rec;
  113. {
  114.   float horiz,vert,units;
  115.   printf("%%!-Adobe-1.0\n");
  116.   printf("/inch {72 mul} def\n");
  117.   printf("0 setgray\n");
  118.   printf("/Times-Roman findfont 2 scalefont setfont\n");
  119.   horiz = 7.5/rec->width;
  120.   vert = 10.0/rec->height;
  121.   units = (vert<horiz) ? vert : horiz;
  122.   horiz = (8.5-(units*rec->width))/2.0;
  123.   vert = (11.0-(units*rec->height))/2.0;
  124.   printf("%4.3f inch %4.3f inch translate\n",horiz,vert);
  125.   printf("%4.3f inch %4.3f inch scale\n",units,units);
  126.   printf("%2.1f setlinewidth\n",WID);
  127.   printf("1 setlinecap\n");
  128.   printf("1 setlinejoin\n");
  129.   printf("\n");
  130.   CopyRectangle(rec,&clip);
  131. }
  132.  
  133. close_postscript ()
  134. {
  135.   printf("showpage\n");
  136. }
  137.  
  138.  
  139. DrawObject(obj,drawing_routine)
  140. LINE *obj;
  141. void (*drawing_routine) ();
  142. {
  143.   printf("pattern\n");
  144. }
  145.  
  146. LINE *SpewObject(obj)
  147. LINE *obj;
  148. {
  149. int i;
  150.     printf("/pattern { \n");
  151.     printf("   newpath \n");
  152.     i = 0;
  153.     while ((i++ < PSSTACKSIZE) && (obj != NULL))
  154.     {
  155.         DrawLine(obj);
  156.         obj = obj->next;
  157.     }
  158.     printf(" stroke } def\n");
  159.     return(obj);
  160. }
  161.