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