Annotation of 41BSD/cmd/cifplot/draw.c, revision 1.1

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/draw.c                                          *
        !             4: *    Written by Dan Fitzpatrick                                    *
        !             5: *    copyright 1980 -- Regents of the University of California     *
        !             6: *                                                                  *
        !             7: ********************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include "defs.h"
        !            11: #include "globals.h"
        !            12: #include "parser_defs.h"
        !            13: #include "structs.h"
        !            14: #include "out_structs.h"
        !            15: 
        !            16: IMPORT nedge *AllocHolder();
        !            17: IMPORT PutQueue();
        !            18: IMPORT GetQueue();
        !            19: IMPORT AddLine();
        !            20: IMPORT Fill();
        !            21: 
        !            22: SendDisplay(a,da,b,db,l)
        !            23: register int l;
        !            24: real a,b,da,db;
        !            25: /* SendDisplay sends the y positions a & b to be displayed on plot
        !            26:  * Each raster line the value of a & b change by da & db */
        !            27: {
        !            28:     if(a > b) Error("Edge is backwards in SendEdge",INTERNAL);
        !            29:     if(a < 0) Error("bad value in SendEdge",INTERNAL);
        !            30:     if(a == b && da == db && l != 0) return;  /* Ignore 0 width lines */
        !            31:     if(EdgeHolder[l] != NIL)
        !            32:        if(a<EdgeHolder[l]->end || (a==EdgeHolder[l]->end &&  da <= EdgeHolder[l]->dend)) {
        !            33:            /* If this run overlaps the last run combine them 
        !            34:             * and return
        !            35:             * if not send out last run and create new run
        !            36:             * if equal do not combine since dy may diverge */
        !            37:            EdgeHolder[l]->end = b;
        !            38:            EdgeHolder[l]->dend = db;
        !            39:            return;
        !            40:            }
        !            41:          else
        !            42:             PutQueue(EdgeHolder[l],&(NEdgeQueue[l]));
        !            43:     EdgeHolder[l] = AllocHolder();
        !            44:     EdgeHolder[l]->start = a;
        !            45:     EdgeHolder[l]->end = b;
        !            46:     EdgeHolder[l]->dstart = da;
        !            47:     EdgeHolder[l]->dend = db;
        !            48:     }
        !            49: 
        !            50: FinnishLine(l,xcurrent)
        !            51: int l;
        !            52: /* Causes last holder to be put on queue, calls AddLine */
        !            53: {
        !            54:     if(EdgeHolder[l] != NIL)
        !            55:        PutQueue(EdgeHolder[l],&(NEdgeQueue[l]));
        !            56:     EdgeHolder[l] = NIL;
        !            57:     AddLine(l,xcurrent);
        !            58:     }
        !            59: 
        !            60: /*
        !            61: Draw(i,xcurrent)
        !            62: register int i,xcurrent;
        !            63: {
        !            64:     register nedge *e;
        !            65: 
        !            66:     return;
        !            67:     /* Fill between edges; compute outlines if outline is true
        !            68:      * and the pattern is not black. (If the pattern is black
        !            69:      * outlines do not appear anyway.) */
        !            70:     /*
        !            71:     if(outline && Pats[i][ModCount] != 0xFFFFFFFF)
        !            72:        for(e=(nedge *) NecEdgeQueue[i].QStart; e!=NIL; e=e->Link) {
        !            73:            if(e->dstart > 0.0)
        !            74:                Fill(xcurrent,(int) e->start,(int) (e->start + e->dstart),0xFFFFFFFF);
        !            75:              else
        !            76:                Fill(xcurrent,(int) (e->start + e->dstart),(int) e->start,0xFFFFFFFF);
        !            77:            if(e->dend > 0.0)
        !            78:                Fill(xcurrent,(int) e->end+1,(int) (e->end + e->dend)+1,0xFFFFFFFF);
        !            79:              else
        !            80:                Fill(xcurrent,(int) (e->end + e->dend)+1,(int) e->end+1,0xFFFFFFFF);
        !            81:            e->start += e->dstart; e->end += e->dend;
        !            82:            Fill(xcurrent,(int) e->start, (int) e->end,Pats[i][ModCount]);
        !            83:            }
        !            84:       else
        !            85:        for(e=(nedge *) NecEdgeQueue[i].QStart; e!=NIL; e=e->Link)
        !            86:            Fill(xcurrent,(int) (e->start+= e->dstart), (int) (e->end+= e->dend)+1,Pats[i][ModCount]);
        !            87:     }
        !            88:     */
        !            89: 
        !            90: 
        !            91: OutputTrap(layer,xcurrent)
        !            92: int layer,xcurrent;
        !            93: {
        !            94:     register nedge *e;
        !            95:     register real diff;
        !            96:     if(extractor) {
        !            97:        ExtractorOutput(xcurrent);
        !            98:        return;
        !            99:        }
        !           100:     diff = xcurrent - xprev[layer] - 1;
        !           101:     for(e=(nedge *) NecEdgeQueue[layer].QStart; e!=NIL; e=e->Link) {
        !           102:        FillTrap(e->start,e->end,e->dstart,e->dend,xprev[layer],xcurrent,layer);
        !           103:        e->start += e->dstart * diff;   e->end += e->dend * diff;
        !           104:        }
        !           105:     xprev[layer] = xcurrent;
        !           106:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.