Use negative strides in Xgl if pixel data have bottom-top scanline order

This commit is contained in:
David Reveman 2004-11-05 12:46:29 +00:00
parent 2dd76d646c
commit 1d994e1d14
4 changed files with 20 additions and 22 deletions

View File

@ -698,7 +698,6 @@ Bool
xglSetPixels (DrawablePtr pDrawable,
char *src,
int stride,
Bool upsideDown,
int x,
int y,
int width,

View File

@ -159,7 +159,6 @@ xglPutImage (DrawablePtr pDrawable,
if (xglSetPixels (pDrawable,
bits,
PixmapBytePad (w, pDrawable->depth),
FALSE,
x + pDrawable->x, y + pDrawable->y,
w, h,
REGION_RECTS (pGC->pCompositeClip),

View File

@ -30,7 +30,6 @@ Bool
xglSetPixels (DrawablePtr pDrawable,
char *src,
int stride,
Bool upsideDown,
int x,
int y,
int width,
@ -45,7 +44,6 @@ xglSetPixels (DrawablePtr pDrawable,
BoxPtr pDstBox;
int nDstBox;
int dstXoff, dstYoff, dstBpp;
int dstY, srcY;
int x1, y1, x2, y2;
XGL_DRAWABLE_PIXMAP (pDrawable);
@ -94,21 +92,11 @@ xglSetPixels (DrawablePtr pDrawable,
if (x1 < x2 && y1 < y2)
{
if (XGL_INTERNAL_SCANLINE_ORDER_UPSIDE_DOWN)
dstY = pDrawable->height - (y2 + dstYoff);
else
dstY = y1 + dstYoff;
if (upsideDown)
srcY = height - (y2 - y);
else
srcY = y1 - y;
fbBlt (srcBits + srcY * srcStride,
fbBlt (srcBits + (y1 - y) * srcStride,
srcStride,
(x1 - x) * dstBpp,
dstBits + dstY * dstStride,
dstBits + (y1 + dstYoff) * dstStride,
dstStride,
(x1 + dstXoff) * dstBpp,
@ -119,7 +107,7 @@ xglSetPixels (DrawablePtr pDrawable,
FB_ALLONES,
dstBpp,
FALSE,
upsideDown != XGL_INTERNAL_SCANLINE_ORDER_UPSIDE_DOWN);
FALSE);
pDstBox[nDstBox].x1 = x1;
pDstBox[nDstBox].y1 = y1;

View File

@ -423,18 +423,30 @@ xglMapPixmapBits (PixmapPtr pPixmap)
{
if (!pPixmap->devPrivate.ptr)
{
CARD8 *bits;
XGL_PIXMAP_PRIV (pPixmap);
if (!pPixmapPriv->buffer)
if (!xglAllocatePixmapBits (pPixmap))
return FALSE;
pPixmap->devKind = pPixmapPriv->stride;
pPixmap->devPrivate.ptr =
glitz_buffer_map (pPixmapPriv->buffer,
GLITZ_BUFFER_ACCESS_READ_WRITE);
if (!pPixmap->devPrivate.ptr)
bits = glitz_buffer_map (pPixmapPriv->buffer,
GLITZ_BUFFER_ACCESS_READ_WRITE);
if (!bits)
return FALSE;
if (XGL_INTERNAL_SCANLINE_ORDER_UPSIDE_DOWN && pPixmapPriv->format)
{
pPixmap->devKind = -pPixmapPriv->stride;
pPixmap->devPrivate.ptr =
bits + (pPixmap->drawable.height - 1) * pPixmapPriv->stride;
}
else
{
pPixmap->devKind = pPixmapPriv->stride;
pPixmap->devPrivate.ptr = bits;
}
}
return TRUE;