gdi/dib.c GetDIBits

Walt Ogburn reuben at ugcs.caltech.edu
Thu Nov 4 13:05:02 CST 2004


Thanks Huw.  Actually, when GetDIBits gets invoked by the SelectBrush
code, it winds up in an unimplemented part anyway, so the current brush
code needs a different fix than just preventing the locking problem.

I'll try to see if the GetDIBits call can be replaced with something else
that works right, and otherwise just put in a FIXME so that the result
will be a slightly wrong brush instead of a crash.

Here's the part of the GetDIBits code that it winds up in, in case you're
interested.  It's the commented FIXME.

Thanks,
Walter


====

/* Otherwise, get bits from the XImage */
else
{
    if (!bmp->funcs && !BITMAP_SetOwnerDC( hbitmap, dc )) lines = 0;
    else
    {
        if (bmp->funcs && bmp->funcs->pGetDIBits)
            lines = bmp->funcs->pGetDIBits( dc->physDev, hbitmap, startscan,
                                            lines, bits, info, coloruse );
        else
            lines = 0;  /* FIXME: should copy from bmp->bitmap.bmBits */
    }
}

====

On Thu, 4 Nov 2004, Huw D M Davies wrote:

> On Wed, Nov 03, 2004 at 09:24:08PM -0800, Walt Ogburn wrote:
> >
> > Changelog:
> > Take color info from existing hdc instead of creating a new memory HDC.
> >
> >
> > Index: dlls/gdi/dib.c
> > ===================================================================
> > RCS file: /home/wine/wine/dlls/gdi/dib.c,v
> > retrieving revision 1.7
> > diff -u -r1.7 dib.c
> > --- dlls/gdi/dib.c      2 Nov 2004 05:23:49 -0000       1.7
> > +++ dlls/gdi/dib.c      4 Nov 2004 05:08:24 -0000
> > @@ -563,7 +559,7 @@
> >            same color depth then get the color map from it */
> >         if (bmp->dib && bmp->dib->dsBm.bmBitsPixel == bpp) {
> >              if(coloruse == DIB_RGB_COLORS) {
> > -                HBITMAP oldbm = SelectObject(memdc, hbitmap);
> > +                HBITMAP oldbm = SelectObject(hdc, hbitmap);
> >                  unsigned int colors = 1 << bpp;
> >
> >                  if (core_header)
>
> This won't always work since hdc does not necessarily have to be a
> memory dc.
>
> I think what you want to do is to store the dib colour table in the
> gdi bmp->dib structure rather than in the driver's (x11drv) one.  Then
> retrieving the colour table can be done by simply accessing the data
> directly, rather than through a call to GetDIBColorTable.
>
> Huw.
> --
> Huw Davies
> huw at codeweavers.com
>



More information about the wine-devel mailing list