1fa225cbcSrjs/* 2fa225cbcSrjs * 3fa225cbcSrjs * Copyright � 1999 Keith Packard 4fa225cbcSrjs * 5fa225cbcSrjs * Permission to use, copy, modify, distribute, and sell this software and its 6fa225cbcSrjs * documentation for any purpose is hereby granted without fee, provided that 7fa225cbcSrjs * the above copyright notice appear in all copies and that both that 8fa225cbcSrjs * copyright notice and this permission notice appear in supporting 9fa225cbcSrjs * documentation, and that the name of Keith Packard not be used in 10fa225cbcSrjs * advertising or publicity pertaining to distribution of the software without 11fa225cbcSrjs * specific, written prior permission. Keith Packard makes no 12fa225cbcSrjs * representations about the suitability of this software for any purpose. It 13fa225cbcSrjs * is provided "as is" without express or implied warranty. 14fa225cbcSrjs * 15fa225cbcSrjs * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16fa225cbcSrjs * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17fa225cbcSrjs * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18fa225cbcSrjs * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19fa225cbcSrjs * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20fa225cbcSrjs * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 21fa225cbcSrjs * PERFORMANCE OF THIS SOFTWARE. 22fa225cbcSrjs */ 23fa225cbcSrjs 24fa225cbcSrjs#include "uxa-priv.h" 25fa225cbcSrjs 26fa225cbcSrjs#ifdef RENDER 27fa225cbcSrjs#include "mipict.h" 28fa225cbcSrjs#endif 29fa225cbcSrjs 30fa225cbcSrjs/* 31fa225cbcSrjs * These functions wrap the low-level fb rendering functions and 32fa225cbcSrjs * synchronize framebuffer/accelerated drawing by stalling until 33fa225cbcSrjs * the accelerator is idle 34fa225cbcSrjs */ 35fa225cbcSrjs 36fa225cbcSrjs/** 37fa225cbcSrjs * Calls uxa_prepare_access with UXA_PREPARE_SRC for the tile, if that is the 38fa225cbcSrjs * current fill style. 39fa225cbcSrjs * 40fa225cbcSrjs * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are 41fa225cbcSrjs * 1bpp and never in fb, so we don't worry about them. 42fa225cbcSrjs * We should worry about them for completeness sake and going forward. 43fa225cbcSrjs */ 44fa225cbcSrjsBool 45fa225cbcSrjsuxa_prepare_access_gc(GCPtr pGC) 46fa225cbcSrjs{ 47fa225cbcSrjs if (pGC->stipple) 48fa225cbcSrjs if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO)) 49fa225cbcSrjs return FALSE; 50fa225cbcSrjs if (pGC->fillStyle == FillTiled) 51fa225cbcSrjs if (!uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) { 52fa225cbcSrjs if (pGC->stipple) 53fa225cbcSrjs uxa_finish_access(&pGC->stipple->drawable); 54fa225cbcSrjs return FALSE; 55fa225cbcSrjs } 56fa225cbcSrjs return TRUE; 57fa225cbcSrjs} 58fa225cbcSrjs 59fa225cbcSrjs/** 60fa225cbcSrjs * Finishes access to the tile in the GC, if used. 61fa225cbcSrjs */ 62fa225cbcSrjsvoid 63fa225cbcSrjsuxa_finish_access_gc(GCPtr pGC) 64fa225cbcSrjs{ 65fa225cbcSrjs if (pGC->fillStyle == FillTiled) 66fa225cbcSrjs uxa_finish_access(&pGC->tile.pixmap->drawable); 67fa225cbcSrjs if (pGC->stipple) 68fa225cbcSrjs uxa_finish_access(&pGC->stipple->drawable); 69fa225cbcSrjs} 70fa225cbcSrjs 71fa225cbcSrjschar 72fa225cbcSrjsuxa_drawable_location(DrawablePtr pDrawable) 73fa225cbcSrjs{ 74fa225cbcSrjs return uxa_drawable_is_offscreen(pDrawable) ? 's' : 'm'; 75fa225cbcSrjs} 76fa225cbcSrjs 77fa225cbcSrjsvoid 78fa225cbcSrjsuxa_check_fill_spans (DrawablePtr pDrawable, GCPtr pGC, int nspans, 79fa225cbcSrjs DDXPointPtr ppt, int *pwidth, int fSorted) 80fa225cbcSrjs{ 81fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 82fa225cbcSrjs 83fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 84fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 85fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 86fa225cbcSrjs fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted); 87fa225cbcSrjs uxa_finish_access_gc (pGC); 88fa225cbcSrjs } 89fa225cbcSrjs uxa_finish_access (pDrawable); 90fa225cbcSrjs } 91fa225cbcSrjs} 92fa225cbcSrjs 93fa225cbcSrjsvoid 94fa225cbcSrjsuxa_check_set_spans (DrawablePtr pDrawable, GCPtr pGC, char *psrc, 95fa225cbcSrjs DDXPointPtr ppt, int *pwidth, int nspans, int fSorted) 96fa225cbcSrjs{ 97fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 98fa225cbcSrjs 99fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 100fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 101fa225cbcSrjs fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted); 102fa225cbcSrjs uxa_finish_access (pDrawable); 103fa225cbcSrjs } 104fa225cbcSrjs} 105fa225cbcSrjs 106fa225cbcSrjsvoid 107fa225cbcSrjsuxa_check_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, 108fa225cbcSrjs int x, int y, int w, int h, int leftPad, int format, 109fa225cbcSrjs char *bits) 110fa225cbcSrjs{ 111fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 112fa225cbcSrjs 113fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 114fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 115fa225cbcSrjs fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); 116fa225cbcSrjs uxa_finish_access (pDrawable); 117fa225cbcSrjs } 118fa225cbcSrjs} 119fa225cbcSrjs 120fa225cbcSrjsRegionPtr 121fa225cbcSrjsuxa_check_copy_area (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, 122fa225cbcSrjs int srcx, int srcy, int w, int h, int dstx, int dsty) 123fa225cbcSrjs{ 124fa225cbcSrjs ScreenPtr screen = pSrc->pScreen; 125fa225cbcSrjs RegionPtr ret = NULL; 126fa225cbcSrjs 127fa225cbcSrjs UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, 128fa225cbcSrjs uxa_drawable_location(pSrc), uxa_drawable_location(pDst))); 129fa225cbcSrjs if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) { 130fa225cbcSrjs if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) { 131fa225cbcSrjs ret = fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); 132fa225cbcSrjs uxa_finish_access (pSrc); 133fa225cbcSrjs } 134fa225cbcSrjs uxa_finish_access (pDst); 135fa225cbcSrjs } 136fa225cbcSrjs return ret; 137fa225cbcSrjs} 138fa225cbcSrjs 139fa225cbcSrjsRegionPtr 140fa225cbcSrjsuxa_check_copy_plane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, 141fa225cbcSrjs int srcx, int srcy, int w, int h, int dstx, int dsty, 142fa225cbcSrjs unsigned long bitPlane) 143fa225cbcSrjs{ 144fa225cbcSrjs ScreenPtr screen = pSrc->pScreen; 145fa225cbcSrjs RegionPtr ret = NULL; 146fa225cbcSrjs 147fa225cbcSrjs UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, 148fa225cbcSrjs uxa_drawable_location(pSrc), uxa_drawable_location(pDst))); 149fa225cbcSrjs if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) { 150fa225cbcSrjs if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) { 151fa225cbcSrjs ret = fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, 152fa225cbcSrjs bitPlane); 153fa225cbcSrjs uxa_finish_access (pSrc); 154fa225cbcSrjs } 155fa225cbcSrjs uxa_finish_access (pDst); 156fa225cbcSrjs } 157fa225cbcSrjs return ret; 158fa225cbcSrjs} 159fa225cbcSrjs 160fa225cbcSrjsvoid 161fa225cbcSrjsuxa_check_poly_point (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, 162fa225cbcSrjs DDXPointPtr pptInit) 163fa225cbcSrjs{ 164fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 165fa225cbcSrjs 166fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 167fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 168fa225cbcSrjs fbPolyPoint (pDrawable, pGC, mode, npt, pptInit); 169fa225cbcSrjs uxa_finish_access (pDrawable); 170fa225cbcSrjs } 171fa225cbcSrjs} 172fa225cbcSrjs 173fa225cbcSrjsvoid 174fa225cbcSrjsuxa_check_poly_lines (DrawablePtr pDrawable, GCPtr pGC, 175fa225cbcSrjs int mode, int npt, DDXPointPtr ppt) 176fa225cbcSrjs{ 177fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 178fa225cbcSrjs 179fa225cbcSrjs UXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n", 180fa225cbcSrjs pDrawable, uxa_drawable_location(pDrawable), 181fa225cbcSrjs pGC->lineWidth, mode, npt)); 182fa225cbcSrjs 183fa225cbcSrjs if (pGC->lineWidth == 0) { 184fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 185fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 186fa225cbcSrjs fbPolyLine (pDrawable, pGC, mode, npt, ppt); 187fa225cbcSrjs uxa_finish_access_gc (pGC); 188fa225cbcSrjs } 189fa225cbcSrjs uxa_finish_access (pDrawable); 190fa225cbcSrjs } 191fa225cbcSrjs return; 192fa225cbcSrjs } 193fa225cbcSrjs /* fb calls mi functions in the lineWidth != 0 case. */ 194fa225cbcSrjs fbPolyLine (pDrawable, pGC, mode, npt, ppt); 195fa225cbcSrjs} 196fa225cbcSrjs 197fa225cbcSrjsvoid 198fa225cbcSrjsuxa_check_poly_segment (DrawablePtr pDrawable, GCPtr pGC, 199fa225cbcSrjs int nsegInit, xSegment *pSegInit) 200fa225cbcSrjs{ 201fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 202fa225cbcSrjs 203fa225cbcSrjs UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable, 204fa225cbcSrjs uxa_drawable_location(pDrawable), pGC->lineWidth, nsegInit)); 205fa225cbcSrjs if (pGC->lineWidth == 0) { 206fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 207fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 208fa225cbcSrjs fbPolySegment (pDrawable, pGC, nsegInit, pSegInit); 209fa225cbcSrjs uxa_finish_access_gc (pGC); 210fa225cbcSrjs } 211fa225cbcSrjs uxa_finish_access (pDrawable); 212fa225cbcSrjs } 213fa225cbcSrjs return; 214fa225cbcSrjs } 215fa225cbcSrjs /* fb calls mi functions in the lineWidth != 0 case. */ 216fa225cbcSrjs fbPolySegment (pDrawable, pGC, nsegInit, pSegInit); 217fa225cbcSrjs} 218fa225cbcSrjs 219fa225cbcSrjsvoid 220fa225cbcSrjsuxa_check_poly_arc (DrawablePtr pDrawable, GCPtr pGC, 221fa225cbcSrjs int narcs, xArc *pArcs) 222fa225cbcSrjs{ 223fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 224fa225cbcSrjs 225fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 226fa225cbcSrjs 227fa225cbcSrjs /* Disable this as fbPolyArc can call miZeroPolyArc which in turn 228fa225cbcSrjs * can call accelerated functions, that as yet, haven't been notified 229fa225cbcSrjs * with uxa_finish_access(). 230fa225cbcSrjs */ 231fa225cbcSrjs#if 0 232fa225cbcSrjs if (pGC->lineWidth == 0) 233fa225cbcSrjs { 234fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 235fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 236fa225cbcSrjs fbPolyArc (pDrawable, pGC, narcs, pArcs); 237fa225cbcSrjs uxa_finish_access_gc (pGC); 238fa225cbcSrjs } 239fa225cbcSrjs uxa_finish_access (pDrawable); 240fa225cbcSrjs } 241fa225cbcSrjs return; 242fa225cbcSrjs } 243fa225cbcSrjs#endif 244fa225cbcSrjs miPolyArc (pDrawable, pGC, narcs, pArcs); 245fa225cbcSrjs} 246fa225cbcSrjs 247fa225cbcSrjsvoid 248fa225cbcSrjsuxa_check_poly_fill_rect (DrawablePtr pDrawable, GCPtr pGC, 249fa225cbcSrjs int nrect, xRectangle *prect) 250fa225cbcSrjs{ 251fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 252fa225cbcSrjs 253fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 254fa225cbcSrjs 255fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 256fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 257fa225cbcSrjs fbPolyFillRect (pDrawable, pGC, nrect, prect); 258fa225cbcSrjs uxa_finish_access_gc (pGC); 259fa225cbcSrjs } 260fa225cbcSrjs uxa_finish_access (pDrawable); 261fa225cbcSrjs } 262fa225cbcSrjs} 263fa225cbcSrjs 264fa225cbcSrjsvoid 265fa225cbcSrjsuxa_check_image_glyph_blt (DrawablePtr pDrawable, GCPtr pGC, 266fa225cbcSrjs int x, int y, unsigned int nglyph, 267fa225cbcSrjs CharInfoPtr *ppci, pointer pglyphBase) 268fa225cbcSrjs{ 269fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 270fa225cbcSrjs 271fa225cbcSrjs UXA_FALLBACK(("to %p (%c)\n", pDrawable, 272fa225cbcSrjs uxa_drawable_location(pDrawable))); 273fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 274fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 275fa225cbcSrjs fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); 276fa225cbcSrjs uxa_finish_access_gc (pGC); 277fa225cbcSrjs } 278fa225cbcSrjs uxa_finish_access (pDrawable); 279fa225cbcSrjs } 280fa225cbcSrjs} 281fa225cbcSrjs 282fa225cbcSrjsvoid 283fa225cbcSrjsuxa_check_poly_glyph_blt (DrawablePtr pDrawable, GCPtr pGC, 284fa225cbcSrjs int x, int y, unsigned int nglyph, 285fa225cbcSrjs CharInfoPtr *ppci, pointer pglyphBase) 286fa225cbcSrjs{ 287fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 288fa225cbcSrjs 289fa225cbcSrjs UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable, 290fa225cbcSrjs uxa_drawable_location(pDrawable), pGC->fillStyle, pGC->alu)); 291fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 292fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 293fa225cbcSrjs fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); 294fa225cbcSrjs uxa_finish_access_gc (pGC); 295fa225cbcSrjs } 296fa225cbcSrjs uxa_finish_access (pDrawable); 297fa225cbcSrjs } 298fa225cbcSrjs} 299fa225cbcSrjs 300fa225cbcSrjsvoid 301fa225cbcSrjsuxa_check_push_pixels (GCPtr pGC, PixmapPtr pBitmap, 302fa225cbcSrjs DrawablePtr pDrawable, 303fa225cbcSrjs int w, int h, int x, int y) 304fa225cbcSrjs{ 305fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 306fa225cbcSrjs 307fa225cbcSrjs UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable, 308fa225cbcSrjs uxa_drawable_location(&pBitmap->drawable), 309fa225cbcSrjs uxa_drawable_location(pDrawable))); 310fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { 311fa225cbcSrjs if (uxa_prepare_access (&pBitmap->drawable, UXA_ACCESS_RO)) { 312fa225cbcSrjs if (uxa_prepare_access_gc (pGC)) { 313fa225cbcSrjs fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y); 314fa225cbcSrjs uxa_finish_access_gc (pGC); 315fa225cbcSrjs } 316fa225cbcSrjs uxa_finish_access (&pBitmap->drawable); 317fa225cbcSrjs } 318fa225cbcSrjs uxa_finish_access (pDrawable); 319fa225cbcSrjs } 320fa225cbcSrjs} 321fa225cbcSrjs 322fa225cbcSrjsvoid 323fa225cbcSrjsuxa_check_get_spans (DrawablePtr pDrawable, 324fa225cbcSrjs int wMax, 325fa225cbcSrjs DDXPointPtr ppt, 326fa225cbcSrjs int *pwidth, 327fa225cbcSrjs int nspans, 328fa225cbcSrjs char *pdstStart) 329fa225cbcSrjs{ 330fa225cbcSrjs ScreenPtr screen = pDrawable->pScreen; 331fa225cbcSrjs 332fa225cbcSrjs UXA_FALLBACK(("from %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); 333fa225cbcSrjs if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) { 334fa225cbcSrjs fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart); 335fa225cbcSrjs uxa_finish_access (pDrawable); 336fa225cbcSrjs } 337fa225cbcSrjs} 338fa225cbcSrjs 339fa225cbcSrjsvoid 340fa225cbcSrjsuxa_check_composite (CARD8 op, 341fa225cbcSrjs PicturePtr pSrc, 342fa225cbcSrjs PicturePtr pMask, 343fa225cbcSrjs PicturePtr pDst, 344fa225cbcSrjs INT16 xSrc, 345fa225cbcSrjs INT16 ySrc, 346fa225cbcSrjs INT16 xMask, 347fa225cbcSrjs INT16 yMask, 348fa225cbcSrjs INT16 xDst, 349fa225cbcSrjs INT16 yDst, 350fa225cbcSrjs CARD16 width, 351fa225cbcSrjs CARD16 height) 352fa225cbcSrjs{ 353fa225cbcSrjs ScreenPtr screen = pDst->pDrawable->pScreen; 354fa225cbcSrjs 355fa225cbcSrjs UXA_FALLBACK(("from picts %p/%p to pict %p\n", 356fa225cbcSrjs pSrc, pMask, pDst)); 357fa225cbcSrjs 358fa225cbcSrjs if (uxa_prepare_access (pDst->pDrawable, UXA_ACCESS_RW)) 359fa225cbcSrjs { 360fa225cbcSrjs if (pSrc->pDrawable == NULL || 361fa225cbcSrjs uxa_prepare_access (pSrc->pDrawable, UXA_ACCESS_RO)) 362fa225cbcSrjs { 363fa225cbcSrjs if (!pMask || pMask->pDrawable == NULL || 364fa225cbcSrjs uxa_prepare_access (pMask->pDrawable, UXA_ACCESS_RO)) 365fa225cbcSrjs { 366fa225cbcSrjs fbComposite (op, 367fa225cbcSrjs pSrc, 368fa225cbcSrjs pMask, 369fa225cbcSrjs pDst, 370fa225cbcSrjs xSrc, 371fa225cbcSrjs ySrc, 372fa225cbcSrjs xMask, 373fa225cbcSrjs yMask, 374fa225cbcSrjs xDst, 375fa225cbcSrjs yDst, 376fa225cbcSrjs width, 377fa225cbcSrjs height); 378fa225cbcSrjs if (pMask && pMask->pDrawable != NULL) 379fa225cbcSrjs uxa_finish_access (pMask->pDrawable); 380fa225cbcSrjs } 381fa225cbcSrjs if (pSrc->pDrawable != NULL) 382fa225cbcSrjs uxa_finish_access (pSrc->pDrawable); 383fa225cbcSrjs } 384fa225cbcSrjs uxa_finish_access (pDst->pDrawable); 385fa225cbcSrjs } 386fa225cbcSrjs} 387fa225cbcSrjs 388fa225cbcSrjsvoid 389fa225cbcSrjsuxa_check_add_traps (PicturePtr pPicture, 390fa225cbcSrjs INT16 x_off, 391fa225cbcSrjs INT16 y_off, 392fa225cbcSrjs int ntrap, 393fa225cbcSrjs xTrap *traps) 394fa225cbcSrjs{ 395fa225cbcSrjs ScreenPtr screen = pPicture->pDrawable->pScreen; 396fa225cbcSrjs 397fa225cbcSrjs UXA_FALLBACK(("to pict %p (%c)\n", pPicture, 398fa225cbcSrjs uxa_drawable_location(pPicture->pDrawable))); 399fa225cbcSrjs if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) { 400fa225cbcSrjs fbAddTraps (pPicture, x_off, y_off, ntrap, traps); 401fa225cbcSrjs uxa_finish_access(pPicture->pDrawable); 402fa225cbcSrjs } 403fa225cbcSrjs} 404fa225cbcSrjs 405fa225cbcSrjs/** 406fa225cbcSrjs * Gets the 0,0 pixel of a pixmap. Used for doing solid fills of tiled pixmaps 407fa225cbcSrjs * that happen to be 1x1. Pixmap must be at least 8bpp. 408fa225cbcSrjs * 409fa225cbcSrjs * XXX This really belongs in fb, so it can be aware of tiling and etc. 410fa225cbcSrjs */ 411fa225cbcSrjsCARD32 412fa225cbcSrjsuxa_get_pixmap_first_pixel (PixmapPtr pPixmap) 413fa225cbcSrjs{ 414fa225cbcSrjs CARD32 pixel; 415fa225cbcSrjs void *fb; 416fa225cbcSrjs 417fa225cbcSrjs if (!uxa_prepare_access (&pPixmap->drawable, UXA_ACCESS_RO)) 418fa225cbcSrjs return 0; 419fa225cbcSrjs 420fa225cbcSrjs fb = pPixmap->devPrivate.ptr; 421fa225cbcSrjs 422fa225cbcSrjs switch (pPixmap->drawable.bitsPerPixel) { 423fa225cbcSrjs case 32: 424fa225cbcSrjs pixel = *(CARD32 *)fb; 425fa225cbcSrjs break; 426fa225cbcSrjs case 16: 427fa225cbcSrjs pixel = *(CARD16 *)fb; 428fa225cbcSrjs break; 429fa225cbcSrjs default: 430fa225cbcSrjs pixel = *(CARD8 *)fb; 431fa225cbcSrjs break; 432fa225cbcSrjs } 433fa225cbcSrjs uxa_finish_access(&pPixmap->drawable); 434fa225cbcSrjs 435fa225cbcSrjs return pixel; 436fa225cbcSrjs} 437