b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Copyright © 1998 Keith Packard
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
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 *
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 */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * This file defines functions for drawing some primitives using
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * underlying datatypes instead of masks
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define isClipped(c,ul,lr) ((((c) - (ul)) | ((lr) - (c))) & 0x80008000)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef HAVE_DIX_CONFIG_H
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#include <dix-config.h>
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITSMUL
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define MUL BITSMUL
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define MUL 1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITSSTORE
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define STORE(b,x) BITSSTORE(b,x)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define STORE(b,x) WRITE((b), (x))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITSRROP
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define RROP(b,a,x) BITSRROP(b,a,x)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define RROP(b,a,x) WRITE((b), FbDoRRop (READ(b), (a), (x)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITSUNIT
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define UNIT BITSUNIT
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define USE_SOLID
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define UNIT BITS
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Define the following before including this file:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
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 */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BRESSOLID
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncBRESSOLID (DrawablePtr pDrawable,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync GCPtr pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dashOffset,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int signdx,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int signdy,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int axis,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int y1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e3,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstXoff, dstYoff;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride majorStep, minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS xor = (BITS) pPriv->xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
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 (signdy < 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bitsStride = -bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (axis == X_AXIS)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync majorStep = signdx * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync minorStep = bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync majorStep = bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync minorStep = signdx * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (len--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += majorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BRESDASH
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncBRESDASH (DrawablePtr pDrawable,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync GCPtr pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dashOffset,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int signdx,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int signdy,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int axis,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int y1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e1,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e3,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstXoff, dstYoff;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride majorStep, minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS xorfg, xorbg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashDeclare;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dashlen;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool even;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool doOdd;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync doOdd = pGC->lineStyle == LineDoubleDash;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xorfg = (BITS) pPriv->xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xorbg = (BITS) pPriv->bgxor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (signdy < 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bitsStride = -bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (axis == X_AXIS)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync majorStep = signdx * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync minorStep = bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync majorStep = bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync minorStep = signdx * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (dashlen >= len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dashlen = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (doOdd)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!even)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync goto doubleOdd;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync for (;;)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len -= dashlen;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (dashlen--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xorfg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += majorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((e += e1) >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashNextEven(dashlen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (dashlen >= len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dashlen = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncdoubleOdd:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len -= dashlen;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (dashlen--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xorbg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += majorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((e += e1) >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashNextOdd(dashlen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (dashlen >= len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dashlen = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!even)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync goto onOffOdd;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync for (;;)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len -= dashlen;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (dashlen--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xorfg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += majorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((e += e1) >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashNextEven (dashlen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (dashlen >= len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dashlen = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynconOffOdd:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len -= dashlen;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (dashlen--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += majorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((e += e1) >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += minorStep;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbDashNextOdd (dashlen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (dashlen >= len)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dashlen = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef DOTS
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncDOTS (FbBits *dst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride dstStride,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BoxPtr pBox,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xPoint *ptsOrig,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int npt,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int xorg,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int yorg,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int xoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int yoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits and,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits xor)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 *pts = (INT32 *) ptsOrig;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits = (UNIT *) dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *point;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS bxor = (BITS) xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS band = (BITS) and;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 ul, lr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 pt;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ul = coordToInt(pBox->x1 - xorg, pBox->y1 - yorg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync lr = coordToInt(pBox->x2 - xorg - 1, pBox->y2 - yorg - 1);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += bitsStride * (yorg + yoff) + (xorg + xoff) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (and == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (npt--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!isClipped(pt,ul,lr))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(point,bxor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (npt--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!isClipped(pt,ul,lr))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync RROP(point,band,bxor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef ARC
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define ARCCOPY(d) STORE(d,xorBits)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define ARCRROP(d) RROP(d,andBits,xorBits)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncARC (FbBits *dst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride dstStride,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xArc *arc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int drawX,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int drawY,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits and,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits xor)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync miZeroArcRec info;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool do360;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *yorgp, *yorgop;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS andBits, xorBits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int yoffset, dyoffset;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int y, a, b, d, mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int k1, k3, dx, dy;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = (UNIT *) dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bitsStride = dstStride * (sizeof (FbBits) / sizeof (UNIT));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync andBits = (BITS) and;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xorBits = (BITS) xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync do360 = miZeroArcSetup(arc, &info, TRUE);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgp = bits + ((info.yorg + drawY) * bitsStride);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgop = bits + ((info.yorgo + drawY) * bitsStride);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync info.xorg = (info.xorg + drawX) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync info.xorgo = (info.xorgo + drawX) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCSETUP();
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yoffset = y ? bitsStride : 0;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dyoffset = 0;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync mask = info.initialMask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!(arc->width & 1))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + info.xorgo);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop + info.xorgo);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + info.xorgo);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop + info.xorgo);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!info.end.x || !info.end.y)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync mask = info.end.mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync info.end = info.altend;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (do360 && (arc->width == arc->height) && !(arc->width & 1))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int xoffset = bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *yorghb = yorgp + (info.h * bitsStride) + info.xorg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *yorgohb = yorghb - info.h * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgp += info.xorg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgop += info.xorg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorghb += info.h * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (a < 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorghb - xoffset - y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgohb - xoffset + y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgohb + xoffset + y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorghb + xoffset - y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorghb - xoffset - y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgohb - xoffset + y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgohb + xoffset + y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorghb + xoffset - y * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xoffset += bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCCIRCLESTEP(yoffset += bitsStride;);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgp -= info.xorg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yorgop -= info.xorg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = info.w;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync yoffset = info.h * bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else if (do360)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (y < info.h || x < info.w)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCOCTANTSHIFT(dyoffset = bitsStride;);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (y < info.h || x < info.w)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCOCTANTSHIFT(dyoffset = bitsStride;);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((x == info.start.x) || (y == info.start.y))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync mask = info.start.mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync info.start = info.altstart;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 4)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 4)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((x == info.end.x) || (y == info.end.y))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync mask = info.end.mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync info.end = info.altend;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync MIARCSTEP(yoffset += dyoffset;, yoffset += bitsStride;);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((x == info.start.x) || (y == info.start.y))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync mask = info.start.mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (andBits == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 4)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (arc->height & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCCOPY(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 4)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (arc->height & 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgp + yoffset + info.xorgo - x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mask & 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ARCRROP(yorgop - yoffset + info.xorg + x * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef ARCCOPY
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef ARCRROP
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef GLYPH
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#if BITMAP_BIT_ORDER == LSBFirst
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR1(n) (n)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR2(n) (n)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR4(n) (n)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR1(n) ((n) ^ 3)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR2(n) ((n) ^ 2)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE_ADDR4(n) ((n))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define WRITE1(d,n,fg) WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITS2
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE2(d,n,fg) WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE2(d,n,fg) (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef BITS4
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE4(d,n,fg) WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define WRITE4(d,n,fg) (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncGLYPH (FbBits *dstBits,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride dstStride,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStip *stipple,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits fg,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int height)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int lshift;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStip bits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS *dstLine;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS *dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int n;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int shift;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine = (BITS *) dstBits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine += x & ~3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstStride *= (sizeof (FbBits) / sizeof (BITS));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync shift = x & 3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync lshift = 4 - shift;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (height--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = *stipple++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dst = (BITS *) dstLine;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync n = lshift;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (bits)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync switch (FbStipMoveLsb (FbLeftStipBits (bits, n), 4, n)) {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 0:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 1:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 2:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,1,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 3:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 4:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 5:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 6:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,1,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 7:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,3,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 9:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,3,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 10:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,1,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,3,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 11:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,3,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 12:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 13:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 14:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE1(dst,1,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE2(dst,2,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 15:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE4(dst,0,fg);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = FbStipLeft (bits, n);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync n = 4;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dst += 4;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine += dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE_ADDR1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE_ADDR2
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE_ADDR4
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE2
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef WRITE4
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef POLYLINE
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncPOLYLINE (DrawablePtr pDrawable,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync GCPtr pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int mode,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int npt,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync DDXPointPtr ptsOrig)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 *pts = (INT32 *) ptsOrig;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int xoff = pDrawable->x;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int yoff = pDrawable->y;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BoxPtr pBox = REGION_EXTENTS (pDrawable->pScreen, fbGetCompositeClip (pGC));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstXoff, dstYoff;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits, *bitsBase;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS xor = fbGetGCPrivate(pGC)->xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS and = fbGetGCPrivate(pGC)->and;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dashoffset = 0;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 ul, lr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 pt1, pt2;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e, e1, e3, len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int stepmajor, stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int octant;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (mode == CoordModePrevious)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFixCoordModePrevious (npt, ptsOrig);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
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 ul = coordToInt(pBox->x1 - xoff, pBox->y1 - yoff);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt1 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync npt--;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt2 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync npt--;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync for (;;)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbSegment (pDrawable, pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt1) + xoff, intToY(pt1) + yoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt2) + xoff, intToY(pt2) + yoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync npt == 0 && pGC->capStyle != CapNotLast,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync &dashoffset);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!npt) {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt1 = pt2;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt2 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync npt--;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync for (;;)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CalcLineDeltas (intToX(pt1), intToY(pt1),
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt2), intToY(pt2),
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len, e1, stepmajor, stepminor, 1, bitsStride,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync octant);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepmajor *= MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (len < e1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len = e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e1 = e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepminor = stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepmajor = e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync SetYMajorOctant(octant);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e = -len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e1 <<= 1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = e << 1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FIXUP_ERROR (e, octant, bias);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (and == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (len--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (len--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync RROP(bits,and,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!npt)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (pGC->capStyle != CapNotLast &&
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt2 != *((INT32 *) ptsOrig))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync RROP(bits,and,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt1 = pt2;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt2 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync --npt;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (isClipped (pt2, ul, lr))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef POLYSEGMENT
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncvoid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncPOLYSEGMENT (DrawablePtr pDrawable,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync GCPtr pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int nseg,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xSegment *pseg)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 *pts = (INT32 *) pseg;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int xoff = pDrawable->x;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int yoff = pDrawable->y;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BoxPtr pBox = REGION_EXTENTS (pDrawable->pScreen, fbGetCompositeClip (pGC));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *dst;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstBpp;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstXoff, dstYoff;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync UNIT *bits, *bitsBase;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride bitsStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits xorBits = fbGetGCPrivate(pGC)->xor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits andBits = fbGetGCPrivate(pGC)->and;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS xor = xorBits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync BITS and = andBits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dashoffset = 0;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 ul, lr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT32 pt1, pt2;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int e, e1, e3, len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int stepmajor, stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int octant;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool capNotLast;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
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 ul = coordToInt(pBox->x1 - xoff, pBox->y1 - yoff);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync capNotLast = pGC->capStyle == CapNotLast;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (nseg--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt1 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pt2 = *pts++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (isClipped (pt1, ul, lr) | isClipped (pt2, ul, lr))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbSegment (pDrawable, pGC,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt1) + xoff, intToY(pt1) + yoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt2) + xoff, intToY(pt2) + yoff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync !capNotLast, &dashoffset);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CalcLineDeltas (intToX(pt1), intToY(pt1),
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync intToX(pt2), intToY(pt2),
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len, e1, stepmajor, stepminor, 1, bitsStride,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync octant);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e1 == 0 && len > 3
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#if MUL != 1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync && FbCheck24Pix(and) && FbCheck24Pix(xor)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync )
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x1, x2;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *dstLine;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int dstX, width;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits startmask, endmask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int nmiddle;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (stepmajor < 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x1 = intToX(pt2);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x2 = intToX(pt1) + 1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (capNotLast)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x1++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x1 = intToX(pt1);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x2 = intToX(pt2);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!capNotLast)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x2++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstX = (x1 + xoff + dstXoff) * (sizeof (UNIT) * 8 * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync width = (x2 - x1) * (sizeof (UNIT) * 8 * MUL);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine = dst + (intToY(pt1) + yoff + dstYoff) * dstStride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine += dstX >> FB_SHIFT;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstX &= FB_MASK;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbMaskBits (dstX, width, startmask, nmiddle, endmask);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (startmask)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, startmask));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!andBits)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (nmiddle--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE(dstLine++, xorBits);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (nmiddle--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE(dstLine, FbDoRRop (READ(dstLine), andBits, xorBits));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync dstLine++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (endmask)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, endmask));
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepmajor *= MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (len < e1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len = e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e1 = e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepminor = stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync stepmajor = e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync SetYMajorOctant(octant);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e = -len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e1 <<= 1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e3 = e << 1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FIXUP_ERROR (e, octant, bias);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (!capNotLast)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync len++;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (and == 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (len--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync STORE(bits,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync while (len--)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync RROP(bits,and,xor);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepmajor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e1;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (e >= 0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync bits += stepminor;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync e += e3;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess (pDrawable);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef MUL
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef STORE
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef RROP
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef UNIT
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef USE_SOLID
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#undef isClipped