home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / fermiVogle.tar.Z / fermiVogle.tar / devel / src / attr.c < prev    next >
C/C++ Source or Header  |  1996-02-07  |  3KB  |  153 lines

  1. #include <stdio.h>
  2. #include "vogle.h"
  3.  
  4. static    Astack    *asfree = (Astack *)NULL;
  5.  
  6. static void copyattributes(Attribute *, Attribute * );
  7.  
  8. /*
  9.  * copyattributes
  10.  *
  11.  *    Copies attribute stack entries from b to a
  12.  */
  13. static    void
  14. copyattributes(Attribute *a, Attribute *b)
  15. {
  16.     if (b->style) {
  17.         if (a->style)
  18.             free(a->style);
  19.  
  20.         a->style = (unsigned char *)vallocate(strlen(b->style) + 1);
  21.         strcpy(a->style, b->style);
  22.     }
  23.  
  24.     a->dashp = b->dashp;
  25.     a->dash = b->dash;
  26.     a->adist = b->adist;
  27.     a->color = b->color;
  28.     a->fill = b->fill;
  29.     a->hatch = b->hatch;
  30.     a->backbuf = b->backbuf;
  31.     a->textcos = b->textcos;
  32.     a->textsin = b->textsin;
  33.     a->hatchcos = b->hatchcos;
  34.     a->hatchsin = b->hatchsin;
  35.     a->hatchpitch = b->hatchpitch;
  36.     a->justify = b->justify;
  37.     a->fixedwidth = b->fixedwidth;
  38.     a->fontwidth = b->fontwidth;
  39.     a->fontheight = b->fontheight;
  40.     a->softtext = b->softtext;
  41.     a->exvp = b->exvp;
  42.     strcpy(a->font, b->font);
  43. }
  44.  
  45. /*
  46.  * pushattributes
  47.  *
  48.  * save the current attributes on the matrix stack
  49.  *
  50.  */
  51. void
  52. pushattributes(void)
  53. {
  54.     Astack    *nattr;
  55.     Token    *p;
  56.  
  57.     if (!vdevice.initialised)
  58.         verror("pushattributes:  vogle not initialised");
  59.     
  60.     if (vdevice.inobject) {
  61.         p = newtokens(1);
  62.  
  63.         p[0].i = PUSHATTRIBUTES;
  64.  
  65.         return;
  66.     }
  67.  
  68.     if (asfree != (Astack *)NULL) {
  69.         nattr = vdevice.attr;
  70.         vdevice.attr = asfree;
  71.         asfree = asfree->back;
  72.         vdevice.attr->back = nattr;
  73.         copyattributes(&vdevice.attr->a, &nattr->a);
  74.     } else {    
  75.         nattr = (Astack *)vallocate(sizeof(Astack));
  76.         nattr->back = vdevice.attr;
  77.         copyattributes(&nattr->a, &vdevice.attr->a);
  78.         vdevice.attr = nattr;
  79.     }
  80. }
  81.  
  82. /*
  83.  * popattributes
  84.  *
  85.  * pop the top entry on the attribute stack 
  86.  *
  87.  */
  88. void
  89. popattributes(void)
  90. {
  91.     Astack    *nattr;
  92.     Token    *p;
  93.  
  94.     if (!vdevice.initialised)
  95.         verror("popattributes: vogle not initialised");
  96.     
  97.     if (vdevice.inobject) {
  98.         p = newtokens(1);
  99.  
  100.         p[0].i = POPATTRIBUTES;
  101.  
  102.         return;
  103.     }
  104.  
  105.     if (vdevice.attr->back == (Astack *)NULL) 
  106.         verror("popattributes: attribute stack is empty");
  107.     else {
  108.         nattr = vdevice.attr;
  109.         font(vdevice.attr->back->a.font);
  110.         vdevice.attr = vdevice.attr->back;
  111.         nattr->back = asfree;
  112.         asfree = nattr;
  113.     }
  114.  
  115.     /*
  116.      * Restore some stuff...
  117.      */
  118.     color(vdevice.attr->a.color);
  119.  
  120.     if (vdevice.attr->a.backbuf)
  121.         backbuffer();
  122.  
  123.     if (vdevice.attr->a.softtext)
  124.         textsize(vdevice.attr->a.fontwidth, vdevice.attr->a.fontheight);
  125.  
  126.     if (vdevice.attr->a.exvp)
  127.         expandviewport();
  128.         
  129. }
  130.  
  131. #ifdef    DEBUG
  132.  
  133. printattribs(char *s)
  134. {
  135.     printf("%s\n", s);
  136.     printf("clipoff    = %d\n", vdevice.clipoff);
  137.     printf("color      = %d\n", vdevice.attr->a.color);
  138.     printf("fill       = %d\n", vdevice.attr->a.fill);
  139.     printf("hatch      = %d\n", vdevice.attr->a.hatch);
  140.     printf("textcos    = %f\n", vdevice.attr->a.textcos);
  141.     printf("textsin    = %f\n", vdevice.attr->a.textsin);
  142.     printf("hatchcos   = %f\n", vdevice.attr->a.hatchcos);
  143.     printf("hatchsin   = %f\n", vdevice.attr->a.hatchsin);
  144.     printf("hatchpitch = %f\n", vdevice.attr->a.hatchpitch);
  145.     printf("justify    = %d\n", vdevice.attr->a.justify);
  146.     printf("fixedwidth = %d\n", vdevice.attr->a.fixedwidth);
  147.     printf("fontwidth  = %f\n", vdevice.attr->a.fontwidth);
  148.     printf("fontwidth  = %f\n", vdevice.attr->a.fontheight);
  149.     printf("font       = %s\n", vdevice.attr->a.font);
  150. }
  151.  
  152. #endif
  153.