a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * Copyright © 1998 Keith Packard
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 * 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 * This file defines functions for drawing some primitives using
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * underlying datatypes instead of masks
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define isClipped(c,ul,lr) (((c) | ((c) - (ul)) | ((lr) - (c))) & 0x80008000)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define RROP(b,a,x) WRITE((b), FbDoRRop (READ(b), (a), (x)))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * Define the following before including this file:
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 int signdy, int axis, int x1, int y1, int e, int e1, int e3, int len)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync fbGetDrawable(pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (len--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (e >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync int signdy, int axis, int x1, int y1, int e, int e1, int e3, int len)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync fbGetDrawable(pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync ((UNIT *) (dst + ((y1 + dstYoff) * dstStride))) + (x1 + dstXoff) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if ((e += e1) >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if ((e += e1) >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if ((e += e1) >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if ((e += e1) >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync int npt, int xorg, int yorg, int xoff, int yoff, FbBits and, FbBits xor)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync FbStride bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync lr = coordToInt(pBox->x2 - xorg - 1, pBox->y2 - yorg - 1);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bits += bitsStride * (yorg + yoff) + (xorg + xoff) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (and == 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (npt--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (npt--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync point = bits + intToY(pt) * bitsStride + intToX(pt) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync int dstBpp, xArc * arc, int drawX, int drawY, FbBits and, FbBits xor)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync yorgop = bits + ((info.yorgo + drawY) * bitsStride);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (do360 && (arc->width == arc->height) && !(arc->width & 1)) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync UNIT *yorghb = yorgp + (info.h * bitsStride) + info.xorg;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (1) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define WRITE1(d,n,fg) WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define WRITE2(d,n,fg) WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define WRITE2(d,n,fg) (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define WRITE4(d,n,fg) WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync#define WRITE4(d,n,fg) (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync int dstBpp, FbStip * stipple, FbBits fg, int x, int height)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync switch (FbStipMoveLsb(FbLeftStipBits(bits, n), 4, n)) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip(pGC));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync fbGetDrawable(pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (isClipped(pt1, ul, lr) | isClipped(pt2, ul, lr)) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync npt == 0 && pGC->capStyle != CapNotLast, &dashoffset);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (and == 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (len--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (e >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (len--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (e >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncPOLYSEGMENT(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg)
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync BoxPtr pBox = RegionExtents(fbGetCompositeClip(pGC));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync fbGetDrawable(pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bitsStride = dstStride * (sizeof(FbBits) / sizeof(UNIT));
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync ((UNIT *) dst) + (yoff + dstYoff) * bitsStride + (xoff + dstXoff) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync lr = coordToInt(pBox->x2 - xoff - 1, pBox->y2 - yoff - 1);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (nseg--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (isClipped(pt1, ul, lr) | isClipped(pt2, ul, lr)) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync dstX = (x1 + xoff + dstXoff) * (sizeof(UNIT) * 8 * MUL);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync dstLine = dst + (intToY(pt1) + yoff + dstYoff) * dstStride;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync FbMaskBits(dstX, width, startmask, nmiddle, endmask);
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync bits = bitsBase + intToY(pt1) * bitsStride + intToX(pt1) * MUL;
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (and == 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (len--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (e >= 0) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync while (len--) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync if (e >= 0) {