Annotation of researchv9/X11/src/X.V11R1/server/ddx/mi/mizerline.c, revision 1.1.1.1

1.1       root        1: /***********************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ******************************************************************/
                     24: /* $Header: mizerline.c,v 1.3 87/09/11 07:20:38 toddb Exp $ */
                     25: #include "X.h"
                     26: 
                     27: #include "misc.h"
                     28: #include "scrnintstr.h"
                     29: #include "gcstruct.h"
                     30: #include "windowstr.h"
                     31: #include "pixmap.h"
                     32: 
                     33: int
                     34: miZeroLine(dst, pgc, mode, nptInit, pptInit)
                     35: DrawablePtr dst;
                     36: GCPtr pgc;
                     37: int mode;
                     38: int nptInit;           /* number of points in polyline */
                     39: DDXPointRec *pptInit;  /* points in the polyline */
                     40: {
                     41:     int xorg, yorg;
                     42:     DDXPointRec *ppt;
                     43:     int npt;
                     44: 
                     45:     DDXPointRec pt1, pt2;
                     46:     int dx, dy;
                     47:     int adx, ady;
                     48:     int signdx, signdy;
                     49:     register int len;
                     50: 
                     51:     int du, dv;
                     52:     register int e, e1, e2;
                     53: 
                     54:     register int x,y;  /* current point on the line */
                     55:     int i;             /* traditional name for loop counter */
                     56: 
                     57:     ppt = pptInit;
                     58:     npt = nptInit;
                     59:     if (pgc->miTranslate)
                     60:     {
                     61:         if (dst->type == DRAWABLE_WINDOW) 
                     62:         {
                     63:            xorg = ((WindowPtr)dst)->absCorner.x;
                     64:            yorg = ((WindowPtr)dst)->absCorner.y;
                     65:         }
                     66:         else 
                     67:         {
                     68:            xorg = 0;
                     69:            yorg = 0;
                     70:         }
                     71: 
                     72:         if (mode == CoordModeOrigin) 
                     73:         {
                     74:                for (i = 0; i<npt; i++) 
                     75:                 {    
                     76:                    ppt->x += xorg;
                     77:                    ppt++->y += yorg;
                     78:                }
                     79:         }
                     80:         else 
                     81:         {
                     82:            ppt->x += xorg;
                     83:            ppt++->y += yorg;
                     84:            for (i = 1; i<npt; i++) 
                     85:             {
                     86:                ppt->x += (ppt-1)->x;
                     87:                ppt->y += (ppt-1)->y;
                     88:                ppt++;
                     89:            }
                     90:         }
                     91:     }
                     92:     else
                     93:     {
                     94:        if (mode == CoordModePrevious)
                     95:         {
                     96:            ppt++;
                     97:            for (i = 1; i<npt; i++) 
                     98:             {
                     99:                ppt->x += (ppt-1)->x;
                    100:                ppt->y += (ppt-1)->y;
                    101:                ppt++;
                    102:            }
                    103:         }
                    104:     }
                    105: 
                    106:     ppt = pptInit;
                    107:     npt = nptInit;
                    108:     while (--npt)
                    109:     {
                    110: 
                    111:        DDXPointPtr pspan;
                    112:        DDXPointPtr pspanInit;
                    113:        int *pwidth;
                    114:        int *pwidthInit;
                    115:        int width;
                    116: 
                    117:        pt1 = *ppt++;
                    118:        pt2 = *ppt;
                    119:        dx = pt2.x - pt1.x;
                    120:        dy = pt2.y - pt1.y;
                    121:        adx = abs(dx);
                    122:        ady = abs(dy);
                    123:        signdx = sign(dx);
                    124:        signdy = sign(dy);
                    125: 
                    126:        if (adx > ady)
                    127:        {
                    128:            du = adx;
                    129:            dv = ady;
                    130:            len = adx;
                    131:        }
                    132:        else
                    133:        {
                    134:            du = ady;
                    135:            dv = adx;
                    136:            len = ady;
                    137:        }
                    138: 
                    139:        e1 = dv * 2;
                    140:        e2 = e1 - 2*du;
                    141:        e = e1 - du;
                    142: 
                    143:        pspan = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * (ady+1));
                    144:        pwidth = (int *)ALLOCATE_LOCAL(sizeof(int) * (ady+1));
                    145:        pspanInit = pspan;
                    146:        pwidthInit = pwidth;
                    147: 
                    148:        x = pt1.x;
                    149:        y = pt1.y;
                    150:        if (adx > ady)
                    151:        {
                    152:            /* X_AXIS */
                    153:            width = 0;
                    154:            *pspan = pt1;
                    155:            while(len--)
                    156:            {
                    157:                if (((signdx > 0) && (e < 0)) ||
                    158:                    ((signdx <=0) && (e <=0))
                    159:                   )
                    160:                {
                    161:                    e += e1;
                    162:                    x+= signdx;
                    163:                    width++;
                    164:                }
                    165:                else
                    166:                {
                    167:                    /* give this span a width */
                    168:                    width++;
                    169:                    *pwidth++ = width;
                    170: 
                    171:                    /* force the span the right way */
                    172:                    if (signdx < 0)
                    173:                        pspan->x -= (width-1);
                    174: 
                    175:                    /* initialize next span */
                    176:                    x += signdx;
                    177:                    y += signdy;
                    178:                    e += e2;
                    179: 
                    180:                    width = 0;
                    181:                    pspan++;
                    182:                    pspan->x = x;
                    183:                    pspan->y = y;
                    184: 
                    185:                }
                    186:            };
                    187:            /* do the last span */
                    188:            *pwidth++ = width;
                    189:            if (signdx < 0)
                    190:                pspan->x -= (width-1);
                    191:        }
                    192:        else
                    193:        {
                    194:            /* Y_AXIS */
                    195:            while(len--)
                    196:            {
                    197:                if (((signdx > 0) && (e < 0)) ||
                    198:                    ((signdx <=0) && (e <=0))
                    199:                   )
                    200:                {
                    201:                    e +=e1;
                    202:                }
                    203:                else
                    204:                {
                    205:                    x += signdx;
                    206:                    e += e2;
                    207:                }
                    208:                y += signdy;
                    209:                pspan->x = x;
                    210:                pspan++->y = y;
                    211:                *pwidth++ = 1;
                    212:            };
                    213:        }
                    214: 
                    215:        (*pgc->FillSpans)(dst, pgc, pwidth-pwidthInit,
                    216:                          pspanInit, pwidthInit, FALSE);
                    217:        DEALLOCATE_LOCAL(pspanInit);
                    218:        DEALLOCATE_LOCAL(pwidthInit);
                    219:     } 
                    220: 
                    221:     if ((pgc->capStyle != CapNotLast) &&
                    222:        ((ppt->x != pptInit->x) ||
                    223:         (ppt->y != pptInit->y)))
                    224:     {
                    225:        int width = 1;
                    226:        (*pgc->FillSpans)(dst, pgc, 1, ppt, &width, TRUE);
                    227:     }
                    228: } 

unix.superglobalmegacorp.com

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