b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Permission to use, copy, modify, distribute, and sell this software and its
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * documentation for any purpose is hereby granted without fee, provided that
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * the above copyright notice appear in all copies and that both that
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * copyright notice and this permission notice appear in supporting
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * documentation, and that the name of Keith Packard not be used in
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * advertising or publicity pertaining to distribution of the software without
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * specific, written prior permission. Keith Packard makes no
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * representations about the suitability of this software for any purpose. It
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * is provided "as is" without express or implied warranty.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * PERFORMANCE OF THIS SOFTWARE.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef HAVE_DIX_CONFIG_H
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#include <dix-config.h>
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifndef _FBPICT_H_
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define _FBPICT_H_
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#include "renderedge.h"
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#if defined(__GNUC__)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define INLINE __inline__
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define INLINE
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbGet8(v,i) ((CARD16) (CARD8) ((v) >> i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * There are two ways of handling alpha -- either as a single unified value or
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * a separate value for each component, hence each macro must have two
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * versions. The unified alpha version has a 'U' at the end of the name,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * the component version has a 'C'. Similarly, functions which deal with
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * this difference will have two versions using the same convention.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i),\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i),\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbIntMult(FbGet8(x,i),ax,(v))),\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (CARD32) ((CARD8) ((t) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (0 - ((t) >> 8)))) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Alpha(x) ((x) >> 24)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Red(x) (((x) >> 16) & 0xff)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Green(x) (((x) >> 8) & 0xff)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Blue(x) ((x) & 0xff)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/**
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Returns TRUE if the fbComposeGetSolid can be used to get a single solid
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * color representing every source sampling location of the picture.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncstatic INLINE Bool
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbCanGetSolid(PicturePtr pict)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync{
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (pict->pDrawable == NULL ||
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pict->pDrawable->width != 1 ||
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pict->pDrawable->height != 1)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return FALSE;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (pict->repeat != RepeatNormal)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return FALSE;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync switch (pict->format) {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_a8r8g8b8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_x8r8g8b8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_a8b8g8r8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_x8b8g8r8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_b8g8r8a8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_b8g8r8x8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_r8g8b8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_b8g8r8:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_r5g6b5:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case PICT_b5g6r5:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return TRUE;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync default:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return FALSE;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync }
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define fbComposeGetSolid(pict, bits, fmt) { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *__bits__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride __stride__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int __bpp__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int __xoff__,__yoff__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync switch (__bpp__) { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 32: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = READ((CARD32 *) __bits__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 24: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = Fetch24 ((CARD8 *) __bits__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 16: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = READ((CARD16 *) __bits__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = cvt0565to0888(bits); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 8: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = READ((CARD8 *) __bits__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = (bits) << 24; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync case 1: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = READ((CARD32 *) __bits__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync break; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync default: \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync return; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* If necessary, convert RGB <--> BGR. */ \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = (((bits) & 0xff000000) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (((bits) & 0x00ff0000) >> 16) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (((bits) & 0x0000ff00) >> 0) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (((bits) & 0x000000ff) << 16)); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* manage missing src alpha */ \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((pict)->pFormat->direct.alphaMask == 0) \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) |= 0xff000000; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbFinishAccess ((pict)->pDrawable); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbBits *__bits__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync FbStride __stride__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int __bpp__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int __xoff__,__yoff__; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (stride) = __stride__ * sizeof (FbBits) / sizeof (type); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (line) = ((type *) __bits__) + (stride) * ((y) + __yoff__) + (mul) * ((x) + __xoff__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (((s) >> 5) & 0x07e0) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (((s) >> 8) & 0xf800))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define cvt0565to0888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#if IMAGE_BYTE_ORDER == MSBFirst
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Fetch24(a) ((unsigned long) (a) & 1 ? \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ((READ(a) << 16) | READ((CARD16 *) ((a)+1))) : \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ((READ((CARD16 *) (a)) << 8) | READ((a)+2)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Store24(a,v) ((unsigned long) (a) & 1 ? \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (WRITE(a, (CARD8) ((v) >> 16)), \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE((CARD16 *) ((a)+1), (CARD16) (v))) : \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (WRITE((CARD16 *) (a), (CARD16) ((v) >> 8)), \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE((a)+2, (CARD8) (v))))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Fetch24(a) ((unsigned long) (a) & 1 ? \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (READ(a) | (READ((CARD16 *) ((a)+1)) << 8)) : \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (READ((CARD16 *) (a)) | (READ((a)+2) << 16)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define Store24(a,v) ((unsigned long) (a) & 1 ? \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (WRITE(a, (CARD8) (v)), \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE((CARD16 *) ((a)+1), (CARD16) ((v) >> 8))) : \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (WRITE((CARD16 *) (a), (CARD16) (v)),\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE((a)+2, (CARD8) ((v) >> 16))))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync The methods below use some tricks to be able to do two color
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync components at the same time.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteMul(x, a) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (x + ((x >> 8) & 0xff00ff)); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff00; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255 + y
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteMulAdd(x, a, y) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += y & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (x + ((x >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += (y >> 8) & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x <<= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a + y_c * b) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteAddMul(x, a, y, b) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x >> 24) * a + (y >> 24) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (x & 0xff00) * a + (y & 0xff00) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += (t >> 8) + 0x8000; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t >>= 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t <<= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (x & 0xff) * a + (y & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += (x >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a + y_c *b) / 256
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteAddMul_256(x, a, y, b) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff00; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a_c) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteMulC(x, a) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x & 0xff) * (a & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (x & 0xff) * ((a >> 8) & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= (x & 0xff0000) * (a >> 24); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = t + ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = r | (t & 0xff00ff00); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255 + y
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteMulAddC(x, a, y) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x & 0xff) * (a & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += y & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r |= 0x1000100 - ((r >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (x & 0xff) * ((a >> 8) & 0xff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= (x & 0xff0000) * (a >> 24); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += (y >> 8) & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = r | (t << 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a_c + y_c * b) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteAddMulC(x, a, y, b) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8) + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += (t >> 8) + 0x8000; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t >>= 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t <<= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += (x >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x >>= 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = min(x_c + y_c, 255)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbByteAdd(x, y) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x & 0xff00ff) + (y & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r |= 0x1000100 - ((r >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r |= (t & 0xff00ff) << 8; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = r; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#if defined(__i386__) && defined(__GNUC__)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FASTCALL __attribute__((regparm(3)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FASTCALL
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct _FbComposeData {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD8 op;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr src;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr mask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr dest;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xSrc;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 ySrc;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xMask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yMask;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xDest;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yDest;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 width;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 height;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} FbComposeData;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct _FbComposeFunctions {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CombineFuncU *combineU;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CombineFuncC *combineC;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CombineMaskU combineMaskU;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} FbComposeFunctions;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/* fbcompose.c */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbCompositeGeneral (CARD8 op,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 ySrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 width,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 height);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/* fbpict.c */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbComposite (CARD8 op,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 ySrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 width,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 height);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef void (*CompositeFunc) (CARD8 op,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 ySrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 width,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 height);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbWalkCompositeRegion (CARD8 op,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync PicturePtr pDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xSrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 ySrc,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yMask,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yDst,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 width,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD16 height,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool srcRepeat,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Bool maskRepeat,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CompositeFunc compositeRect);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/* fbtrap.c */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbAddTraps (PicturePtr pPicture,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xOff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yOff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int ntrap,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xTrap *traps);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbRasterizeTrapezoid (PicturePtr alpha,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xTrapezoid *trap,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int x_off,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int y_off);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern _X_EXPORT void
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbAddTriangles (PicturePtr pPicture,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 xOff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync INT16 yOff,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int ntri,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xTriangle *tris);
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif /* _FBPICT_H_ */