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>
31 /* Compatibility wrapper, to be removed at next ABI change. */
33 fbCopyRegion(DrawablePtr pSrcDrawable,
34 DrawablePtr pDstDrawable,
37 int dx, int dy, fbCopyProc copyProc, Pixel bitPlane, void *closure)
39 miCopyRegion(pSrcDrawable, pDstDrawable, pGC, pDstRegion, dx, dy, copyProc,
43 /* Compatibility wrapper, to be removed at next ABI change. */
45 fbDoCopy(DrawablePtr pSrcDrawable,
46 DrawablePtr pDstDrawable,
52 int xOut, int yOut, fbCopyProc copyProc, Pixel bitPlane, void *closure)
54 return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn, widthSrc,
55 heightSrc, xOut, yOut, copyProc, bitPlane, closure);
59 fbCopyNtoN(DrawablePtr pSrcDrawable,
60 DrawablePtr pDstDrawable,
65 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
67 CARD8 alu = pGC ? pGC->alu : GXcopy;
68 FbBits pm = pGC ? fbGetGCPrivate(pGC)->pm : FB_ALLONES;
78 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
79 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
82 #ifndef FB_ACCESS_WRAPPER /* pixman_blt() doesn't support accessors yet */
83 if (pm == FB_ALLONES && alu == GXcopy && !reverse && !upsidedown) {
85 ((uint32_t *) src, (uint32_t *) dst, srcStride, dstStride,
86 srcBpp, dstBpp, (pbox->x1 + dx + srcXoff),
87 (pbox->y1 + dy + srcYoff), (pbox->x1 + dstXoff),
88 (pbox->y1 + dstYoff), (pbox->x2 - pbox->x1),
89 (pbox->y2 - pbox->y1)))
96 fbBlt(src + (pbox->y1 + dy + srcYoff) * srcStride,
98 (pbox->x1 + dx + srcXoff) * srcBpp,
99 dst + (pbox->y1 + dstYoff) * dstStride,
101 (pbox->x1 + dstXoff) * dstBpp,
102 (pbox->x2 - pbox->x1) * dstBpp,
103 (pbox->y2 - pbox->y1), alu, pm, dstBpp, reverse, upsidedown);
104 #ifndef FB_ACCESS_WRAPPER
109 fbFinishAccess(pDstDrawable);
110 fbFinishAccess(pSrcDrawable);
114 fbCopy1toN(DrawablePtr pSrcDrawable,
115 DrawablePtr pDstDrawable,
120 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
122 FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
126 int srcXoff, srcYoff;
130 int dstXoff, dstYoff;
132 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
133 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
137 fbBlt(src + (pbox->y1 + dy + srcYoff) * srcStride,
139 (pbox->x1 + dx + srcXoff) * srcBpp,
140 dst + (pbox->y1 + dstYoff) * dstStride,
142 (pbox->x1 + dstXoff) * dstBpp,
143 (pbox->x2 - pbox->x1) * dstBpp,
144 (pbox->y2 - pbox->y1),
145 FbOpaqueStipple1Rop(pGC->alu,
146 pGC->fgPixel, pGC->bgPixel),
147 pPriv->pm, dstBpp, reverse, upsidedown);
150 fbBltOne((FbStip *) (src + (pbox->y1 + dy + srcYoff) * srcStride),
151 srcStride * (FB_UNIT / FB_STIP_UNIT),
152 (pbox->x1 + dx + srcXoff),
153 dst + (pbox->y1 + dstYoff) * dstStride,
155 (pbox->x1 + dstXoff) * dstBpp,
157 (pbox->x2 - pbox->x1) * dstBpp,
158 (pbox->y2 - pbox->y1),
159 pPriv->and, pPriv->xor, pPriv->bgand, pPriv->bgxor);
164 fbFinishAccess(pDstDrawable);
165 fbFinishAccess(pSrcDrawable);
169 fbCopyNto1(DrawablePtr pSrcDrawable,
170 DrawablePtr pDstDrawable,
175 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
177 FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
180 if (pDstDrawable->bitsPerPixel == 1) {
184 int srcXoff, srcYoff;
189 int dstXoff, dstYoff;
191 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff,
193 fbGetStipDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff,
195 fbBltPlane(src + (pbox->y1 + dy + srcYoff) * srcStride, srcStride,
196 (pbox->x1 + dx + srcXoff) * srcBpp, srcBpp,
197 dst + (pbox->y1 + dstYoff) * dstStride, dstStride,
198 (pbox->x1 + dstXoff) * dstBpp,
199 (pbox->x2 - pbox->x1) * srcBpp, (pbox->y2 - pbox->y1),
200 (FbStip) pPriv->and, (FbStip) pPriv->xor,
201 (FbStip) pPriv->bgand, (FbStip) pPriv->bgxor, bitplane);
202 fbFinishAccess(pDstDrawable);
203 fbFinishAccess(pSrcDrawable);
209 int srcXoff, srcYoff;
214 int dstXoff, dstYoff;
220 width = pbox->x2 - pbox->x1;
221 height = pbox->y2 - pbox->y1;
223 tmpStride = ((width + FB_STIP_MASK) >> FB_STIP_SHIFT);
224 tmp = malloc(tmpStride * height * sizeof(FbStip));
228 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff,
230 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff,
233 fbBltPlane(src + (pbox->y1 + dy + srcYoff) * srcStride,
235 (pbox->x1 + dx + srcXoff) * srcBpp,
242 fbAndStip(GXcopy, FB_ALLONES, FB_ALLONES),
243 fbXorStip(GXcopy, FB_ALLONES, FB_ALLONES),
244 fbAndStip(GXcopy, 0, FB_ALLONES),
245 fbXorStip(GXcopy, 0, FB_ALLONES), bitplane);
249 dst + (pbox->y1 + dstYoff) * dstStride,
251 (pbox->x1 + dstXoff) * dstBpp,
255 pPriv->and, pPriv->xor, pPriv->bgand, pPriv->bgxor);
258 fbFinishAccess(pDstDrawable);
259 fbFinishAccess(pSrcDrawable);
266 fbCopyArea(DrawablePtr pSrcDrawable,
267 DrawablePtr pDstDrawable,
269 int xIn, int yIn, int widthSrc, int heightSrc, int xOut, int yOut)
273 if (pSrcDrawable->bitsPerPixel != pDstDrawable->bitsPerPixel)
274 copy = fb24_32CopyMtoN;
277 return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
278 widthSrc, heightSrc, xOut, yOut, copy, 0, 0);
282 fbCopyPlane(DrawablePtr pSrcDrawable,
283 DrawablePtr pDstDrawable,
288 int heightSrc, int xOut, int yOut, unsigned long bitplane)
290 if (pSrcDrawable->bitsPerPixel > 1)
291 return miDoCopy(pSrcDrawable, pDstDrawable, pGC,
292 xIn, yIn, widthSrc, heightSrc,
293 xOut, yOut, fbCopyNto1, (Pixel) bitplane, 0);
294 else if (bitplane & 1)
295 return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
296 widthSrc, heightSrc, xOut, yOut, fbCopy1toN,
297 (Pixel) bitplane, 0);
299 return miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
301 widthSrc, heightSrc, xOut, yOut, bitplane);