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