2 * Copyright © 1998 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Keith Packard makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
23 #ifdef HAVE_DIX_CONFIG_H
24 #include <dix-config.h>
30 fbFill(DrawablePtr pDrawable
, GCPtr pGC
, int x
, int y
, int width
, int height
)
36 FbGCPrivPtr pPriv
= fbGetGCPrivate(pGC
);
38 fbGetDrawable(pDrawable
, dst
, dstStride
, dstBpp
, dstXoff
, dstYoff
);
40 switch (pGC
->fillStyle
) {
42 #ifndef FB_ACCESS_WRAPPER
43 if (pPriv
->and || !pixman_fill((uint32_t *) dst
, dstStride
, dstBpp
,
44 x
+ dstXoff
, y
+ dstYoff
,
45 width
, height
, pPriv
->xor))
47 fbSolid(dst
+ (y
+ dstYoff
) * dstStride
,
49 (x
+ dstXoff
) * dstBpp
,
50 dstBpp
, width
* dstBpp
, height
, pPriv
->and, pPriv
->xor);
53 case FillOpaqueStippled
:{
54 PixmapPtr pStip
= pGC
->stipple
;
55 int stipWidth
= pStip
->drawable
.width
;
56 int stipHeight
= pStip
->drawable
.height
;
63 _X_UNUSED
int stipXoff
, stipYoff
;
65 if (pGC
->fillStyle
== FillStippled
)
66 alu
= FbStipple1Rop(pGC
->alu
, pGC
->fgPixel
);
68 alu
= FbOpaqueStipple1Rop(pGC
->alu
, pGC
->fgPixel
, pGC
->bgPixel
);
69 fbGetDrawable(&pStip
->drawable
, stip
, stipStride
, stipBpp
, stipXoff
,
71 fbTile(dst
+ (y
+ dstYoff
) * dstStride
, dstStride
, x
+ dstXoff
,
72 width
, height
, stip
, stipStride
, stipWidth
, stipHeight
, alu
,
73 pPriv
->pm
, dstBpp
, (pGC
->patOrg
.x
+ pDrawable
->x
+ dstXoff
),
74 pGC
->patOrg
.y
+ pDrawable
->y
- y
);
75 fbFinishAccess(&pStip
->drawable
);
81 _X_UNUSED
int stipXoff
, stipYoff
;
82 FbBits fgand
, fgxor
, bgand
, bgxor
;
86 if (pGC
->fillStyle
== FillStippled
) {
87 bgand
= fbAnd(GXnoop
, (FbBits
) 0, FB_ALLONES
);
88 bgxor
= fbXor(GXnoop
, (FbBits
) 0, FB_ALLONES
);
95 fbGetStipDrawable(&pStip
->drawable
, stip
, stipStride
, stipBpp
,
97 fbStipple(dst
+ (y
+ dstYoff
) * dstStride
, dstStride
,
98 (x
+ dstXoff
) * dstBpp
, dstBpp
, width
* dstBpp
, height
,
99 stip
, stipStride
, stipWidth
, stipHeight
,
100 pPriv
->evenStipple
, fgand
, fgxor
, bgand
, bgxor
,
101 pGC
->patOrg
.x
+ pDrawable
->x
+ dstXoff
,
102 pGC
->patOrg
.y
+ pDrawable
->y
- y
);
103 fbFinishAccess(&pStip
->drawable
);
108 PixmapPtr pTile
= pGC
->tile
.pixmap
;
114 _X_UNUSED
int tileXoff
, tileYoff
;
116 fbGetDrawable(&pTile
->drawable
, tile
, tileStride
, tileBpp
, tileXoff
,
118 tileWidth
= pTile
->drawable
.width
;
119 tileHeight
= pTile
->drawable
.height
;
120 fbTile(dst
+ (y
+ dstYoff
) * dstStride
,
122 (x
+ dstXoff
) * dstBpp
,
123 width
* dstBpp
, height
,
131 (pGC
->patOrg
.x
+ pDrawable
->x
+ dstXoff
) * dstBpp
,
132 pGC
->patOrg
.y
+ pDrawable
->y
- y
);
133 fbFinishAccess(&pTile
->drawable
);
137 fbValidateDrawable(pDrawable
);
138 fbFinishAccess(pDrawable
);
142 fbSolidBoxClipped(DrawablePtr pDrawable
,
144 int x1
, int y1
, int x2
, int y2
, FbBits
and, FbBits
xor)
149 int dstXoff
, dstYoff
;
152 int partX1
, partX2
, partY1
, partY2
;
154 fbGetDrawable(pDrawable
, dst
, dstStride
, dstBpp
, dstXoff
, dstYoff
);
156 for (nbox
= RegionNumRects(pClip
), pbox
= RegionRects(pClip
);
166 if (partX2
<= partX1
)
177 if (partY2
<= partY1
)
180 #ifndef FB_ACCESS_WRAPPER
181 if (and || !pixman_fill((uint32_t *) dst
, dstStride
, dstBpp
,
182 partX1
+ dstXoff
, partY1
+ dstYoff
,
183 (partX2
- partX1
), (partY2
- partY1
), xor))
185 fbSolid(dst
+ (partY1
+ dstYoff
) * dstStride
,
187 (partX1
+ dstXoff
) * dstBpp
,
189 (partX2
- partX1
) * dstBpp
, (partY2
- partY1
), and, xor);
191 fbFinishAccess(pDrawable
);