cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Copyright © 1998 Keith Packard
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * documentation for any purpose is hereby granted without fee, provided that
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * the above copyright notice appear in all copies and that both that
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * copyright notice and this permission notice appear in supporting
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * documentation, and that the name of Keith Packard not be used in
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * advertising or publicity pertaining to distribution of the software without
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * specific, written prior permission. Keith Packard makes no
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * representations about the suitability of this software for any purpose. It
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * is provided "as is" without express or implied warranty.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * PERFORMANCE OF THIS SOFTWARE.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * This file defines functions for drawing some primitives using
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * underlying datatypes instead of masks
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define isClipped(c,ul,lr) (((c) | ((c) - (ul)) | ((lr) - (c))) & 0x80008000)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define RROP(b,a,x) WRITE((b), FbDoRRop (READ(b), (a), (x)))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Define the following before including this file:
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * BRESSOLID name of function for drawing a solid segment
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * BRESDASH name of function for drawing a dashed segment
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * DOTS name of function for drawing dots
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * ARC name of function for drawing a solid arc
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * BITS type of underlying unit
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bits = ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (e >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bits = ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if ((e += e1) >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if ((e += e1) >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if ((e += e1) >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if ((e += e1) >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync FbStride bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync lr = coordToInt(pBox->x2 - xorg - 1, pBox->y2 - yorg - 1);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bits += bitsStride * (yorg + yoff) + (xorg + xoff) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync yorgop = bits + ((info.yorgo + drawY) * bitsStride);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (do360 && (arc->width == arc->height) && !(arc->width & 1))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync UNIT *yorghb = yorgp + (info.h * bitsStride) + info.xorg;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define WRITE1(d,n,fg) WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync# define WRITE2(d,n,fg) WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync# define WRITE2(d,n,fg) (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync# define WRITE4(d,n,fg) WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync# define WRITE4(d,n,fg) (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync switch (FbStipMoveLsb (FbLeftStipBits (bits, n), 4, n)) {
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip (pGC));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsBase = ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (e >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (e >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip (pGC));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bitsBase = ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync dstX = (x1 + xoff + dstXoff) * (sizeof (UNIT) * 8 * MUL);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync dstLine = dst + (intToY(pt1) + yoff + dstYoff) * dstStride;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync FbMaskBits (dstX, width, startmask, nmiddle, endmask);
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, startmask));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync WRITE(dstLine, FbDoRRop (READ(dstLine), andBits, xorBits));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, endmask));
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (e >= 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync if (e >= 0)