dib fixes
Rein Klazes
wijn at wanadoo.nl
Tue Apr 12 11:55:40 CDT 2005
On 11 Apr 2005 17:48:58 +0200, you wrote:
> Rein Klazes <wijn at wanadoo.nl> writes:
>
> > I tried to do this, you need to clip to the visible region as well. I
> > could not get it 100% full proof because of races between the clip
> > calculations and the actual positions on the screen.
> >
> > So I get the pixels now from the root window (clipped to the screen) and
> > everything is rock solid. The code is simpler too.
>
> That's ugly, and it will fail miserably if the drawable is a bitmap,
> you really have to use the specified drawable. Look at how the BitBlt
> code does it to determine the proper limits.
Hmm, I was looking at BitBlt for ideas. This was the straight forward
implementation but then discarded:
static void X11DRV_DIB_SetImageBits_GetSubImage(
const X11DRV_DIB_IMAGEBITS_DESCR *descr, XImage *bmpImage)
{
/* compressed bitmaps may contain gaps in them. So make a copy
* of the existing pixels first */
RECT bmprc = { descr->xDest, descr->yDest,
descr->xDest + descr->width , descr->yDest + descr->height};
RECT rc;
GetRgnBox( descr->physDev->region, &rc );
/* convert from dc to drawable origin */
OffsetRect( &rc, descr->physDev->org.x, descr->physDev->org.y);
/* clip visible rect with bitmap */
if( IntersectRect( &rc, &rc, &bmprc))
XGetSubImage( gdi_display, descr->drawable, rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, AllPlanes,
ZPixmap, bmpImage,
descr->xSrc + rc.left - bmprc.left,
descr->ySrc + rc.top - bmprc.top);
}
As soon as I move the window to which I am calling SetDIBitsToDevice
partly outside of the screen, the drawable lies partly outside the
screen rectangle and XGetSubImage fails -> crash.
Clipping to the screen rectangle helps somewhat for very slow moves, but
with faster moves I still get those failures.
What am I doing wrong here?
Rein.
More information about the wine-devel
mailing list