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_ */
1158