/* * $XFree86: xc/programs/Xserver/fb/fbpict.h,v 1.7 2001/07/18 10:15:02 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef _FBPICT_H_ #define _FBPICT_H_ #define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) #define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b)) #define FbGet8(v,i) ((CARD16) (CARD8) ((v) >> i)) /* * There are two ways of handling alpha -- either as a single unified value or * a separate value for each component, hence each macro must have two * versions. The unified alpha version has a 'U' at the end of the name, * the component version has a 'C'. Similarly, functions which deal with * this difference will have two versions using the same convention. */ #define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i),\ (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) #define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i),\ (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) #define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i)) #define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i)) #define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \ FbIntMult(FbGet8(x,i),ax,(v))),\ (CARD32) ((CARD8) ((t) | \ (0 - ((t) >> 8)))) << (i)) #define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \ (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) typedef void (*CompositeFunc) (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); typedef struct _FbCompositeOperand FbCompositeOperand; typedef CARD32 (*FbCompositeFetch)(FbCompositeOperand *op); typedef void (*FbCompositeStore) (FbCompositeOperand *op, CARD32 value); typedef void (*FbCompositeStep) (FbCompositeOperand *op); typedef void (*FbCompositeSet) (FbCompositeOperand *op, int x, int y); struct _FbCompositeOperand { union { struct { FbBits *top_line; int left_offset; int start_offset; FbBits *line; CARD32 offset; FbStride stride; int bpp; } drawable; struct { int alpha_dx; int alpha_dy; } external; struct { int top_y; int left_x; int start_x; int x; int y; PictTransformPtr transform; int filter; } transform; } u; FbCompositeFetch fetch; FbCompositeFetch fetcha; FbCompositeStore store; FbCompositeStep over; FbCompositeStep down; FbCompositeSet set; miIndexedPtr indexed; RegionPtr clip; }; typedef void (*FbCombineFunc) (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); /* * indexed by op */ extern FbCombineFunc fbCombineFunc[]; typedef struct _FbAccessMap { CARD32 format; FbCompositeFetch fetch; FbCompositeFetch fetcha; FbCompositeStore store; } FbAccessMap; /* * search on format */ extern FbAccessMap fbAccessMap[]; /* fbcompose.c */ typedef struct _fbCompSrc { CARD32 value; CARD32 alpha; } FbCompSrc; /* * All compositing operators * */ CARD32 fbCombineMaskU (FbCompositeOperand *src, FbCompositeOperand *msk); FbCompSrc fbCombineMaskC (FbCompositeOperand *src, FbCompositeOperand *msk); CARD32 fbCombineMaskValueC (FbCompositeOperand *src, FbCompositeOperand *msk); CARD32 fbCombineMaskAlphaU (FbCompositeOperand *src, FbCompositeOperand *msk); CARD32 fbCombineMaskAlphaC (FbCompositeOperand *src, FbCompositeOperand *msk); #if 0 CARD32 FbCombineMask (FbCompositeOperand *src, FbCompositeOperand *msk); #endif void fbCombineClear (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineSrcU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineSrcC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDst (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOverU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOverC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOverReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOverReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineInU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineInC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineInReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineInReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOutU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOutC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOutReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineOutReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAtopU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAtopC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAtopReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAtopReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineXorU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineXorC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAddU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineAddC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineSaturateU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineSaturateC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); CARD8 fbCombineDisjointOutPart (CARD8 a, CARD8 b); CARD8 fbCombineDisjointInPart (CARD8 a, CARD8 b); void fbCombineDisjointGeneralU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst, CARD8 combine); void fbCombineDisjointGeneralC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst, CARD8 combine); void fbCombineDisjointOverU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointOverC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); #define fbCombineDisjointOverReverseU fbCombineSaturateU #define fbCombineDisjointOverReverseC fbCombineSaturateC void fbCombineDisjointInU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointInC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointInReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointInReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointOutU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointOutC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointOutReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointOutReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointAtopU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointAtopC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointAtopReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointAtopReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointXorU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineDisjointXorC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); CARD8 fbCombineConjointOutPart (CARD8 a, CARD8 b); CARD8 fbCombineConjointInPart (CARD8 a, CARD8 b); void fbCombineConjointGeneralU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst, CARD8 combine); void fbCombineConjointGeneralC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst, CARD8 combine); void fbCombineConjointOverU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOverC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOverReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOverReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointInU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointInC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointInReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointInReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOutU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOutC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOutReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointOutReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointAtopU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointAtopC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointAtopReverseU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointAtopReverseC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointXorU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); void fbCombineConjointXorC (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst); /* * All fetch functions */ CARD32 fbFetch_a8r8g8b8 (FbCompositeOperand *op); CARD32 fbFetch_x8r8g8b8 (FbCompositeOperand *op); CARD32 fbFetch_a8b8g8r8 (FbCompositeOperand *op); CARD32 fbFetch_x8b8g8r8 (FbCompositeOperand *op); CARD32 fbFetch_r8g8b8 (FbCompositeOperand *op); CARD32 fbFetch_b8g8r8 (FbCompositeOperand *op); CARD32 fbFetch_r5g6b5 (FbCompositeOperand *op); CARD32 fbFetch_b5g6r5 (FbCompositeOperand *op); CARD32 fbFetch_a1r5g5b5 (FbCompositeOperand *op); CARD32 fbFetch_x1r5g5b5 (FbCompositeOperand *op); CARD32 fbFetch_a1b5g5r5 (FbCompositeOperand *op); CARD32 fbFetch_x1b5g5r5 (FbCompositeOperand *op); CARD32 fbFetch_a4r4g4b4 (FbCompositeOperand *op); CARD32 fbFetch_x4r4g4b4 (FbCompositeOperand *op); CARD32 fbFetch_a4b4g4r4 (FbCompositeOperand *op); CARD32 fbFetch_x4b4g4r4 (FbCompositeOperand *op); CARD32 fbFetch_a8 (FbCompositeOperand *op); CARD32 fbFetcha_a8 (FbCompositeOperand *op); CARD32 fbFetch_r3g3b2 (FbCompositeOperand *op); CARD32 fbFetch_b2g3r3 (FbCompositeOperand *op); CARD32 fbFetch_a2r2g2b2 (FbCompositeOperand *op); CARD32 fbFetch_a2b2g2r2 (FbCompositeOperand *op); CARD32 fbFetch_c8 (FbCompositeOperand *op); CARD32 fbFetch_a4 (FbCompositeOperand *op); CARD32 fbFetcha_a4 (FbCompositeOperand *op); CARD32 fbFetch_r1g2b1 (FbCompositeOperand *op); CARD32 fbFetch_b1g2r1 (FbCompositeOperand *op); CARD32 fbFetch_a1r1g1b1 (FbCompositeOperand *op); CARD32 fbFetch_a1b1g1r1 (FbCompositeOperand *op); CARD32 fbFetch_c4 (FbCompositeOperand *op); CARD32 fbFetch_a1 (FbCompositeOperand *op); CARD32 fbFetcha_a1 (FbCompositeOperand *op); CARD32 fbFetch_g1 (FbCompositeOperand *op); void fbStore_a8r8g8b8 (FbCompositeOperand *op, CARD32 value); void fbStore_x8r8g8b8 (FbCompositeOperand *op, CARD32 value); void fbStore_a8b8g8r8 (FbCompositeOperand *op, CARD32 value); void fbStore_x8b8g8r8 (FbCompositeOperand *op, CARD32 value); void fbStore_r8g8b8 (FbCompositeOperand *op, CARD32 value); void fbStore_b8g8r8 (FbCompositeOperand *op, CARD32 value); void fbStore_r5g6b5 (FbCompositeOperand *op, CARD32 value); void fbStore_b5g6r5 (FbCompositeOperand *op, CARD32 value); void fbStore_a1r5g5b5 (FbCompositeOperand *op, CARD32 value); void fbStore_x1r5g5b5 (FbCompositeOperand *op, CARD32 value); void fbStore_a1b5g5r5 (FbCompositeOperand *op, CARD32 value); void fbStore_x1b5g5r5 (FbCompositeOperand *op, CARD32 value); void fbStore_a4r4g4b4 (FbCompositeOperand *op, CARD32 value); void fbStore_x4r4g4b4 (FbCompositeOperand *op, CARD32 value); void fbStore_a4b4g4r4 (FbCompositeOperand *op, CARD32 value); void fbStore_x4b4g4r4 (FbCompositeOperand *op, CARD32 value); void fbStore_a8 (FbCompositeOperand *op, CARD32 value); void fbStore_r3g3b2 (FbCompositeOperand *op, CARD32 value); void fbStore_b2g3r3 (FbCompositeOperand *op, CARD32 value); void fbStore_a2r2g2b2 (FbCompositeOperand *op, CARD32 value); void fbStore_c8 (FbCompositeOperand *op, CARD32 value); void fbStore_g8 (FbCompositeOperand *op, CARD32 value); void fbStore_a4 (FbCompositeOperand *op, CARD32 value); void fbStore_r1g2b1 (FbCompositeOperand *op, CARD32 value); void fbStore_b1g2r1 (FbCompositeOperand *op, CARD32 value); void fbStore_a1r1g1b1 (FbCompositeOperand *op, CARD32 value); void fbStore_a1b1g1r1 (FbCompositeOperand *op, CARD32 value); void fbStore_c4 (FbCompositeOperand *op, CARD32 value); void fbStore_g4 (FbCompositeOperand *op, CARD32 value); void fbStore_a1 (FbCompositeOperand *op, CARD32 value); void fbStore_g1 (FbCompositeOperand *op, CARD32 value); CARD32 fbFetch_external (FbCompositeOperand *op); CARD32 fbFetch_transform (FbCompositeOperand *op); CARD32 fbFetcha_transform (FbCompositeOperand *op); CARD32 fbFetcha_external (FbCompositeOperand *op); void fbStore_external (FbCompositeOperand *op, CARD32 value); Bool fbBuildOneCompositeOperand (PicturePtr pPict, FbCompositeOperand *op, INT16 x, INT16 y); Bool fbBuildCompositeOperand (PicturePtr pPict, FbCompositeOperand *op, INT16 x, INT16 y, Bool transform, Bool alpha); void fbCompositeGeneral (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); /* fbpict.c */ CARD32 fbOver (CARD32 x, CARD32 y); CARD32 fbOver24 (CARD32 x, CARD32 y); CARD32 fbIn (CARD32 x, CARD8 y); void fbCompositeSolidMask_nx8x8888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSolidMask_nx8x0888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSolidMask_nx8888x8888C (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSolidMask_nx8x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSolidMask_nx8888x0565C (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrc_8888x8888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrc_8888x0888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrc_8888x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrc_0565x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrcAdd_8000x8000 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrcAdd_8888x8888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSrcAdd_1000x1000 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbCompositeSolidMask_nx1xn (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); void fbComposite (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height); /* fbtrap.c */ void fbRasterizeTrapezoid (PicturePtr alpha, xTrapezoid *trap, int x_off, int y_off); #endif /* _FBPICT_H_ */