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
);