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>
32 fbCopyNtoN(DrawablePtr pSrcDrawable,
33 DrawablePtr pDstDrawable,
38 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
40 CARD8 alu = pGC ? pGC->alu : GXcopy;
41 FbBits pm = pGC ? fbGetGCPrivate(pGC)->pm : FB_ALLONES;
51 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
52 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
55 #ifndef FB_ACCESS_WRAPPER /* pixman_blt() doesn't support accessors yet */
56 if (pm == FB_ALLONES && alu == GXcopy && !reverse && !upsidedown) {
58 ((uint32_t *) src, (uint32_t *) dst, srcStride, dstStride,
59 srcBpp, dstBpp, (pbox->x1 + dx + srcXoff),
60 (pbox->y1 + dy + srcYoff), (pbox->x1 + dstXoff),
61 (pbox->y1 + dstYoff), (pbox->x2 - pbox->x1),
62 (pbox->y2 - pbox->y1)))
69 fbBlt(src + (pbox->y1 + dy + srcYoff) * srcStride,
71 (pbox->x1 + dx + srcXoff) * srcBpp,
72 dst + (pbox->y1 + dstYoff) * dstStride,
74 (pbox->x1 + dstXoff) * dstBpp,
75 (pbox->x2 - pbox->x1) * dstBpp,
76 (pbox->y2 - pbox->y1), alu, pm, dstBpp, reverse, upsidedown);
77 #ifndef FB_ACCESS_WRAPPER
82 fbFinishAccess(pDstDrawable);
83 fbFinishAccess(pSrcDrawable);
87 fbCopy1toN(DrawablePtr pSrcDrawable,
88 DrawablePtr pDstDrawable,
93 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
95 FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
103 int dstXoff, dstYoff;
105 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
106 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
110 fbBlt(src + (pbox->y1 + dy + srcYoff) * srcStride,
112 (pbox->x1 + dx + srcXoff) * srcBpp,
113 dst + (pbox->y1 + dstYoff) * dstStride,
115 (pbox->x1 + dstXoff) * dstBpp,
116 (pbox->x2 - pbox->x1) * dstBpp,
117 (pbox->y2 - pbox->y1),
118 FbOpaqueStipple1Rop(pGC->alu,
119 pGC->fgPixel, pGC->bgPixel),
120 pPriv->pm, dstBpp, reverse, upsidedown);
123 fbBltOne((FbStip *) (src + (pbox->y1 + dy + srcYoff) * srcStride),
124 srcStride * (FB_UNIT / FB_STIP_UNIT),
125 (pbox->x1 + dx + srcXoff),
126 dst + (pbox->y1 + dstYoff) * dstStride,
128 (pbox->x1 + dstXoff) * dstBpp,
130 (pbox->x2 - pbox->x1) * dstBpp,
131 (pbox->y2 - pbox->y1),
132 pPriv->and, pPriv->xor, pPriv->bgand, pPriv->bgxor);
137 fbFinishAccess(pDstDrawable);
138 fbFinishAccess(pSrcDrawable);
142 fbCopyNto1(DrawablePtr pSrcDrawable,
143 DrawablePtr pDstDrawable,
148 int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
150 FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
153 if (pDstDrawable->bitsPerPixel == 1) {
157 int srcXoff, srcYoff;
162 int dstXoff, dstYoff;
164 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff,
166 fbGetStipDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff,
168 fbBltPlane(src + (pbox->y1 + dy + srcYoff) * srcStride, srcStride,
169 (pbox->x1 + dx + srcXoff) * srcBpp, srcBpp,
170 dst + (pbox->y1 + dstYoff) * dstStride, dstStride,
171 (pbox->x1 + dstXoff) * dstBpp,
172 (pbox->x2 - pbox->x1) * srcBpp, (pbox->y2 - pbox->y1),
173 (FbStip) pPriv->and, (FbStip) pPriv->xor,
174 (FbStip) pPriv->bgand, (FbStip) pPriv->bgxor, bitplane);
175 fbFinishAccess(pDstDrawable);
176 fbFinishAccess(pSrcDrawable);
182 int srcXoff, srcYoff;
187 int dstXoff, dstYoff;
193 width = pbox->x2 - pbox->x1;
194 height = pbox->y2 - pbox->y1;
196 tmpStride = ((width + FB_STIP_MASK) >> FB_STIP_SHIFT);
197 tmp = malloc(tmpStride * height * sizeof(FbStip));
201 fbGetDrawable(pSrcDrawable, src, srcStride, srcBpp, srcXoff,
203 fbGetDrawable(pDstDrawable, dst, dstStride, dstBpp, dstXoff,
206 fbBltPlane(src + (pbox->y1 + dy + srcYoff) * srcStride,
208 (pbox->x1 + dx + srcXoff) * srcBpp,
215 fbAndStip(GXcopy, FB_ALLONES, FB_ALLONES),
216 fbXorStip(GXcopy, FB_ALLONES, FB_ALLONES),
217 fbAndStip(GXcopy, 0, FB_ALLONES),
218 fbXorStip(GXcopy, 0, FB_ALLONES), bitplane);
222 dst + (pbox->y1 + dstYoff) * dstStride,
224 (pbox->x1 + dstXoff) * dstBpp,
228 pPriv->and, pPriv->xor, pPriv->bgand, pPriv->bgxor);
231 fbFinishAccess(pDstDrawable);
232 fbFinishAccess(pSrcDrawable);
239 fbCopyArea(DrawablePtr pSrcDrawable,
240 DrawablePtr pDstDrawable,
242 int xIn, int yIn, int widthSrc, int heightSrc, int xOut, int yOut)
246 if (pSrcDrawable->bitsPerPixel != pDstDrawable->bitsPerPixel)
247 copy = fb24_32CopyMtoN;
250 return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
251 widthSrc, heightSrc, xOut, yOut, copy, 0, 0);
255 fbCopyPlane(DrawablePtr pSrcDrawable,
256 DrawablePtr pDstDrawable,
261 int heightSrc, int xOut, int yOut, unsigned long bitplane)
263 if (pSrcDrawable->bitsPerPixel > 1)
264 return miDoCopy(pSrcDrawable, pDstDrawable, pGC,
265 xIn, yIn, widthSrc, heightSrc,
266 xOut, yOut, fbCopyNto1, (Pixel) bitplane, 0);
267 else if (bitplane & 1)
268 return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
269 widthSrc, heightSrc, xOut, yOut, fbCopy1toN,
270 (Pixel) bitplane, 0);
272 return miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
274 widthSrc, heightSrc, xOut, yOut, bitplane);