xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

fb.h (31669B)


      1 /*
      2  *
      3  * Copyright © 1998 Keith Packard
      4  *
      5  * Permission to use, copy, modify, distribute, and sell this software and its
      6  * documentation for any purpose is hereby granted without fee, provided that
      7  * the above copyright notice appear in all copies and that both that
      8  * copyright notice and this permission notice appear in supporting
      9  * documentation, and that the name of Keith Packard not be used in
     10  * advertising or publicity pertaining to distribution of the software without
     11  * specific, written prior permission.  Keith Packard makes no
     12  * representations about the suitability of this software for any purpose.  It
     13  * is provided "as is" without express or implied warranty.
     14  *
     15  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     16  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     17  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     18  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     19  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     20  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     21  * PERFORMANCE OF THIS SOFTWARE.
     22  */
     23 
     24 #ifndef _FB_H_
     25 #define _FB_H_
     26 
     27 #include <X11/X.h>
     28 #include <pixman.h>
     29 
     30 #include "scrnintstr.h"
     31 #include "pixmap.h"
     32 #include "pixmapstr.h"
     33 #include "region.h"
     34 #include "gcstruct.h"
     35 #include "colormap.h"
     36 #include "miscstruct.h"
     37 #include "servermd.h"
     38 #include "windowstr.h"
     39 #include "privates.h"
     40 #include "mi.h"
     41 #include "migc.h"
     42 #include "picturestr.h"
     43 
     44 #ifdef FB_ACCESS_WRAPPER
     45 
     46 #include "wfbrename.h"
     47 #define FBPREFIX(x) wfb##x
     48 #define WRITE(ptr, val) ((*wfbWriteMemory)((ptr), (val), sizeof(*(ptr))))
     49 #define READ(ptr) ((*wfbReadMemory)((ptr), sizeof(*(ptr))))
     50 
     51 #define MEMCPY_WRAPPED(dst, src, size) do {                       \
     52     size_t _i;                                                    \
     53     CARD8 *_dst = (CARD8*)(dst), *_src = (CARD8*)(src);           \
     54     for(_i = 0; _i < size; _i++) {                                \
     55         WRITE(_dst +_i, READ(_src + _i));                         \
     56     }                                                             \
     57 } while(0)
     58 
     59 #define MEMSET_WRAPPED(dst, val, size) do {                       \
     60     size_t _i;                                                    \
     61     CARD8 *_dst = (CARD8*)(dst);                                  \
     62     for(_i = 0; _i < size; _i++) {                                \
     63         WRITE(_dst +_i, (val));                                   \
     64     }                                                             \
     65 } while(0)
     66 
     67 #else
     68 
     69 #define FBPREFIX(x) fb##x
     70 #define WRITE(ptr, val) (*(ptr) = (val))
     71 #define READ(ptr) (*(ptr))
     72 #define MEMCPY_WRAPPED(dst, src, size) memcpy((dst), (src), (size))
     73 #define MEMSET_WRAPPED(dst, val, size) memset((dst), (val), (size))
     74 
     75 #endif
     76 
     77 /*
     78  * This single define controls the basic size of data manipulated
     79  * by this software; it must be log2(sizeof (FbBits) * 8)
     80  */
     81 
     82 #ifndef FB_SHIFT
     83 #define FB_SHIFT    LOG2_BITMAP_PAD
     84 #endif
     85 
     86 #define FB_UNIT	    (1 << FB_SHIFT)
     87 #define FB_MASK	    (FB_UNIT - 1)
     88 #define FB_ALLONES  ((FbBits) -1)
     89 #if GLYPHPADBYTES != 4
     90 #error "GLYPHPADBYTES must be 4"
     91 #endif
     92 #define FB_STIP_SHIFT	LOG2_BITMAP_PAD
     93 #define FB_STIP_UNIT	(1 << FB_STIP_SHIFT)
     94 #define FB_STIP_MASK	(FB_STIP_UNIT - 1)
     95 #define FB_STIP_ALLONES	((FbStip) -1)
     96 #define FB_STIP_ODDSTRIDE(s)	(((s) & (FB_MASK >> FB_STIP_SHIFT)) != 0)
     97 #define FB_STIP_ODDPTR(p)	((((long) (p)) & (FB_MASK >> 3)) != 0)
     98 #define FbStipStrideToBitsStride(s) (((s) >> (FB_SHIFT - FB_STIP_SHIFT)))
     99 #define FbBitsStrideToStipStride(s) (((s) << (FB_SHIFT - FB_STIP_SHIFT)))
    100 #define FbFullMask(n)   ((n) == FB_UNIT ? FB_ALLONES : ((((FbBits) 1) << n) - 1))
    101 
    102 #if FB_SHIFT == 5
    103 typedef CARD32 FbBits;
    104 #else
    105 #error "Unsupported FB_SHIFT"
    106 #endif
    107 
    108 #if LOG2_BITMAP_PAD == FB_SHIFT
    109 typedef FbBits FbStip;
    110 #endif
    111 
    112 typedef int FbStride;
    113 
    114 #ifdef FB_DEBUG
    115 extern _X_EXPORT void fbValidateDrawable(DrawablePtr d);
    116 extern _X_EXPORT void fbInitializeDrawable(DrawablePtr d);
    117 extern _X_EXPORT void fbSetBits(FbStip * bits, int stride, FbStip data);
    118 
    119 #define FB_HEAD_BITS   (FbStip) (0xbaadf00d)
    120 #define FB_TAIL_BITS   (FbStip) (0xbaddf0ad)
    121 #else
    122 #define fbValidateDrawable(d)
    123 #define fdInitializeDrawable(d)
    124 #endif
    125 
    126 #include "fbrop.h"
    127 
    128 #if BITMAP_BIT_ORDER == LSBFirst
    129 #define FbScrLeft(x,n)	((x) >> (n))
    130 #define FbScrRight(x,n)	((x) << (n))
    131 /* #define FbLeftBits(x,n)	((x) & ((((FbBits) 1) << (n)) - 1)) */
    132 #define FbLeftStipBits(x,n) ((x) & ((((FbStip) 1) << (n)) - 1))
    133 #define FbStipMoveLsb(x,s,n)	(FbStipRight (x,(s)-(n)))
    134 #define FbPatternOffsetBits	0
    135 #else
    136 #define FbScrLeft(x,n)	((x) << (n))
    137 #define FbScrRight(x,n)	((x) >> (n))
    138 /* #define FbLeftBits(x,n)	((x) >> (FB_UNIT - (n))) */
    139 #define FbLeftStipBits(x,n) ((x) >> (FB_STIP_UNIT - (n)))
    140 #define FbStipMoveLsb(x,s,n)	(x)
    141 #define FbPatternOffsetBits	(sizeof (FbBits) - 1)
    142 #endif
    143 
    144 #include "micoord.h"
    145 
    146 #define FbStipLeft(x,n)	FbScrLeft(x,n)
    147 #define FbStipRight(x,n) FbScrRight(x,n)
    148 
    149 #define FbRotLeft(x,n)	FbScrLeft(x,n) | (n ? FbScrRight(x,FB_UNIT-n) : 0)
    150 #define FbRotRight(x,n)	FbScrRight(x,n) | (n ? FbScrLeft(x,FB_UNIT-n) : 0)
    151 
    152 #define FbRotStipLeft(x,n)  FbStipLeft(x,n) | (n ? FbStipRight(x,FB_STIP_UNIT-n) : 0)
    153 #define FbRotStipRight(x,n)  FbStipRight(x,n) | (n ? FbStipLeft(x,FB_STIP_UNIT-n) : 0)
    154 
    155 #define FbLeftMask(x)	    ( ((x) & FB_MASK) ? \
    156 			     FbScrRight(FB_ALLONES,(x) & FB_MASK) : 0)
    157 #define FbRightMask(x)	    ( ((FB_UNIT - (x)) & FB_MASK) ? \
    158 			     FbScrLeft(FB_ALLONES,(FB_UNIT - (x)) & FB_MASK) : 0)
    159 
    160 #define FbLeftStipMask(x)   ( ((x) & FB_STIP_MASK) ? \
    161 			     FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) : 0)
    162 #define FbRightStipMask(x)  ( ((FB_STIP_UNIT - (x)) & FB_STIP_MASK) ? \
    163 			     FbScrLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - (x)) & FB_STIP_MASK) : 0)
    164 
    165 #define FbBitsMask(x,w)	(FbScrRight(FB_ALLONES,(x) & FB_MASK) & \
    166 			 FbScrLeft(FB_ALLONES,(FB_UNIT - ((x) + (w))) & FB_MASK))
    167 
    168 #define FbStipMask(x,w)	(FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) & \
    169 			 FbStipLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - ((x)+(w))) & FB_STIP_MASK))
    170 
    171 #define FbMaskBits(x,w,l,n,r) { \
    172     n = (w); \
    173     r = FbRightMask((x)+n); \
    174     l = FbLeftMask(x); \
    175     if (l) { \
    176 	n -= FB_UNIT - ((x) & FB_MASK); \
    177 	if (n < 0) { \
    178 	    n = 0; \
    179 	    l &= r; \
    180 	    r = 0; \
    181 	} \
    182     } \
    183     n >>= FB_SHIFT; \
    184 }
    185 
    186 #define FbByteMaskInvalid   0x10
    187 
    188 #define FbPatternOffset(o,t)  ((o) ^ (FbPatternOffsetBits & ~(sizeof (t) - 1)))
    189 
    190 #define FbPtrOffset(p,o,t)		((t *) ((CARD8 *) (p) + (o)))
    191 #define FbSelectPatternPart(xor,o,t)	((xor) >> (FbPatternOffset (o,t) << 3))
    192 #define FbStorePart(dst,off,t,xor)	(WRITE(FbPtrOffset(dst,off,t), \
    193 					 FbSelectPart(xor,off,t)))
    194 #ifndef FbSelectPart
    195 #define FbSelectPart(x,o,t) FbSelectPatternPart(x,o,t)
    196 #endif
    197 
    198 #define FbMaskBitsBytes(x,w,copy,l,lb,n,r,rb) { \
    199     n = (w); \
    200     lb = 0; \
    201     rb = 0; \
    202     r = FbRightMask((x)+n); \
    203     if (r) { \
    204 	/* compute right byte length */ \
    205 	if ((copy) && (((x) + n) & 7) == 0) { \
    206 	    rb = (((x) + n) & FB_MASK) >> 3; \
    207 	} else { \
    208 	    rb = FbByteMaskInvalid; \
    209 	} \
    210     } \
    211     l = FbLeftMask(x); \
    212     if (l) { \
    213 	/* compute left byte length */ \
    214 	if ((copy) && ((x) & 7) == 0) { \
    215 	    lb = ((x) & FB_MASK) >> 3; \
    216 	} else { \
    217 	    lb = FbByteMaskInvalid; \
    218 	} \
    219 	/* subtract out the portion painted by leftMask */ \
    220 	n -= FB_UNIT - ((x) & FB_MASK); \
    221 	if (n < 0) { \
    222 	    if (lb != FbByteMaskInvalid) { \
    223 		if (rb == FbByteMaskInvalid) { \
    224 		    lb = FbByteMaskInvalid; \
    225 		} else if (rb) { \
    226 		    lb |= (rb - lb) << (FB_SHIFT - 3); \
    227 		    rb = 0; \
    228 		} \
    229 	    } \
    230 	    n = 0; \
    231 	    l &= r; \
    232 	    r = 0; \
    233 	}\
    234     } \
    235     n >>= FB_SHIFT; \
    236 }
    237 
    238 #define FbDoLeftMaskByteRRop(dst,lb,l,and,xor) { \
    239     switch (lb) { \
    240     case (sizeof (FbBits) - 3) | (1 << (FB_SHIFT - 3)): \
    241 	FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
    242 	break; \
    243     case (sizeof (FbBits) - 3) | (2 << (FB_SHIFT - 3)): \
    244 	FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
    245 	FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
    246 	break; \
    247     case (sizeof (FbBits) - 2) | (1 << (FB_SHIFT - 3)): \
    248 	FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
    249 	break; \
    250     case sizeof (FbBits) - 3: \
    251 	FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
    252     case sizeof (FbBits) - 2: \
    253 	FbStorePart(dst,sizeof (FbBits) - 2,CARD16,xor); \
    254 	break; \
    255     case sizeof (FbBits) - 1: \
    256 	FbStorePart(dst,sizeof (FbBits) - 1,CARD8,xor); \
    257 	break; \
    258     default: \
    259 	WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, l)); \
    260 	break; \
    261     } \
    262 }
    263 
    264 #define FbDoRightMaskByteRRop(dst,rb,r,and,xor) { \
    265     switch (rb) { \
    266     case 1: \
    267 	FbStorePart(dst,0,CARD8,xor); \
    268 	break; \
    269     case 2: \
    270 	FbStorePart(dst,0,CARD16,xor); \
    271 	break; \
    272     case 3: \
    273 	FbStorePart(dst,0,CARD16,xor); \
    274 	FbStorePart(dst,2,CARD8,xor); \
    275 	break; \
    276     default: \
    277 	WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, r)); \
    278     } \
    279 }
    280 
    281 #define FbMaskStip(x,w,l,n,r) { \
    282     n = (w); \
    283     r = FbRightStipMask((x)+n); \
    284     l = FbLeftStipMask(x); \
    285     if (l) { \
    286 	n -= FB_STIP_UNIT - ((x) & FB_STIP_MASK); \
    287 	if (n < 0) { \
    288 	    n = 0; \
    289 	    l &= r; \
    290 	    r = 0; \
    291 	} \
    292     } \
    293     n >>= FB_STIP_SHIFT; \
    294 }
    295 
    296 /*
    297  * These macros are used to transparently stipple
    298  * in copy mode; the expected usage is with 'n' constant
    299  * so all of the conditional parts collapse into a minimal
    300  * sequence of partial word writes
    301  *
    302  * 'n' is the bytemask of which bytes to store, 'a' is the address
    303  * of the FbBits base unit, 'o' is the offset within that unit
    304  *
    305  * The term "lane" comes from the hardware term "byte-lane" which
    306  */
    307 
    308 #define FbLaneCase1(n,a,o)						\
    309     if ((n) == 0x01) {							\
    310 	WRITE((CARD8 *) ((a)+FbPatternOffset(o,CARD8)), fgxor);		\
    311     }
    312 
    313 #define FbLaneCase2(n,a,o)						\
    314     if ((n) == 0x03) {							\
    315 	WRITE((CARD16 *) ((a)+FbPatternOffset(o,CARD16)), fgxor);	\
    316     } else {								\
    317 	FbLaneCase1((n)&1,a,o)						\
    318 	FbLaneCase1((n)>>1,a,(o)+1)					\
    319     }
    320 
    321 #define FbLaneCase4(n,a,o)						\
    322     if ((n) == 0x0f) {							\
    323 	WRITE((CARD32 *) ((a)+FbPatternOffset(o,CARD32)), fgxor);	\
    324     } else {								\
    325 	FbLaneCase2((n)&3,a,o)						\
    326 	FbLaneCase2((n)>>2,a,(o)+2)					\
    327     }
    328 
    329 #define FbLaneCase(n,a)   FbLaneCase4(n,(CARD8 *) (a),0)
    330 
    331 /* Macros for dealing with dashing */
    332 
    333 #define FbDashDeclare	\
    334     unsigned char	*__dash, *__firstDash, *__lastDash
    335 
    336 #define FbDashInit(pGC,pPriv,dashOffset,dashlen,even) {	    \
    337     (even) = TRUE;					    \
    338     __firstDash = (pGC)->dash;				    \
    339     __lastDash = __firstDash + (pGC)->numInDashList;	    \
    340     (dashOffset) %= (pPriv)->dashLength;		    \
    341 							    \
    342     __dash = __firstDash;				    \
    343     while ((dashOffset) >= ((dashlen) = *__dash))	    \
    344     {							    \
    345 	(dashOffset) -= (dashlen);			    \
    346 	(even) = 1-(even);				    \
    347 	if (++__dash == __lastDash)			    \
    348 	    __dash = __firstDash;			    \
    349     }							    \
    350     (dashlen) -= (dashOffset);				    \
    351 }
    352 
    353 #define FbDashNext(dashlen) {				    \
    354     if (++__dash == __lastDash)				    \
    355 	__dash = __firstDash;				    \
    356     (dashlen) = *__dash;				    \
    357 }
    358 
    359 /* as numInDashList is always even, this case can skip a test */
    360 
    361 #define FbDashNextEven(dashlen) {			    \
    362     (dashlen) = *++__dash;				    \
    363 }
    364 
    365 #define FbDashNextOdd(dashlen)	FbDashNext(dashlen)
    366 
    367 #define FbDashStep(dashlen,even) {			    \
    368     if (!--(dashlen)) {					    \
    369 	FbDashNext(dashlen);				    \
    370 	(even) = 1-(even);				    \
    371     }							    \
    372 }
    373 
    374 extern _X_EXPORT const GCOps fbGCOps;
    375 extern _X_EXPORT const GCFuncs fbGCFuncs;
    376 
    377 /* Framebuffer access wrapper */
    378 typedef FbBits(*ReadMemoryProcPtr) (const void *src, int size);
    379 typedef void (*WriteMemoryProcPtr) (void *dst, FbBits value, int size);
    380 typedef void (*SetupWrapProcPtr) (ReadMemoryProcPtr * pRead,
    381                                   WriteMemoryProcPtr * pWrite,
    382                                   DrawablePtr pDraw);
    383 typedef void (*FinishWrapProcPtr) (DrawablePtr pDraw);
    384 
    385 #ifdef FB_ACCESS_WRAPPER
    386 
    387 #define fbPrepareAccess(pDraw) \
    388 	fbGetScreenPrivate((pDraw)->pScreen)->setupWrap( \
    389 		&wfbReadMemory, \
    390 		&wfbWriteMemory, \
    391 		(pDraw))
    392 #define fbFinishAccess(pDraw) \
    393 	fbGetScreenPrivate((pDraw)->pScreen)->finishWrap(pDraw)
    394 
    395 #else
    396 
    397 #define fbPrepareAccess(pPix)
    398 #define fbFinishAccess(pDraw)
    399 
    400 #endif
    401 
    402 extern _X_EXPORT DevPrivateKey
    403 fbGetScreenPrivateKey(void);
    404 
    405 /* private field of a screen */
    406 typedef struct {
    407 #ifdef FB_ACCESS_WRAPPER
    408     SetupWrapProcPtr setupWrap; /* driver hook to set pixmap access wrapping */
    409     FinishWrapProcPtr finishWrap;       /* driver hook to clean up pixmap access wrapping */
    410 #endif
    411     DevPrivateKeyRec    gcPrivateKeyRec;
    412     DevPrivateKeyRec    winPrivateKeyRec;
    413 } FbScreenPrivRec, *FbScreenPrivPtr;
    414 
    415 #define fbGetScreenPrivate(pScreen) ((FbScreenPrivPtr) \
    416 				     dixLookupPrivate(&(pScreen)->devPrivates, fbGetScreenPrivateKey()))
    417 
    418 /* private field of GC */
    419 typedef struct {
    420     FbBits and, xor;            /* reduced rop values */
    421     FbBits bgand, bgxor;        /* for stipples */
    422     FbBits fg, bg, pm;          /* expanded and filled */
    423     unsigned int dashLength;    /* total of all dash elements */
    424 } FbGCPrivRec, *FbGCPrivPtr;
    425 
    426 #define fbGetGCPrivateKey(pGC)  (&fbGetScreenPrivate((pGC)->pScreen)->gcPrivateKeyRec)
    427 
    428 #define fbGetGCPrivate(pGC)	((FbGCPrivPtr)\
    429 				 dixLookupPrivate(&(pGC)->devPrivates, fbGetGCPrivateKey(pGC)))
    430 
    431 #define fbGetCompositeClip(pGC) ((pGC)->pCompositeClip)
    432 #define fbGetExpose(pGC)	((pGC)->fExpose)
    433 
    434 #define fbGetScreenPixmap(s)	((PixmapPtr) (s)->devPrivate)
    435 
    436 #define fbGetWinPrivateKey(pWin)        (&fbGetScreenPrivate(((DrawablePtr) (pWin))->pScreen)->winPrivateKeyRec)
    437 
    438 #define fbGetWindowPixmap(pWin)	((PixmapPtr)\
    439 				 dixLookupPrivate(&((WindowPtr)(pWin))->devPrivates, fbGetWinPrivateKey(pWin)))
    440 
    441 #define __fbPixDrawableX(pPix)	((pPix)->drawable.x)
    442 #define __fbPixDrawableY(pPix)	((pPix)->drawable.y)
    443 
    444 #ifdef COMPOSITE
    445 #define __fbPixOffXWin(pPix)	(__fbPixDrawableX(pPix) - (pPix)->screen_x)
    446 #define __fbPixOffYWin(pPix)	(__fbPixDrawableY(pPix) - (pPix)->screen_y)
    447 #else
    448 #define __fbPixOffXWin(pPix)	(__fbPixDrawableX(pPix))
    449 #define __fbPixOffYWin(pPix)	(__fbPixDrawableY(pPix))
    450 #endif
    451 #define __fbPixOffXPix(pPix)	(__fbPixDrawableX(pPix))
    452 #define __fbPixOffYPix(pPix)	(__fbPixDrawableY(pPix))
    453 
    454 #define fbGetDrawablePixmap(pDrawable, pixmap, xoff, yoff) {			\
    455     if ((pDrawable)->type != DRAWABLE_PIXMAP) { 				\
    456 	(pixmap) = fbGetWindowPixmap(pDrawable);				\
    457 	(xoff) = __fbPixOffXWin(pixmap); 					\
    458 	(yoff) = __fbPixOffYWin(pixmap); 					\
    459     } else { 									\
    460 	(pixmap) = (PixmapPtr) (pDrawable);					\
    461 	(xoff) = __fbPixOffXPix(pixmap); 					\
    462 	(yoff) = __fbPixOffYPix(pixmap); 					\
    463     } 										\
    464     fbPrepareAccess(pDrawable); 						\
    465 }
    466 
    467 #define fbGetPixmapBitsData(pixmap, pointer, stride, bpp) {			\
    468     (pointer) = (FbBits *) (pixmap)->devPrivate.ptr; 			       	\
    469     (stride) = ((int) (pixmap)->devKind) / sizeof (FbBits); (void)(stride);	\
    470     (bpp) = (pixmap)->drawable.bitsPerPixel;  (void)(bpp); 			\
    471 }
    472 
    473 #define fbGetPixmapStipData(pixmap, pointer, stride, bpp) {			\
    474     (pointer) = (FbStip *) (pixmap)->devPrivate.ptr; 			       	\
    475     (stride) = ((int) (pixmap)->devKind) / sizeof (FbStip); (void)(stride);	\
    476     (bpp) = (pixmap)->drawable.bitsPerPixel;  (void)(bpp); 			\
    477 }
    478 
    479 #define fbGetDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { 		\
    480     PixmapPtr   _pPix; 								\
    481     fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff); 				\
    482     fbGetPixmapBitsData(_pPix, pointer, stride, bpp);				\
    483 }
    484 
    485 #define fbGetStipDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { 	\
    486     PixmapPtr   _pPix; 								\
    487     fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff);				\
    488     fbGetPixmapStipData(_pPix, pointer, stride, bpp);				\
    489 }
    490 
    491 /*
    492  * XFree86 empties the root BorderClip when the VT is inactive,
    493  * here's a macro which uses that to disable GetImage and GetSpans
    494  */
    495 
    496 #define fbWindowEnabled(pWin) \
    497     RegionNotEmpty(&(pWin)->borderClip)
    498 
    499 #define fbDrawableEnabled(pDrawable) \
    500     ((pDrawable)->type == DRAWABLE_PIXMAP ? \
    501      TRUE : fbWindowEnabled((WindowPtr) pDrawable))
    502 
    503 #define FbPowerOfTwo(w)	    (((w) & ((w) - 1)) == 0)
    504 /*
    505  * Accelerated tiles are power of 2 width <= FB_UNIT
    506  */
    507 #define FbEvenTile(w)	    ((w) <= FB_UNIT && FbPowerOfTwo(w))
    508 
    509 /*
    510  * fballpriv.c
    511  */
    512 extern _X_EXPORT Bool
    513 fbAllocatePrivates(ScreenPtr pScreen);
    514 
    515 /*
    516  * fbarc.c
    517  */
    518 
    519 extern _X_EXPORT void
    520 fbPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
    521 
    522 /*
    523  * fbbits.c
    524  */
    525 
    526 extern _X_EXPORT void
    527 
    528 fbBresSolid8(DrawablePtr pDrawable,
    529              GCPtr pGC,
    530              int dashOffset,
    531              int signdx,
    532              int signdy,
    533              int axis, int x, int y, int e, int e1, int e3, int len);
    534 
    535 extern _X_EXPORT void
    536 
    537 fbBresDash8(DrawablePtr pDrawable,
    538             GCPtr pGC,
    539             int dashOffset,
    540             int signdx,
    541             int signdy, int axis, int x, int y, int e, int e1, int e3, int len);
    542 
    543 extern _X_EXPORT void
    544 
    545 fbDots8(FbBits * dst,
    546         FbStride dstStride,
    547         int dstBpp,
    548         BoxPtr pBox,
    549         xPoint * pts,
    550         int npt,
    551         int xorg, int yorg, int xoff, int yoff, FbBits and, FbBits xor);
    552 
    553 extern _X_EXPORT void
    554 
    555 fbArc8(FbBits * dst,
    556        FbStride dstStride,
    557        int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
    558 
    559 extern _X_EXPORT void
    560 
    561 fbGlyph8(FbBits * dstLine,
    562          FbStride dstStride,
    563          int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
    564 
    565 extern _X_EXPORT void
    566 
    567 fbPolyline8(DrawablePtr pDrawable,
    568             GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
    569 
    570 extern _X_EXPORT void
    571  fbPolySegment8(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
    572 
    573 extern _X_EXPORT void
    574 
    575 fbBresSolid16(DrawablePtr pDrawable,
    576               GCPtr pGC,
    577               int dashOffset,
    578               int signdx,
    579               int signdy,
    580               int axis, int x, int y, int e, int e1, int e3, int len);
    581 
    582 extern _X_EXPORT void
    583 
    584 fbBresDash16(DrawablePtr pDrawable,
    585              GCPtr pGC,
    586              int dashOffset,
    587              int signdx,
    588              int signdy,
    589              int axis, int x, int y, int e, int e1, int e3, int len);
    590 
    591 extern _X_EXPORT void
    592 
    593 fbDots16(FbBits * dst,
    594          FbStride dstStride,
    595          int dstBpp,
    596          BoxPtr pBox,
    597          xPoint * pts,
    598          int npt,
    599          int xorg, int yorg, int xoff, int yoff, FbBits and, FbBits xor);
    600 
    601 extern _X_EXPORT void
    602 
    603 fbArc16(FbBits * dst,
    604         FbStride dstStride,
    605         int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
    606 
    607 extern _X_EXPORT void
    608 
    609 fbGlyph16(FbBits * dstLine,
    610           FbStride dstStride,
    611           int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
    612 
    613 extern _X_EXPORT void
    614 
    615 fbPolyline16(DrawablePtr pDrawable,
    616              GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
    617 
    618 extern _X_EXPORT void
    619  fbPolySegment16(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
    620 
    621 extern _X_EXPORT void
    622 
    623 fbBresSolid32(DrawablePtr pDrawable,
    624               GCPtr pGC,
    625               int dashOffset,
    626               int signdx,
    627               int signdy,
    628               int axis, int x, int y, int e, int e1, int e3, int len);
    629 
    630 extern _X_EXPORT void
    631 
    632 fbBresDash32(DrawablePtr pDrawable,
    633              GCPtr pGC,
    634              int dashOffset,
    635              int signdx,
    636              int signdy,
    637              int axis, int x, int y, int e, int e1, int e3, int len);
    638 
    639 extern _X_EXPORT void
    640 
    641 fbDots32(FbBits * dst,
    642          FbStride dstStride,
    643          int dstBpp,
    644          BoxPtr pBox,
    645          xPoint * pts,
    646          int npt,
    647          int xorg, int yorg, int xoff, int yoff, FbBits and, FbBits xor);
    648 
    649 extern _X_EXPORT void
    650 
    651 fbArc32(FbBits * dst,
    652         FbStride dstStride,
    653         int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
    654 
    655 extern _X_EXPORT void
    656 
    657 fbGlyph32(FbBits * dstLine,
    658           FbStride dstStride,
    659           int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
    660 extern _X_EXPORT void
    661 
    662 fbPolyline32(DrawablePtr pDrawable,
    663              GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
    664 
    665 extern _X_EXPORT void
    666  fbPolySegment32(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
    667 
    668 /*
    669  * fbblt.c
    670  */
    671 extern _X_EXPORT void
    672 
    673 fbBlt(FbBits * src,
    674       FbStride srcStride,
    675       int srcX,
    676       FbBits * dst,
    677       FbStride dstStride,
    678       int dstX,
    679       int width,
    680       int height, int alu, FbBits pm, int bpp, Bool reverse, Bool upsidedown);
    681 
    682 extern _X_EXPORT void
    683  fbBltStip(FbStip * src, FbStride srcStride,    /* in FbStip units, not FbBits units */
    684            int srcX, FbStip * dst, FbStride dstStride,  /* in FbStip units, not FbBits units */
    685            int dstX, int width, int height, int alu, FbBits pm, int bpp);
    686 
    687 /*
    688  * fbbltone.c
    689  */
    690 extern _X_EXPORT void
    691 
    692 fbBltOne(FbStip * src,
    693          FbStride srcStride,
    694          int srcX,
    695          FbBits * dst,
    696          FbStride dstStride,
    697          int dstX,
    698          int dstBpp,
    699          int width,
    700          int height, FbBits fgand, FbBits fbxor, FbBits bgand, FbBits bgxor);
    701 
    702 extern _X_EXPORT void
    703 
    704 fbBltPlane(FbBits * src,
    705            FbStride srcStride,
    706            int srcX,
    707            int srcBpp,
    708            FbStip * dst,
    709            FbStride dstStride,
    710            int dstX,
    711            int width,
    712            int height,
    713            FbStip fgand,
    714            FbStip fgxor, FbStip bgand, FbStip bgxor, Pixel planeMask);
    715 
    716 /*
    717  * fbcmap_mi.c
    718  */
    719 extern _X_EXPORT int
    720  fbListInstalledColormaps(ScreenPtr pScreen, Colormap * pmaps);
    721 
    722 extern _X_EXPORT void
    723  fbInstallColormap(ColormapPtr pmap);
    724 
    725 extern _X_EXPORT void
    726  fbUninstallColormap(ColormapPtr pmap);
    727 
    728 extern _X_EXPORT void
    729 
    730 fbResolveColor(unsigned short *pred,
    731                unsigned short *pgreen,
    732                unsigned short *pblue, VisualPtr pVisual);
    733 
    734 extern _X_EXPORT Bool
    735  fbInitializeColormap(ColormapPtr pmap);
    736 
    737 extern _X_EXPORT int
    738 
    739 fbExpandDirectColors(ColormapPtr pmap,
    740                      int ndef, xColorItem * indefs, xColorItem * outdefs);
    741 
    742 extern _X_EXPORT Bool
    743  fbCreateDefColormap(ScreenPtr pScreen);
    744 
    745 extern _X_EXPORT void
    746  fbClearVisualTypes(void);
    747 
    748 extern _X_EXPORT Bool
    749  fbSetVisualTypes(int depth, int visuals, int bitsPerRGB);
    750 
    751 extern _X_EXPORT Bool
    752 fbSetVisualTypesAndMasks(int depth, int visuals, int bitsPerRGB,
    753                          Pixel redMask, Pixel greenMask, Pixel blueMask);
    754 
    755 extern _X_EXPORT Bool
    756 
    757 fbInitVisuals(VisualPtr * visualp,
    758               DepthPtr * depthp,
    759               int *nvisualp,
    760               int *ndepthp,
    761               int *rootDepthp,
    762               VisualID * defaultVisp, unsigned long sizes, int bitsPerRGB);
    763 
    764 /*
    765  * fbcopy.c
    766  */
    767 
    768 extern _X_EXPORT void
    769 
    770 fbCopyNtoN(DrawablePtr pSrcDrawable,
    771            DrawablePtr pDstDrawable,
    772            GCPtr pGC,
    773            BoxPtr pbox,
    774            int nbox,
    775            int dx,
    776            int dy,
    777            Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
    778 
    779 extern _X_EXPORT void
    780 
    781 fbCopy1toN(DrawablePtr pSrcDrawable,
    782            DrawablePtr pDstDrawable,
    783            GCPtr pGC,
    784            BoxPtr pbox,
    785            int nbox,
    786            int dx,
    787            int dy,
    788            Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
    789 
    790 extern _X_EXPORT void
    791 
    792 fbCopyNto1(DrawablePtr pSrcDrawable,
    793            DrawablePtr pDstDrawable,
    794            GCPtr pGC,
    795            BoxPtr pbox,
    796            int nbox,
    797            int dx,
    798            int dy,
    799            Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
    800 
    801 extern _X_EXPORT RegionPtr
    802 
    803 fbCopyArea(DrawablePtr pSrcDrawable,
    804            DrawablePtr pDstDrawable,
    805            GCPtr pGC,
    806            int xIn, int yIn, int widthSrc, int heightSrc, int xOut, int yOut);
    807 
    808 extern _X_EXPORT RegionPtr
    809 
    810 fbCopyPlane(DrawablePtr pSrcDrawable,
    811             DrawablePtr pDstDrawable,
    812             GCPtr pGC,
    813             int xIn,
    814             int yIn,
    815             int widthSrc,
    816             int heightSrc, int xOut, int yOut, unsigned long bitplane);
    817 
    818 /*
    819  * fbfill.c
    820  */
    821 extern _X_EXPORT void
    822  fbFill(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int width, int height);
    823 
    824 extern _X_EXPORT void
    825 
    826 fbSolidBoxClipped(DrawablePtr pDrawable,
    827                   RegionPtr pClip,
    828                   int xa, int ya, int xb, int yb, FbBits and, FbBits xor);
    829 
    830 /*
    831  * fbfillrect.c
    832  */
    833 extern _X_EXPORT void
    834 
    835 fbPolyFillRect(DrawablePtr pDrawable,
    836                GCPtr pGC, int nrectInit, xRectangle *prectInit);
    837 
    838 #define fbPolyFillArc miPolyFillArc
    839 
    840 #define fbFillPolygon miFillPolygon
    841 
    842 /*
    843  * fbfillsp.c
    844  */
    845 extern _X_EXPORT void
    846 
    847 fbFillSpans(DrawablePtr pDrawable,
    848             GCPtr pGC,
    849             int nInit, DDXPointPtr pptInit, int *pwidthInit, int fSorted);
    850 
    851 /*
    852  * fbgc.c
    853  */
    854 
    855 extern _X_EXPORT Bool
    856  fbCreateGC(GCPtr pGC);
    857 
    858 extern _X_EXPORT void
    859  fbPadPixmap(PixmapPtr pPixmap);
    860 
    861 extern _X_EXPORT void
    862  fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable);
    863 
    864 /*
    865  * fbgetsp.c
    866  */
    867 extern _X_EXPORT void
    868 
    869 fbGetSpans(DrawablePtr pDrawable,
    870            int wMax,
    871            DDXPointPtr ppt, int *pwidth, int nspans, char *pchardstStart);
    872 
    873 /*
    874  * fbglyph.c
    875  */
    876 
    877 extern _X_EXPORT void
    878 
    879 fbPolyGlyphBlt(DrawablePtr pDrawable,
    880                GCPtr pGC,
    881                int x,
    882                int y,
    883                unsigned int nglyph, CharInfoPtr * ppci, void *pglyphBase);
    884 
    885 extern _X_EXPORT void
    886 
    887 fbImageGlyphBlt(DrawablePtr pDrawable,
    888                 GCPtr pGC,
    889                 int x,
    890                 int y,
    891                 unsigned int nglyph, CharInfoPtr * ppci, void *pglyphBase);
    892 
    893 /*
    894  * fbimage.c
    895  */
    896 
    897 extern _X_EXPORT void
    898 
    899 fbPutImage(DrawablePtr pDrawable,
    900            GCPtr pGC,
    901            int depth,
    902            int x, int y, int w, int h, int leftPad, int format, char *pImage);
    903 
    904 extern _X_EXPORT void
    905 
    906 fbPutZImage(DrawablePtr pDrawable,
    907             RegionPtr pClip,
    908             int alu,
    909             FbBits pm,
    910             int x,
    911             int y, int width, int height, FbStip * src, FbStride srcStride);
    912 
    913 extern _X_EXPORT void
    914 
    915 fbPutXYImage(DrawablePtr pDrawable,
    916              RegionPtr pClip,
    917              FbBits fg,
    918              FbBits bg,
    919              FbBits pm,
    920              int alu,
    921              Bool opaque,
    922              int x,
    923              int y,
    924              int width, int height, FbStip * src, FbStride srcStride, int srcX);
    925 
    926 extern _X_EXPORT void
    927 
    928 fbGetImage(DrawablePtr pDrawable,
    929            int x,
    930            int y,
    931            int w, int h, unsigned int format, unsigned long planeMask, char *d);
    932 /*
    933  * fbline.c
    934  */
    935 
    936 extern _X_EXPORT void
    937 fbPolyLine(DrawablePtr pDrawable,
    938            GCPtr pGC, int mode, int npt, DDXPointPtr ppt);
    939 
    940 extern _X_EXPORT void
    941  fbFixCoordModePrevious(int npt, DDXPointPtr ppt);
    942 
    943 extern _X_EXPORT void
    944  fbPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
    945 
    946 #define fbPolyRectangle	miPolyRectangle
    947 
    948 /*
    949  * fbpict.c
    950  */
    951 
    952 extern _X_EXPORT Bool
    953  fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats);
    954 
    955 extern _X_EXPORT void
    956 fbDestroyGlyphCache(void);
    957 
    958 /*
    959  * fbpixmap.c
    960  */
    961 
    962 extern _X_EXPORT PixmapPtr
    963 fbCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
    964                unsigned usage_hint);
    965 
    966 extern _X_EXPORT Bool
    967  fbDestroyPixmap(PixmapPtr pPixmap);
    968 
    969 extern _X_EXPORT RegionPtr
    970  fbPixmapToRegion(PixmapPtr pPix);
    971 
    972 /*
    973  * fbpoint.c
    974  */
    975 
    976 extern _X_EXPORT void
    977 
    978 fbPolyPoint(DrawablePtr pDrawable,
    979             GCPtr pGC, int mode, int npt, xPoint * pptInit);
    980 
    981 /*
    982  * fbpush.c
    983  */
    984 
    985 extern _X_EXPORT void
    986 
    987 fbPushImage(DrawablePtr pDrawable,
    988             GCPtr pGC,
    989             FbStip * src,
    990             FbStride srcStride, int srcX, int x, int y, int width, int height);
    991 
    992 extern _X_EXPORT void
    993 
    994 fbPushPixels(GCPtr pGC,
    995              PixmapPtr pBitmap,
    996              DrawablePtr pDrawable, int dx, int dy, int xOrg, int yOrg);
    997 
    998 /*
    999  * fbscreen.c
   1000  */
   1001 
   1002 extern _X_EXPORT Bool
   1003  fbCloseScreen(ScreenPtr pScreen);
   1004 
   1005 extern _X_EXPORT Bool
   1006  fbRealizeFont(ScreenPtr pScreen, FontPtr pFont);
   1007 
   1008 extern _X_EXPORT Bool
   1009  fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont);
   1010 
   1011 extern _X_EXPORT void
   1012 
   1013 fbQueryBestSize(int class,
   1014                 unsigned short *width, unsigned short *height,
   1015                 ScreenPtr pScreen);
   1016 
   1017 extern _X_EXPORT PixmapPtr
   1018  _fbGetWindowPixmap(WindowPtr pWindow);
   1019 
   1020 extern _X_EXPORT void
   1021  _fbSetWindowPixmap(WindowPtr pWindow, PixmapPtr pPixmap);
   1022 
   1023 extern _X_EXPORT Bool
   1024  fbSetupScreen(ScreenPtr pScreen, void *pbits,        /* pointer to screen bitmap */
   1025                int xsize,       /* in pixels */
   1026                int ysize, int dpix,     /* dots per inch */
   1027                int dpiy, int width,     /* pixel width of frame buffer */
   1028                int bpp);        /* bits per pixel of frame buffer */
   1029 
   1030 #ifdef FB_ACCESS_WRAPPER
   1031 extern _X_EXPORT Bool
   1032 wfbFinishScreenInit(ScreenPtr pScreen,
   1033                     void *pbits,
   1034                     int xsize,
   1035                     int ysize,
   1036                     int dpix,
   1037                     int dpiy,
   1038                     int width,
   1039                     int bpp,
   1040                     SetupWrapProcPtr setupWrap, FinishWrapProcPtr finishWrap);
   1041 
   1042 extern _X_EXPORT Bool
   1043 wfbScreenInit(ScreenPtr pScreen,
   1044               void *pbits,
   1045               int xsize,
   1046               int ysize,
   1047               int dpix,
   1048               int dpiy,
   1049               int width,
   1050               int bpp,
   1051               SetupWrapProcPtr setupWrap, FinishWrapProcPtr finishWrap);
   1052 #endif
   1053 
   1054 extern _X_EXPORT Bool
   1055 fbFinishScreenInit(ScreenPtr pScreen,
   1056                    void *pbits,
   1057                    int xsize,
   1058                    int ysize, int dpix, int dpiy, int width, int bpp);
   1059 
   1060 extern _X_EXPORT Bool
   1061 
   1062 fbScreenInit(ScreenPtr pScreen,
   1063              void *pbits,
   1064              int xsize, int ysize, int dpix, int dpiy, int width, int bpp);
   1065 
   1066 /*
   1067  * fbseg.c
   1068  */
   1069 typedef void FbBres(DrawablePtr pDrawable,
   1070                     GCPtr pGC,
   1071                     int dashOffset,
   1072                     int signdx,
   1073                     int signdy,
   1074                     int axis, int x, int y, int e, int e1, int e3, int len);
   1075 
   1076 extern _X_EXPORT void
   1077 fbSegment(DrawablePtr pDrawable,
   1078           GCPtr pGC,
   1079           int xa, int ya, int xb, int yb, Bool drawLast, int *dashOffset);
   1080 
   1081 /*
   1082  * fbsetsp.c
   1083  */
   1084 
   1085 extern _X_EXPORT void
   1086 fbSetSpans(DrawablePtr pDrawable,
   1087            GCPtr pGC,
   1088            char *src, DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
   1089 
   1090 /*
   1091  * fbsolid.c
   1092  */
   1093 
   1094 extern _X_EXPORT void
   1095 
   1096 fbSolid(FbBits * dst,
   1097         FbStride dstStride,
   1098         int dstX, int bpp, int width, int height, FbBits and, FbBits xor);
   1099 
   1100 /*
   1101  * fbutil.c
   1102  */
   1103 extern _X_EXPORT FbBits fbReplicatePixel(Pixel p, int bpp);
   1104 
   1105 #ifdef FB_ACCESS_WRAPPER
   1106 extern _X_EXPORT ReadMemoryProcPtr wfbReadMemory;
   1107 extern _X_EXPORT WriteMemoryProcPtr wfbWriteMemory;
   1108 #endif
   1109 
   1110 /*
   1111  * fbwindow.c
   1112  */
   1113 
   1114 extern _X_EXPORT Bool
   1115  fbCreateWindow(WindowPtr pWin);
   1116 
   1117 extern _X_EXPORT Bool
   1118  fbDestroyWindow(WindowPtr pWin);
   1119 
   1120 extern _X_EXPORT Bool
   1121  fbRealizeWindow(WindowPtr pWindow);
   1122 
   1123 extern _X_EXPORT Bool
   1124  fbPositionWindow(WindowPtr pWin, int x, int y);
   1125 
   1126 extern _X_EXPORT Bool
   1127  fbUnrealizeWindow(WindowPtr pWindow);
   1128 
   1129 extern _X_EXPORT void
   1130 
   1131 fbCopyWindowProc(DrawablePtr pSrcDrawable,
   1132                  DrawablePtr pDstDrawable,
   1133                  GCPtr pGC,
   1134                  BoxPtr pbox,
   1135                  int nbox,
   1136                  int dx,
   1137                  int dy,
   1138                  Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
   1139 
   1140 extern _X_EXPORT void
   1141  fbCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
   1142 
   1143 extern _X_EXPORT Bool
   1144  fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask);
   1145 
   1146 extern _X_EXPORT void
   1147 
   1148 fbFillRegionSolid(DrawablePtr pDrawable,
   1149                   RegionPtr pRegion, FbBits and, FbBits xor);
   1150 
   1151 extern _X_EXPORT pixman_image_t *image_from_pict(PicturePtr pict,
   1152                                                  Bool has_clip,
   1153                                                  int *xoff, int *yoff);
   1154 
   1155 extern _X_EXPORT void free_pixman_pict(PicturePtr, pixman_image_t *);
   1156 
   1157 #endif                          /* _FB_H_ */