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