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