b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
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 * 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#define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
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#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#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#define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (0 - ((t) >> 8)))) << (i))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
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 fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync switch (__bpp__) { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* If necessary, convert RGB <--> BGR. */ \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* manage missing src alpha */ \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\
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#define cvt0565to0888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync WRITE((CARD16 *) ((a)+1), (CARD16) ((v) >> 8))) : \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync The methods below use some tricks to be able to do two color
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync components at the same time.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff00; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255 + y
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += y & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a + y_c * b) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t >>= 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += (x >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a + y_c *b) / 256
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff00; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a_c) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = r | (t & 0xff00ff00); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a) / 255 + y
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += y & 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t += 0x800080; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = r | (t << 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = (x_c * a_c + y_c * b) / 255
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t >>= 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r += (r >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x += (x >> 8); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x |= r << 16; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync x_c = min(x_c + y_c, 255)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync r &= 0xff00ff; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncfbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
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#endif /* _FBPICT_H_ */