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
103typedef CARD32 FbBits;
104#else
105#error "Unsupported FB_SHIFT"
106#endif
107
108#if LOG2_BITMAP_PAD == FB_SHIFT
109typedef FbBits FbStip;
110#endif
111
112typedef int FbStride;
113
114#ifdef FB_DEBUG
115extern _X_EXPORT void fbValidateDrawable(DrawablePtr d);
116extern _X_EXPORT void fbInitializeDrawable(DrawablePtr d);
117extern _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
374extern _X_EXPORT const GCOps fbGCOps;
375extern _X_EXPORT const GCFuncs fbGCFuncs;
376
377/* Framebuffer access wrapper */
378typedef FbBits(*ReadMemoryProcPtr) (const void *src, int size);
379typedef void (*WriteMemoryProcPtr) (void *dst, FbBits value, int size);
380typedef void (*SetupWrapProcPtr) (ReadMemoryProcPtr * pRead,
381                                  WriteMemoryProcPtr * pWrite,
382                                  DrawablePtr pDraw);
383typedef 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
402extern _X_EXPORT DevPrivateKey
403fbGetScreenPrivateKey(void);
404
405/* private field of a screen */
406typedef 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 */
419typedef 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 */
512extern _X_EXPORT Bool
513fbAllocatePrivates(ScreenPtr pScreen);
514
515/*
516 * fbarc.c
517 */
518
519extern _X_EXPORT void
520fbPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
521
522/*
523 * fbbits.c
524 */
525
526extern _X_EXPORT void
527
528fbBresSolid8(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
535extern _X_EXPORT void
536
537fbBresDash8(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
543extern _X_EXPORT void
544
545fbDots8(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
553extern _X_EXPORT void
554
555fbArc8(FbBits * dst,
556       FbStride dstStride,
557       int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
558
559extern _X_EXPORT void
560
561fbGlyph8(FbBits * dstLine,
562         FbStride dstStride,
563         int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
564
565extern _X_EXPORT void
566
567fbPolyline8(DrawablePtr pDrawable,
568            GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
569
570extern _X_EXPORT void
571 fbPolySegment8(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
572
573extern _X_EXPORT void
574
575fbBresSolid16(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
582extern _X_EXPORT void
583
584fbBresDash16(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
591extern _X_EXPORT void
592
593fbDots16(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
601extern _X_EXPORT void
602
603fbArc16(FbBits * dst,
604        FbStride dstStride,
605        int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
606
607extern _X_EXPORT void
608
609fbGlyph16(FbBits * dstLine,
610          FbStride dstStride,
611          int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
612
613extern _X_EXPORT void
614
615fbPolyline16(DrawablePtr pDrawable,
616             GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
617
618extern _X_EXPORT void
619 fbPolySegment16(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
620
621extern _X_EXPORT void
622
623fbBresSolid32(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
630extern _X_EXPORT void
631
632fbBresDash32(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
639extern _X_EXPORT void
640
641fbDots32(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
649extern _X_EXPORT void
650
651fbArc32(FbBits * dst,
652        FbStride dstStride,
653        int dstBpp, xArc * arc, int dx, int dy, FbBits and, FbBits xor);
654
655extern _X_EXPORT void
656
657fbGlyph32(FbBits * dstLine,
658          FbStride dstStride,
659          int dstBpp, FbStip * stipple, FbBits fg, int height, int shift);
660extern _X_EXPORT void
661
662fbPolyline32(DrawablePtr pDrawable,
663             GCPtr pGC, int mode, int npt, DDXPointPtr ptsOrig);
664
665extern _X_EXPORT void
666 fbPolySegment32(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
667
668/*
669 * fbblt.c
670 */
671extern _X_EXPORT void
672
673fbBlt(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
682extern _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 */
690extern _X_EXPORT void
691
692fbBltOne(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
702extern _X_EXPORT void
703
704fbBltPlane(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 */
719extern _X_EXPORT int
720 fbListInstalledColormaps(ScreenPtr pScreen, Colormap * pmaps);
721
722extern _X_EXPORT void
723 fbInstallColormap(ColormapPtr pmap);
724
725extern _X_EXPORT void
726 fbUninstallColormap(ColormapPtr pmap);
727
728extern _X_EXPORT void
729
730fbResolveColor(unsigned short *pred,
731               unsigned short *pgreen,
732               unsigned short *pblue, VisualPtr pVisual);
733
734extern _X_EXPORT Bool
735 fbInitializeColormap(ColormapPtr pmap);
736
737extern _X_EXPORT Bool
738 mfbCreateColormap(ColormapPtr pmap);
739
740extern _X_EXPORT int
741
742fbExpandDirectColors(ColormapPtr pmap,
743                     int ndef, xColorItem * indefs, xColorItem * outdefs);
744
745extern _X_EXPORT Bool
746 fbCreateDefColormap(ScreenPtr pScreen);
747
748extern _X_EXPORT void
749 fbClearVisualTypes(void);
750
751extern _X_EXPORT Bool
752 fbSetVisualTypes(int depth, int visuals, int bitsPerRGB);
753
754extern _X_EXPORT Bool
755fbSetVisualTypesAndMasks(int depth, int visuals, int bitsPerRGB,
756                         Pixel redMask, Pixel greenMask, Pixel blueMask);
757
758extern _X_EXPORT Bool
759
760fbInitVisuals(VisualPtr * visualp,
761              DepthPtr * depthp,
762              int *nvisualp,
763              int *ndepthp,
764              int *rootDepthp,
765              VisualID * defaultVisp, unsigned long sizes, int bitsPerRGB);
766
767/*
768 * fbcopy.c
769 */
770
771extern _X_EXPORT void
772
773fbCopyNtoN(DrawablePtr pSrcDrawable,
774           DrawablePtr pDstDrawable,
775           GCPtr pGC,
776           BoxPtr pbox,
777           int nbox,
778           int dx,
779           int dy,
780           Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
781
782extern _X_EXPORT void
783
784fbCopy1toN(DrawablePtr pSrcDrawable,
785           DrawablePtr pDstDrawable,
786           GCPtr pGC,
787           BoxPtr pbox,
788           int nbox,
789           int dx,
790           int dy,
791           Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
792
793extern _X_EXPORT void
794
795fbCopyNto1(DrawablePtr pSrcDrawable,
796           DrawablePtr pDstDrawable,
797           GCPtr pGC,
798           BoxPtr pbox,
799           int nbox,
800           int dx,
801           int dy,
802           Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
803
804extern _X_EXPORT RegionPtr
805
806fbCopyArea(DrawablePtr pSrcDrawable,
807           DrawablePtr pDstDrawable,
808           GCPtr pGC,
809           int xIn, int yIn, int widthSrc, int heightSrc, int xOut, int yOut);
810
811extern _X_EXPORT RegionPtr
812
813fbCopyPlane(DrawablePtr pSrcDrawable,
814            DrawablePtr pDstDrawable,
815            GCPtr pGC,
816            int xIn,
817            int yIn,
818            int widthSrc,
819            int heightSrc, int xOut, int yOut, unsigned long bitplane);
820
821/*
822 * fbfill.c
823 */
824extern _X_EXPORT void
825 fbFill(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int width, int height);
826
827extern _X_EXPORT void
828
829fbSolidBoxClipped(DrawablePtr pDrawable,
830                  RegionPtr pClip,
831                  int xa, int ya, int xb, int yb, FbBits and, FbBits xor);
832
833/*
834 * fbfillrect.c
835 */
836extern _X_EXPORT void
837
838fbPolyFillRect(DrawablePtr pDrawable,
839               GCPtr pGC, int nrectInit, xRectangle *prectInit);
840
841#define fbPolyFillArc miPolyFillArc
842
843#define fbFillPolygon miFillPolygon
844
845/*
846 * fbfillsp.c
847 */
848extern _X_EXPORT void
849
850fbFillSpans(DrawablePtr pDrawable,
851            GCPtr pGC,
852            int nInit, DDXPointPtr pptInit, int *pwidthInit, int fSorted);
853
854/*
855 * fbgc.c
856 */
857
858extern _X_EXPORT Bool
859 fbCreateGC(GCPtr pGC);
860
861extern _X_EXPORT void
862 fbPadPixmap(PixmapPtr pPixmap);
863
864extern _X_EXPORT void
865 fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable);
866
867/*
868 * fbgetsp.c
869 */
870extern _X_EXPORT void
871
872fbGetSpans(DrawablePtr pDrawable,
873           int wMax,
874           DDXPointPtr ppt, int *pwidth, int nspans, char *pchardstStart);
875
876/*
877 * fbglyph.c
878 */
879
880extern _X_EXPORT void
881
882fbPolyGlyphBlt(DrawablePtr pDrawable,
883               GCPtr pGC,
884               int x,
885               int y,
886               unsigned int nglyph, CharInfoPtr * ppci, void *pglyphBase);
887
888extern _X_EXPORT void
889
890fbImageGlyphBlt(DrawablePtr pDrawable,
891                GCPtr pGC,
892                int x,
893                int y,
894                unsigned int nglyph, CharInfoPtr * ppci, void *pglyphBase);
895
896/*
897 * fbimage.c
898 */
899
900extern _X_EXPORT void
901
902fbPutImage(DrawablePtr pDrawable,
903           GCPtr pGC,
904           int depth,
905           int x, int y, int w, int h, int leftPad, int format, char *pImage);
906
907extern _X_EXPORT void
908
909fbPutZImage(DrawablePtr pDrawable,
910            RegionPtr pClip,
911            int alu,
912            FbBits pm,
913            int x,
914            int y, int width, int height, FbStip * src, FbStride srcStride);
915
916extern _X_EXPORT void
917
918fbPutXYImage(DrawablePtr pDrawable,
919             RegionPtr pClip,
920             FbBits fg,
921             FbBits bg,
922             FbBits pm,
923             int alu,
924             Bool opaque,
925             int x,
926             int y,
927             int width, int height, FbStip * src, FbStride srcStride, int srcX);
928
929extern _X_EXPORT void
930
931fbGetImage(DrawablePtr pDrawable,
932           int x,
933           int y,
934           int w, int h, unsigned int format, unsigned long planeMask, char *d);
935/*
936 * fbline.c
937 */
938
939extern _X_EXPORT void
940fbPolyLine(DrawablePtr pDrawable,
941           GCPtr pGC, int mode, int npt, DDXPointPtr ppt);
942
943extern _X_EXPORT void
944 fbFixCoordModePrevious(int npt, DDXPointPtr ppt);
945
946extern _X_EXPORT void
947 fbPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg);
948
949#define fbPolyRectangle	miPolyRectangle
950
951/*
952 * fbpict.c
953 */
954
955extern _X_EXPORT Bool
956 fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats);
957
958extern _X_EXPORT void
959fbDestroyGlyphCache(void);
960
961/*
962 * fbpixmap.c
963 */
964
965extern _X_EXPORT PixmapPtr
966fbCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
967               unsigned usage_hint);
968
969extern _X_EXPORT Bool
970 fbDestroyPixmap(PixmapPtr pPixmap);
971
972extern _X_EXPORT RegionPtr
973 fbPixmapToRegion(PixmapPtr pPix);
974
975/*
976 * fbpoint.c
977 */
978
979extern _X_EXPORT void
980
981fbPolyPoint(DrawablePtr pDrawable,
982            GCPtr pGC, int mode, int npt, xPoint * pptInit);
983
984/*
985 * fbpush.c
986 */
987
988extern _X_EXPORT void
989
990fbPushImage(DrawablePtr pDrawable,
991            GCPtr pGC,
992            FbStip * src,
993            FbStride srcStride, int srcX, int x, int y, int width, int height);
994
995extern _X_EXPORT void
996
997fbPushPixels(GCPtr pGC,
998             PixmapPtr pBitmap,
999             DrawablePtr pDrawable, int dx, int dy, int xOrg, int yOrg);
1000
1001/*
1002 * fbscreen.c
1003 */
1004
1005extern _X_EXPORT Bool
1006 fbCloseScreen(ScreenPtr pScreen);
1007
1008extern _X_EXPORT Bool
1009 fbRealizeFont(ScreenPtr pScreen, FontPtr pFont);
1010
1011extern _X_EXPORT Bool
1012 fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont);
1013
1014extern _X_EXPORT void
1015
1016fbQueryBestSize(int class,
1017                unsigned short *width, unsigned short *height,
1018                ScreenPtr pScreen);
1019
1020extern _X_EXPORT PixmapPtr
1021 _fbGetWindowPixmap(WindowPtr pWindow);
1022
1023extern _X_EXPORT void
1024 _fbSetWindowPixmap(WindowPtr pWindow, PixmapPtr pPixmap);
1025
1026extern _X_EXPORT Bool
1027 fbSetupScreen(ScreenPtr pScreen, void *pbits,        /* pointer to screen bitmap */
1028               int xsize,       /* in pixels */
1029               int ysize, int dpix,     /* dots per inch */
1030               int dpiy, int width,     /* pixel width of frame buffer */
1031               int bpp);        /* bits per pixel of frame buffer */
1032
1033#ifdef FB_ACCESS_WRAPPER
1034extern _X_EXPORT Bool
1035wfbFinishScreenInit(ScreenPtr pScreen,
1036                    void *pbits,
1037                    int xsize,
1038                    int ysize,
1039                    int dpix,
1040                    int dpiy,
1041                    int width,
1042                    int bpp,
1043                    SetupWrapProcPtr setupWrap, FinishWrapProcPtr finishWrap);
1044
1045extern _X_EXPORT Bool
1046wfbScreenInit(ScreenPtr pScreen,
1047              void *pbits,
1048              int xsize,
1049              int ysize,
1050              int dpix,
1051              int dpiy,
1052              int width,
1053              int bpp,
1054              SetupWrapProcPtr setupWrap, FinishWrapProcPtr finishWrap);
1055#endif
1056
1057extern _X_EXPORT Bool
1058fbFinishScreenInit(ScreenPtr pScreen,
1059                   void *pbits,
1060                   int xsize,
1061                   int ysize, int dpix, int dpiy, int width, int bpp);
1062
1063extern _X_EXPORT Bool
1064
1065fbScreenInit(ScreenPtr pScreen,
1066             void *pbits,
1067             int xsize, int ysize, int dpix, int dpiy, int width, int bpp);
1068
1069/*
1070 * fbseg.c
1071 */
1072typedef void FbBres(DrawablePtr pDrawable,
1073                    GCPtr pGC,
1074                    int dashOffset,
1075                    int signdx,
1076                    int signdy,
1077                    int axis, int x, int y, int e, int e1, int e3, int len);
1078
1079extern _X_EXPORT void
1080fbSegment(DrawablePtr pDrawable,
1081          GCPtr pGC,
1082          int xa, int ya, int xb, int yb, Bool drawLast, int *dashOffset);
1083
1084/*
1085 * fbsetsp.c
1086 */
1087
1088extern _X_EXPORT void
1089fbSetSpans(DrawablePtr pDrawable,
1090           GCPtr pGC,
1091           char *src, DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
1092
1093/*
1094 * fbsolid.c
1095 */
1096
1097extern _X_EXPORT void
1098
1099fbSolid(FbBits * dst,
1100        FbStride dstStride,
1101        int dstX, int bpp, int width, int height, FbBits and, FbBits xor);
1102
1103/*
1104 * fbutil.c
1105 */
1106extern _X_EXPORT FbBits fbReplicatePixel(Pixel p, int bpp);
1107
1108#ifdef FB_ACCESS_WRAPPER
1109extern _X_EXPORT ReadMemoryProcPtr wfbReadMemory;
1110extern _X_EXPORT WriteMemoryProcPtr wfbWriteMemory;
1111#endif
1112
1113/*
1114 * fbtile.c
1115 */
1116
1117extern _X_EXPORT void
1118
1119fbEvenTile(FbBits * dst,
1120           FbStride dstStride,
1121           int dstX,
1122           int width,
1123           int height,
1124           FbBits * tile,
1125           FbStride tileStride,
1126           int tileHeight, int alu, FbBits pm, int xRot, int yRot);
1127
1128extern _X_EXPORT void
1129
1130fbOddTile(FbBits * dst,
1131          FbStride dstStride,
1132          int dstX,
1133          int width,
1134          int height,
1135          FbBits * tile,
1136          FbStride tileStride,
1137          int tileWidth,
1138          int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot);
1139
1140extern _X_EXPORT void
1141
1142fbTile(FbBits * dst,
1143       FbStride dstStride,
1144       int dstX,
1145       int width,
1146       int height,
1147       FbBits * tile,
1148       FbStride tileStride,
1149       int tileWidth,
1150       int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot);
1151
1152/*
1153 * fbwindow.c
1154 */
1155
1156extern _X_EXPORT Bool
1157 fbCreateWindow(WindowPtr pWin);
1158
1159extern _X_EXPORT Bool
1160 fbDestroyWindow(WindowPtr pWin);
1161
1162extern _X_EXPORT Bool
1163 fbRealizeWindow(WindowPtr pWindow);
1164
1165extern _X_EXPORT Bool
1166 fbPositionWindow(WindowPtr pWin, int x, int y);
1167
1168extern _X_EXPORT Bool
1169 fbUnrealizeWindow(WindowPtr pWindow);
1170
1171extern _X_EXPORT void
1172
1173fbCopyWindowProc(DrawablePtr pSrcDrawable,
1174                 DrawablePtr pDstDrawable,
1175                 GCPtr pGC,
1176                 BoxPtr pbox,
1177                 int nbox,
1178                 int dx,
1179                 int dy,
1180                 Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
1181
1182extern _X_EXPORT void
1183 fbCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
1184
1185extern _X_EXPORT Bool
1186 fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask);
1187
1188extern _X_EXPORT void
1189
1190fbFillRegionSolid(DrawablePtr pDrawable,
1191                  RegionPtr pRegion, FbBits and, FbBits xor);
1192
1193extern _X_EXPORT pixman_image_t *image_from_pict(PicturePtr pict,
1194                                                 Bool has_clip,
1195                                                 int *xoff, int *yoff);
1196
1197extern _X_EXPORT void free_pixman_pict(PicturePtr, pixman_image_t *);
1198
1199#endif                          /* _FB_H_ */
1200