home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / SRC / ATTR.C < prev    next >
C/C++ Source or Header  |  2000-02-11  |  3KB  |  158 lines

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