void fbCopyWindowProc (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, BoxPtr pbox, int nbox, int dx, int dy, Bool reverse, Bool upsidedown, Pixel bitplane, void *closure) { FbBits *src; FbStride srcStride; int srcBpp; int srcXoff, srcYoff; FbBits *dst; FbStride dstStride; int dstBpp; int dstXoff, dstYoff; fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff); fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff); while (nbox--) { fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride, srcStride, (pbox->x1 + dx + srcXoff) * srcBpp, dst + (pbox->y1 + dstYoff) * dstStride, dstStride, (pbox->x1 + dstXoff) * dstBpp, (pbox->x2 - pbox->x1) * dstBpp, (pbox->y2 - pbox->y1), GXcopy, FB_ALLONES, dstBpp, reverse, upsidedown); pbox++; } fbFinishAccess (pDstDrawable); fbFinishAccess (pSrcDrawable); }
int main (void) { int pagesize; FbBits *src; FbBits *dst; int srcX, dstX; int bpp; int alu = 1; FbBits pm = 0xffffffff; pagesize = getpagesize(); src = mmap(NULL, 2 * pagesize, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0); assert(src); dst = mmap(NULL, 2 * pagesize, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0); assert(dst); mprotect((char *)src + pagesize, pagesize, PROT_NONE); src = (FbBits *)((char *)src + (pagesize - sizeof map)); memcpy (src, map, sizeof map); for (bpp = 8; bpp <= 32; bpp += 8) for (dstX = 0; dstX < 64; dstX += bpp) for (srcX = 0; srcX < 32; srcX += bpp) fbBlt(src, 1, srcX, dst, 256, dstX, (32 - srcX), 2, alu, pm, bpp, 0, 0); for (bpp = 8; bpp <= 32; bpp += 8) for (dstX = 0; dstX < 64; dstX += bpp) for (srcX = 0; srcX < 32; srcX += bpp) fbBlt(src, 1, srcX, dst, 256, dstX, (64 - srcX), 1, alu, pm, bpp, 0, 0); return 0; }