2 * Copyright © 1999 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.
24 #include <kdrive-config.h>
28 #include "picturestr.h"
33 * These functions wrap the low-level fb rendering functions and
34 * synchronize framebuffer/accelerated drawing by stalling until
35 * the accelerator is idle
39 KdCheckFillSpans (DrawablePtr pDrawable
, GCPtr pGC
, int nspans
,
40 DDXPointPtr ppt
, int *pwidth
, int fSorted
)
42 kaaWaitSync (pDrawable
->pScreen
);
43 kaaDrawableDirty (pDrawable
);
44 fbFillSpans (pDrawable
, pGC
, nspans
, ppt
, pwidth
, fSorted
);
48 KdCheckSetSpans (DrawablePtr pDrawable
, GCPtr pGC
, char *psrc
,
49 DDXPointPtr ppt
, int *pwidth
, int nspans
, int fSorted
)
51 kaaWaitSync (pDrawable
->pScreen
);
52 kaaDrawableDirty (pDrawable
);
53 fbSetSpans (pDrawable
, pGC
, psrc
, ppt
, pwidth
, nspans
, fSorted
);
57 KdCheckPutImage (DrawablePtr pDrawable
, GCPtr pGC
, int depth
,
58 int x
, int y
, int w
, int h
, int leftPad
, int format
,
61 kaaWaitSync (pDrawable
->pScreen
);
62 kaaDrawableDirty (pDrawable
);
63 fbPutImage (pDrawable
, pGC
, depth
, x
, y
, w
, h
, leftPad
, format
, bits
);
67 KdCheckCopyArea (DrawablePtr pSrc
, DrawablePtr pDst
, GCPtr pGC
,
68 int srcx
, int srcy
, int w
, int h
, int dstx
, int dsty
)
70 kaaWaitSync (pSrc
->pScreen
);
71 kaaDrawableDirty (pDst
);
72 return fbCopyArea (pSrc
, pDst
, pGC
, srcx
, srcy
, w
, h
, dstx
, dsty
);
76 KdCheckCopyPlane (DrawablePtr pSrc
, DrawablePtr pDst
, GCPtr pGC
,
77 int srcx
, int srcy
, int w
, int h
, int dstx
, int dsty
,
78 unsigned long bitPlane
)
80 kaaWaitSync (pSrc
->pScreen
);
81 kaaDrawableDirty (pDst
);
82 return fbCopyPlane (pSrc
, pDst
, pGC
, srcx
, srcy
, w
, h
, dstx
, dsty
,
87 KdCheckPolyPoint (DrawablePtr pDrawable
, GCPtr pGC
, int mode
, int npt
,
90 kaaWaitSync (pDrawable
->pScreen
);
91 kaaDrawableDirty (pDrawable
);
92 fbPolyPoint (pDrawable
, pGC
, mode
, npt
, pptInit
);
96 KdCheckPolylines (DrawablePtr pDrawable
, GCPtr pGC
,
97 int mode
, int npt
, DDXPointPtr ppt
)
100 if (pGC
->lineWidth
== 0) {
101 kaaWaitSync(pDrawable
->pScreen
);
102 kaaDrawableDirty (pDrawable
);
104 kaaDrawableDirty (pDrawable
);
105 fbPolyLine (pDrawable
, pGC
, mode
, npt
, ppt
);
109 KdCheckPolySegment (DrawablePtr pDrawable
, GCPtr pGC
,
110 int nsegInit
, xSegment
*pSegInit
)
112 if (pGC
->lineWidth
== 0) {
113 kaaWaitSync(pDrawable
->pScreen
);
114 kaaDrawableDirty (pDrawable
);
116 kaaDrawableDirty (pDrawable
);
117 fbPolySegment (pDrawable
, pGC
, nsegInit
, pSegInit
);
121 KdCheckPolyRectangle (DrawablePtr pDrawable
, GCPtr pGC
,
122 int nrects
, xRectangle
*prect
)
124 if (pGC
->lineWidth
== 0) {
125 kaaWaitSync(pDrawable
->pScreen
);
126 kaaDrawableDirty (pDrawable
);
128 fbPolyRectangle (pDrawable
, pGC
, nrects
, prect
);
132 KdCheckPolyArc (DrawablePtr pDrawable
, GCPtr pGC
,
133 int narcs
, xArc
*pArcs
)
135 if (pGC
->lineWidth
== 0)
137 kaaWaitSync(pDrawable
->pScreen
);
138 kaaDrawableDirty (pDrawable
);
139 fbPolyArc (pDrawable
, pGC
, narcs
, pArcs
);
142 miPolyArc (pDrawable
, pGC
, narcs
, pArcs
);
147 KdCheckFillPolygon (DrawablePtr pDrawable
, GCPtr pGC
,
148 int shape
, int mode
, int count
, DDXPointPtr pPts
)
150 kaaWaitSync(pDrawable
->pScreen
);
151 kaaDrawableDirty (pDrawable
);
152 fbFillPolygon (pDrawable
, pGC
, mode
, count
, pPts
);
157 KdCheckPolyFillRect (DrawablePtr pDrawable
, GCPtr pGC
,
158 int nrect
, xRectangle
*prect
)
160 kaaWaitSync(pDrawable
->pScreen
);
161 kaaDrawableDirty (pDrawable
);
162 fbPolyFillRect (pDrawable
, pGC
, nrect
, prect
);
166 KdCheckPolyFillArc (DrawablePtr pDrawable
, GCPtr pGC
,
167 int narcs
, xArc
*pArcs
)
169 kaaWaitSync(pDrawable
->pScreen
);
170 kaaDrawableDirty (pDrawable
);
171 fbPolyFillArc (pDrawable
, pGC
, narcs
, pArcs
);
175 KdCheckImageGlyphBlt (DrawablePtr pDrawable
, GCPtr pGC
,
176 int x
, int y
, unsigned int nglyph
,
177 CharInfoPtr
*ppci
, pointer pglyphBase
)
179 kaaWaitSync(pDrawable
->pScreen
);
180 kaaDrawableDirty (pDrawable
);
181 fbImageGlyphBlt (pDrawable
, pGC
, x
, y
, nglyph
, ppci
, pglyphBase
);
185 KdCheckPolyGlyphBlt (DrawablePtr pDrawable
, GCPtr pGC
,
186 int x
, int y
, unsigned int nglyph
,
187 CharInfoPtr
*ppci
, pointer pglyphBase
)
189 kaaWaitSync(pDrawable
->pScreen
);
190 kaaDrawableDirty (pDrawable
);
191 fbPolyGlyphBlt (pDrawable
, pGC
, x
, y
, nglyph
, ppci
, pglyphBase
);
195 KdCheckPushPixels (GCPtr pGC
, PixmapPtr pBitmap
,
196 DrawablePtr pDrawable
,
197 int w
, int h
, int x
, int y
)
199 kaaWaitSync(pDrawable
->pScreen
);
200 kaaDrawableDirty (pDrawable
);
201 fbPushPixels (pGC
, pBitmap
, pDrawable
, w
, h
, x
, y
);
205 KdCheckGetImage (DrawablePtr pDrawable
,
206 int x
, int y
, int w
, int h
,
207 unsigned int format
, unsigned long planeMask
,
210 kaaWaitSync(pDrawable
->pScreen
);
211 fbGetImage (pDrawable
, x
, y
, w
, h
, format
, planeMask
, d
);
215 KdCheckGetSpans (DrawablePtr pDrawable
,
222 kaaWaitSync(pDrawable
->pScreen
);
223 fbGetSpans (pDrawable
, wMax
, ppt
, pwidth
, nspans
, pdstStart
);
227 KdCheckSaveAreas (PixmapPtr pPixmap
,
233 kaaWaitSync(pWin
->drawable
.pScreen
);
234 kaaDrawableDirty (&pPixmap
->drawable
);
235 fbSaveAreas (pPixmap
, prgnSave
, xorg
, yorg
, pWin
);
239 KdCheckRestoreAreas (PixmapPtr pPixmap
,
245 kaaWaitSync(pWin
->drawable
.pScreen
);
246 kaaDrawableDirty ((DrawablePtr
)pWin
);
247 fbRestoreAreas (pPixmap
, prgnSave
, xorg
, yorg
, pWin
);
251 KdCheckPaintWindow (WindowPtr pWin
, RegionPtr pRegion
, int what
)
253 kaaWaitSync (pWin
->drawable
.pScreen
);
254 kaaDrawableDirty ((DrawablePtr
)pWin
);
255 fbPaintWindow (pWin
, pRegion
, what
);
259 KdCheckCopyWindow (WindowPtr pWin
, DDXPointRec ptOldOrg
, RegionPtr prgnSrc
)
261 kaaWaitSync (pWin
->drawable
.pScreen
);
262 kaaDrawableDirty ((DrawablePtr
)pWin
);
263 fbCopyWindow (pWin
, ptOldOrg
, prgnSrc
);
268 KdCheckPaintKey(DrawablePtr pDrawable
,
273 kaaWaitSync (pDrawable
->pScreen
);
274 kaaDrawableDirty (pDrawable
);
275 fbOverlayPaintKey (pDrawable
, pRegion
, pixel
, layer
);
279 KdCheckOverlayCopyWindow (WindowPtr pWin
, DDXPointRec ptOldOrg
, RegionPtr prgnSrc
)
281 kaaWaitSync (pWin
->drawable
.pScreen
);
282 kaaDrawableDirty ((DrawablePtr
)pWin
);
283 fbOverlayCopyWindow (pWin
, ptOldOrg
, prgnSrc
);
288 KdScreenInitAsync (ScreenPtr pScreen
)
290 pScreen
->GetImage
= KdCheckGetImage
;
291 pScreen
->GetSpans
= KdCheckGetSpans
;
292 pScreen
->PaintWindowBackground
= KdCheckPaintWindow
;
293 pScreen
->PaintWindowBorder
= KdCheckPaintWindow
;
294 pScreen
->CopyWindow
= KdCheckCopyWindow
;
296 pScreen
->BackingStoreFuncs
.SaveAreas
= KdCheckSaveAreas
;
297 pScreen
->BackingStoreFuncs
.RestoreAreas
= KdCheckRestoreAreas
;
299 KdPictureInitAsync (pScreen
);
304 KdCheckComposite (CARD8 op
,
317 kaaWaitSync (pDst
->pDrawable
->pScreen
);
318 kaaDrawableDirty (pDst
->pDrawable
);
334 KdCheckRasterizeTrapezoid(PicturePtr pMask
,
339 kaaWaitSync (pMask
->pDrawable
->pScreen
);
340 kaaDrawableDirty (pMask
->pDrawable
);
341 fbRasterizeTrapezoid (pMask
, trap
, x_off
, y_off
);
345 * Only need to stall for copyarea/copyplane
347 const GCOps kdAsyncPixmapGCOps
= {
371 KdPictureInitAsync (ScreenPtr pScreen
)
375 ps
= GetPictureScreen(pScreen
);
376 ps
->Composite
= KdCheckComposite
;
377 ps
->RasterizeTrapezoid
= KdCheckRasterizeTrapezoid
;