4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Copyright © 1998 Keith Packard
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
4c221b0da1816acf2ca302b10092df059484468dvboxsync * documentation for any purpose is hereby granted without fee, provided that
4c221b0da1816acf2ca302b10092df059484468dvboxsync * the above copyright notice appear in all copies and that both that
4c221b0da1816acf2ca302b10092df059484468dvboxsync * copyright notice and this permission notice appear in supporting
4c221b0da1816acf2ca302b10092df059484468dvboxsync * documentation, and that the name of Keith Packard not be used in
4c221b0da1816acf2ca302b10092df059484468dvboxsync * advertising or publicity pertaining to distribution of the software without
4c221b0da1816acf2ca302b10092df059484468dvboxsync * specific, written prior permission. Keith Packard makes no
4c221b0da1816acf2ca302b10092df059484468dvboxsync * representations about the suitability of this software for any purpose. It
4c221b0da1816acf2ca302b10092df059484468dvboxsync * is provided "as is" without express or implied warranty.
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
4c221b0da1816acf2ca302b10092df059484468dvboxsync * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
4c221b0da1816acf2ca302b10092df059484468dvboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
4c221b0da1816acf2ca302b10092df059484468dvboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
4c221b0da1816acf2ca302b10092df059484468dvboxsync * PERFORMANCE OF THIS SOFTWARE.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * This file defines functions for drawing some primitives using
4c221b0da1816acf2ca302b10092df059484468dvboxsync * underlying datatypes instead of masks
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define isClipped(c,ul,lr) (((c) | ((c) - (ul)) | ((lr) - (c))) & 0x80008000)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef HAVE_DIX_CONFIG_H
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <dix-config.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITSMUL
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define MUL BITSMUL
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define MUL 1
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITSSTORE
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define STORE(b,x) BITSSTORE(b,x)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define STORE(b,x) WRITE((b), (x))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITSRROP
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define RROP(b,a,x) BITSRROP(b,a,x)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define RROP(b,a,x) WRITE((b), FbDoRRop (READ(b), (a), (x)))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITSUNIT
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define UNIT BITSUNIT
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define USE_SOLID
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define UNIT BITS
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Define the following before including this file:
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * BRESSOLID name of function for drawing a solid segment
4c221b0da1816acf2ca302b10092df059484468dvboxsync * BRESDASH name of function for drawing a dashed segment
4c221b0da1816acf2ca302b10092df059484468dvboxsync * DOTS name of function for drawing dots
4c221b0da1816acf2ca302b10092df059484468dvboxsync * ARC name of function for drawing a solid arc
4c221b0da1816acf2ca302b10092df059484468dvboxsync * BITS type of underlying unit
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BRESSOLID
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncBRESSOLID (DrawablePtr pDrawable,
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCPtr pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dashOffset,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int signdx,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int signdy,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int axis,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int x1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int y1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e3,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits *dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstXoff, dstYoff;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride majorStep, minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS xor = (BITS) pPriv->xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (signdy < 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = -bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (axis == X_AXIS)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync majorStep = signdx * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync minorStep = bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync majorStep = bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync minorStep = signdx * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (len--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += majorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BRESDASH
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncBRESDASH (DrawablePtr pDrawable,
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCPtr pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dashOffset,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int signdx,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int signdy,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int axis,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int x1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int y1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e1,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e3,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits *dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstXoff, dstYoff;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride majorStep, minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS xorfg, xorbg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashDeclare;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dashlen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync Bool even;
4c221b0da1816acf2ca302b10092df059484468dvboxsync Bool doOdd;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync doOdd = pGC->lineStyle == LineDoubleDash;
4c221b0da1816acf2ca302b10092df059484468dvboxsync xorfg = (BITS) pPriv->xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync xorbg = (BITS) pPriv->bgxor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (signdy < 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = -bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (axis == X_AXIS)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync majorStep = signdx * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync minorStep = bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync majorStep = bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync minorStep = signdx * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (dashlen >= len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync dashlen = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (doOdd)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!even)
4c221b0da1816acf2ca302b10092df059484468dvboxsync goto doubleOdd;
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (;;)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync len -= dashlen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (dashlen--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xorfg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += majorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((e += e1) >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashNextEven(dashlen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (dashlen >= len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync dashlen = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsyncdoubleOdd:
4c221b0da1816acf2ca302b10092df059484468dvboxsync len -= dashlen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (dashlen--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xorbg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += majorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((e += e1) >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashNextOdd(dashlen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (dashlen >= len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync dashlen = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!even)
4c221b0da1816acf2ca302b10092df059484468dvboxsync goto onOffOdd;
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (;;)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync len -= dashlen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (dashlen--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xorfg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += majorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((e += e1) >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashNextEven (dashlen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (dashlen >= len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync dashlen = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsynconOffOdd:
4c221b0da1816acf2ca302b10092df059484468dvboxsync len -= dashlen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (dashlen--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += majorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((e += e1) >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += minorStep;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbDashNextOdd (dashlen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (dashlen >= len)
4c221b0da1816acf2ca302b10092df059484468dvboxsync dashlen = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef DOTS
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncDOTS (FbBits *dst,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride dstStride,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp,
4c221b0da1816acf2ca302b10092df059484468dvboxsync BoxPtr pBox,
4c221b0da1816acf2ca302b10092df059484468dvboxsync xPoint *ptsOrig,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int npt,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int xorg,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int yorg,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int xoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int yoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits and,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits xor)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 *pts = (INT32 *) ptsOrig;
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits = (UNIT *) dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *point;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS bxor = (BITS) xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS band = (BITS) and;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 ul, lr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 pt;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync ul = coordToInt(pBox->x1 - xorg, pBox->y1 - yorg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync lr = coordToInt(pBox->x2 - xorg - 1, pBox->y2 - yorg - 1);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += bitsStride * (yorg + yoff) + (xorg + xoff) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (and == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (npt--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!isClipped(pt,ul,lr))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(point,bxor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (npt--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!isClipped(pt,ul,lr))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync RROP(point,band,bxor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef ARC
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define ARCCOPY(d) STORE(d,xorBits)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define ARCRROP(d) RROP(d,andBits,xorBits)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncARC (FbBits *dst,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride dstStride,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp,
4c221b0da1816acf2ca302b10092df059484468dvboxsync xArc *arc,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int drawX,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int drawY,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits and,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits xor)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync miZeroArcRec info;
4c221b0da1816acf2ca302b10092df059484468dvboxsync Bool do360;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int x;
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *yorgp, *yorgop;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS andBits, xorBits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int yoffset, dyoffset;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int y, a, b, d, mask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int k1, k3, dx, dy;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = (UNIT *) dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync andBits = (BITS) and;
4c221b0da1816acf2ca302b10092df059484468dvboxsync xorBits = (BITS) xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync do360 = miZeroArcSetup(arc, &info, TRUE);
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgp = bits + ((info.yorg + drawY) * bitsStride);
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgop = bits + ((info.yorgo + drawY) * bitsStride);
4c221b0da1816acf2ca302b10092df059484468dvboxsync info.xorg = (info.xorg + drawX) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync info.xorgo = (info.xorgo + drawX) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCSETUP();
4c221b0da1816acf2ca302b10092df059484468dvboxsync yoffset = y ? bitsStride : 0;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dyoffset = 0;
4c221b0da1816acf2ca302b10092df059484468dvboxsync mask = info.initialMask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!(arc->width & 1))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + info.xorgo);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop + info.xorgo);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + info.xorgo);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop + info.xorgo);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!info.end.x || !info.end.y)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync mask = info.end.mask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync info.end = info.altend;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (do360 && (arc->width == arc->height) && !(arc->width & 1))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync int xoffset = bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *yorghb = yorgp + (info.h * bitsStride) + info.xorg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *yorgohb = yorghb - info.h * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgp += info.xorg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgop += info.xorg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorghb += info.h * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (a < 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorghb - xoffset - y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgohb - xoffset + y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgohb + xoffset + y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorghb + xoffset - y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorghb - xoffset - y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgohb - xoffset + y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgohb + xoffset + y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorghb + xoffset - y * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync xoffset += bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCCIRCLESTEP(yoffset += bitsStride;);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgp -= info.xorg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync yorgop -= info.xorg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync x = info.w;
4c221b0da1816acf2ca302b10092df059484468dvboxsync yoffset = info.h * bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else if (do360)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (y < info.h || x < info.w)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCOCTANTSHIFT(dyoffset = bitsStride;);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (y < info.h || x < info.w)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCOCTANTSHIFT(dyoffset = bitsStride;);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((x == info.start.x) || (y == info.start.y))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync mask = info.start.mask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync info.start = info.altstart;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 4)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 4)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((x == info.end.x) || (y == info.end.y))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync mask = info.end.mask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync info.end = info.altend;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if ((x == info.start.x) || (y == info.start.y))
4c221b0da1816acf2ca302b10092df059484468dvboxsync mask = info.start.mask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (andBits == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 4)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (arc->height & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 4)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (arc->height & 1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mask & 8)
4c221b0da1816acf2ca302b10092df059484468dvboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef ARCCOPY
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef ARCRROP
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef GLYPH
4c221b0da1816acf2ca302b10092df059484468dvboxsync#if BITMAP_BIT_ORDER == LSBFirst
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR1(n) (n)
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR2(n) (n)
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR4(n) (n)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR1(n) ((n) ^ 3)
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR2(n) ((n) ^ 2)
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE_ADDR4(n) ((n))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define WRITE1(d,n,fg) WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITS2
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE2(d,n,fg) WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE2(d,n,fg) (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef BITS4
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE4(d,n,fg) WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#else
4c221b0da1816acf2ca302b10092df059484468dvboxsync# define WRITE4(d,n,fg) (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncGLYPH (FbBits *dstBits,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride dstStride,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStip *stipple,
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits fg,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int x,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int height)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync int lshift;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStip bits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS *dstLine;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS *dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int n;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int shift;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine = (BITS *) dstBits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine += x & ~3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstStride *= (sizeof (FbBits) / sizeof (BITS));
4c221b0da1816acf2ca302b10092df059484468dvboxsync shift = x & 3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync lshift = 4 - shift;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (height--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = *stipple++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dst = (BITS *) dstLine;
4c221b0da1816acf2ca302b10092df059484468dvboxsync n = lshift;
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (bits)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync switch (FbStipMoveLsb (FbLeftStipBits (bits, n), 4, n)) {
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 0:
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 1:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 2:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,1,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 3:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 4:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 5:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 6:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,1,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 7:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 8:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,3,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 9:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,3,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 10:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,1,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,3,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 11:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,3,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 12:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 13:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 14:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE1(dst,1,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE2(dst,2,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync case 15:
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE4(dst,0,fg);
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = FbStipLeft (bits, n);
4c221b0da1816acf2ca302b10092df059484468dvboxsync n = 4;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dst += 4;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine += dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE_ADDR1
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE_ADDR2
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE_ADDR4
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE1
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE2
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef WRITE4
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef POLYLINE
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncPOLYLINE (DrawablePtr pDrawable,
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCPtr pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int mode,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int npt,
4c221b0da1816acf2ca302b10092df059484468dvboxsync DDXPointPtr ptsOrig)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 *pts = (INT32 *) ptsOrig;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int xoff = pDrawable->x;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int yoff = pDrawable->y;
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip (pGC));
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits *dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstXoff, dstYoff;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits, *bitsBase;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS xor = fbGetGCPrivate(pGC)->xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS and = fbGetGCPrivate(pGC)->and;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dashoffset = 0;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 ul, lr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 pt1, pt2;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e, e1, e3, len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int stepmajor, stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int octant;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (mode == CoordModePrevious)
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFixCoordModePrevious (npt, ptsOrig);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsBase = ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync ul = coordToInt(pBox->x1 - xoff, pBox->y1 - yoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt1 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync npt--;
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt2 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync npt--;
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (;;)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbSegment (pDrawable, pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt1) + xoff, intToY(pt1) + yoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt2) + xoff, intToY(pt2) + yoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync npt == 0 && pGC->capStyle != CapNotLast,
4c221b0da1816acf2ca302b10092df059484468dvboxsync &dashoffset);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!npt) {
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync return;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt1 = pt2;
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt2 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync npt--;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (;;)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync CalcLineDeltas (intToX(pt1), intToY(pt1),
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt2), intToY(pt2),
4c221b0da1816acf2ca302b10092df059484468dvboxsync len, e1, stepmajor, stepminor, 1, bitsStride,
4c221b0da1816acf2ca302b10092df059484468dvboxsync octant);
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepmajor *= MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (len < e1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync len = e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e1 = e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepminor = stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepmajor = e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync SetYMajorOctant(octant);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync e = -len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e1 <<= 1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = e << 1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FIXUP_ERROR (e, octant, bias);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (and == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (len--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (len--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync RROP(bits,and,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!npt)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (pGC->capStyle != CapNotLast &&
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt2 != *((INT32 *) ptsOrig))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync RROP(bits,and,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync return;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt1 = pt2;
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt2 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync --npt;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (isClipped (pt2, ul, lr))
4c221b0da1816acf2ca302b10092df059484468dvboxsync break;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef POLYSEGMENT
4c221b0da1816acf2ca302b10092df059484468dvboxsyncvoid
4c221b0da1816acf2ca302b10092df059484468dvboxsyncPOLYSEGMENT (DrawablePtr pDrawable,
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCPtr pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync int nseg,
4c221b0da1816acf2ca302b10092df059484468dvboxsync xSegment *pseg)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 *pts = (INT32 *) pseg;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int xoff = pDrawable->x;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int yoff = pDrawable->y;
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip (pGC));
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits *dst;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstBpp;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstXoff, dstYoff;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync UNIT *bits, *bitsBase;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbStride bitsStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits xorBits = fbGetGCPrivate(pGC)->xor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits andBits = fbGetGCPrivate(pGC)->and;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS xor = xorBits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync BITS and = andBits;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dashoffset = 0;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 ul, lr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync INT32 pt1, pt2;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync int e, e1, e3, len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int stepmajor, stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int octant;
4c221b0da1816acf2ca302b10092df059484468dvboxsync Bool capNotLast;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
4c221b0da1816acf2ca302b10092df059484468dvboxsync bitsBase = ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync ul = coordToInt(pBox->x1 - xoff, pBox->y1 - yoff);
4c221b0da1816acf2ca302b10092df059484468dvboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync capNotLast = pGC->capStyle == CapNotLast;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (nseg--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt1 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync pt2 = *pts++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbSegment (pDrawable, pGC,
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt1) + xoff, intToY(pt1) + yoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt2) + xoff, intToY(pt2) + yoff,
4c221b0da1816acf2ca302b10092df059484468dvboxsync !capNotLast, &dashoffset);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync CalcLineDeltas (intToX(pt1), intToY(pt1),
4c221b0da1816acf2ca302b10092df059484468dvboxsync intToX(pt2), intToY(pt2),
4c221b0da1816acf2ca302b10092df059484468dvboxsync len, e1, stepmajor, stepminor, 1, bitsStride,
4c221b0da1816acf2ca302b10092df059484468dvboxsync octant);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e1 == 0 && len > 3
4c221b0da1816acf2ca302b10092df059484468dvboxsync#if MUL != 1
4c221b0da1816acf2ca302b10092df059484468dvboxsync && FbCheck24Pix(and) && FbCheck24Pix(xor)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync )
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync int x1, x2;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits *dstLine;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int dstX, width;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbBits startmask, endmask;
4c221b0da1816acf2ca302b10092df059484468dvboxsync int nmiddle;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (stepmajor < 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync x1 = intToX(pt2);
4c221b0da1816acf2ca302b10092df059484468dvboxsync x2 = intToX(pt1) + 1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (capNotLast)
4c221b0da1816acf2ca302b10092df059484468dvboxsync x1++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync x1 = intToX(pt1);
4c221b0da1816acf2ca302b10092df059484468dvboxsync x2 = intToX(pt2);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!capNotLast)
4c221b0da1816acf2ca302b10092df059484468dvboxsync x2++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstX = (x1 + xoff + dstXoff) * (sizeof (UNIT) * 8 * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync width = (x2 - x1) * (sizeof (UNIT) * 8 * MUL);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine = dst + (intToY(pt1) + yoff + dstYoff) * dstStride;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine += dstX >> FB_SHIFT;
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstX &= FB_MASK;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FbMaskBits (dstX, width, startmask, nmiddle, endmask);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (startmask)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, startmask));
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!andBits)
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (nmiddle--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE(dstLine++, xorBits);
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (nmiddle--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE(dstLine, FbDoRRop (READ(dstLine), andBits, xorBits));
4c221b0da1816acf2ca302b10092df059484468dvboxsync dstLine++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (endmask)
4c221b0da1816acf2ca302b10092df059484468dvboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, endmask));
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepmajor *= MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (len < e1)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync len = e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e1 = e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepminor = stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync stepmajor = e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync SetYMajorOctant(octant);
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync e = -len;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e1 <<= 1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e3 = e << 1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync FIXUP_ERROR (e, octant, bias);
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (!capNotLast)
4c221b0da1816acf2ca302b10092df059484468dvboxsync len++;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (and == 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (len--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync STORE(bits,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync else
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync while (len--)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync RROP(bits,and,xor);
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepmajor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e1;
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (e >= 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync bits += stepminor;
4c221b0da1816acf2ca302b10092df059484468dvboxsync e += e3;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync fbFinishAccess (pDrawable);
4c221b0da1816acf2ca302b10092df059484468dvboxsync}
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef MUL
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef STORE
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef RROP
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef UNIT
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef USE_SOLID
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#undef isClipped