From b89525fb06434b07682791453bae8a9b16426b8d Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 18 Jan 2004 22:20:17 +0000 Subject: [PATCH] Removed the bitsPerPixel field in the generic DC structure, and leave it up to the graphics driver to define it if necessary. --- dlls/ttydrv/dc.c | 2 -- dlls/wineps/init.c | 2 -- dlls/x11drv/bitblt.c | 46 ++++++++++++++++++------------------------ dlls/x11drv/bitmap.c | 4 ++-- dlls/x11drv/brush.c | 13 +++++------- dlls/x11drv/dib.c | 7 +++---- dlls/x11drv/graphics.c | 3 +-- dlls/x11drv/init.c | 3 ++- dlls/x11drv/palette.c | 4 ++-- dlls/x11drv/x11drv.h | 1 + dlls/x11drv/xrender.c | 16 +++++++-------- graphics/bitblt.c | 10 ++++----- include/gdi.h | 1 - objects/bitmap.c | 33 +++++++++++++++++------------- objects/dc.c | 7 +------ 15 files changed, 68 insertions(+), 84 deletions(-) diff --git a/dlls/ttydrv/dc.c b/dlls/ttydrv/dc.c index 7b651e51f48..36e325189bb 100644 --- a/dlls/ttydrv/dc.c +++ b/dlls/ttydrv/dc.c @@ -65,8 +65,6 @@ BOOL TTYDRV_DC_CreateDC(DC *dc, TTYDRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR d physDev->window = root_window; physDev->cellWidth = cell_width; physDev->cellHeight = cell_height; - - dc->bitsPerPixel = 1; } return TRUE; diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c index aed8dd8aa97..9eea5e60107 100644 --- a/dlls/wineps/init.c +++ b/dlls/wineps/init.c @@ -358,8 +358,6 @@ BOOL PSDRV_CreateDC( DC *dc, PSDRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR devic PSDRV_UpdateDevCaps(physDev); dc->hFont = PSDRV_DefaultFont; - if (GetObjectType(dc->hSelf) != OBJ_MEMDC) - dc->bitsPerPixel = physDev->pi->ppd->ColorDevice ? 8 : 1; return TRUE; } diff --git a/dlls/x11drv/bitblt.c b/dlls/x11drv/bitblt.c index 5daf99d4284..add5e6516b7 100644 --- a/dlls/x11drv/bitblt.c +++ b/dlls/x11drv/bitblt.c @@ -867,8 +867,6 @@ static int BITBLT_GetSrcAreaStretch( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE RECT *visRectSrc, RECT *visRectDst ) { XImage *imageSrc, *imageDst; - DC *dcDst = physDevDst->dc; - RECT rectSrc = *visRectSrc; RECT rectDst = *visRectDst; @@ -893,13 +891,13 @@ static int BITBLT_GetSrcAreaStretch( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE visRectSrc->bottom - visRectSrc->top, AllPlanes, ZPixmap ); imageDst = X11DRV_DIB_CreateXImage( rectDst.right - rectDst.left, - rectDst.bottom - rectDst.top, dcDst->bitsPerPixel ); + rectDst.bottom - rectDst.top, physDevDst->depth ); BITBLT_StretchImage( imageSrc, imageDst, widthSrc, heightSrc, widthDst, heightDst, &rectSrc, &rectDst, - physDevDst->textPixel, dcDst->bitsPerPixel != 1 ? + physDevDst->textPixel, physDevDst->depth != 1 ? physDevDst->backgroundPixel : physDevSrc->backgroundPixel, - dcDst->stretchBltMode ); + GetStretchBltMode(physDevDst->hdc) ); XPutImage( gdi_display, pixmap, gc, imageDst, 0, 0, 0, 0, rectDst.right - rectDst.left, rectDst.bottom - rectDst.top ); XDestroyImage( imageSrc ); @@ -922,15 +920,13 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe int exposures = 0; INT width = visRectSrc->right - visRectSrc->left; INT height = visRectSrc->bottom - visRectSrc->top; - DC *dcSrc = physDevSrc->dc; - DC *dcDst = physDevDst->dc; - if (dcSrc->bitsPerPixel == dcDst->bitsPerPixel) + if (physDevSrc->depth == physDevDst->depth) { if (!X11DRV_PALETTE_XPixelToPalette || - (dcDst->bitsPerPixel == 1)) /* monochrome -> monochrome */ + (physDevDst->depth == 1)) /* monochrome -> monochrome */ { - if (dcDst->bitsPerPixel == 1) + if (physDevDst->depth == 1) { /* MSDN says if StretchBlt must convert a bitmap from monochrome to color or vice versa, the forground and background color of @@ -979,7 +975,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe } else { - if (dcSrc->bitsPerPixel == 1) /* monochrome -> color */ + if (physDevSrc->depth == 1) /* monochrome -> color */ { if (X11DRV_PALETTE_XPixelToPalette) { @@ -1010,7 +1006,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe { return exposures; } - imageDst = X11DRV_DIB_CreateXImage( width, height, dcDst->bitsPerPixel ); + imageDst = X11DRV_DIB_CreateXImage( width, height, physDevDst->depth ); if (!imageDst) { XDestroyImage(imageSrc); @@ -1042,7 +1038,7 @@ static int BITBLT_GetDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, GC gc, RECT INT width = visRectDst->right - visRectDst->left; INT height = visRectDst->bottom - visRectDst->top; - if (!X11DRV_PALETTE_XPixelToPalette || (physDev->dc->bitsPerPixel == 1) || + if (!X11DRV_PALETTE_XPixelToPalette || (physDev->depth == 1) || (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) ) { XCopyArea( gdi_display, physDev->drawable, pixmap, gc, @@ -1096,7 +1092,7 @@ static int BITBLT_PutDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, RECT *visRe /* !X11DRV_PALETTE_PaletteToXPixel is _NOT_ enough */ - if (!X11DRV_PALETTE_PaletteToXPixel || (physDev->dc->bitsPerPixel == 1) || + if (!X11DRV_PALETTE_PaletteToXPixel || (physDev->depth == 1) || (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) ) { XCopyArea( gdi_display, pixmap, physDev->drawable, physDev->gc, 0, 0, width, height, @@ -1321,7 +1317,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT { case BLACKNESS: /* 0x00 */ wine_tsx11_lock(); - if ((dcDst->bitsPerPixel == 1) || !X11DRV_PALETTE_PaletteToXPixel) + if ((physDevDst->depth == 1) || !X11DRV_PALETTE_PaletteToXPixel) XSetFunction( gdi_display, physDevDst->gc, GXclear ); else { @@ -1337,7 +1333,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT return TRUE; case DSTINVERT: /* 0x55 */ - if ((dcDst->bitsPerPixel == 1) || !X11DRV_PALETTE_PaletteToXPixel || + if ((physDevDst->depth == 1) || !X11DRV_PALETTE_PaletteToXPixel || !perfect_graphics()) { wine_tsx11_lock(); @@ -1394,7 +1390,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT return TRUE; case SRCCOPY: /* 0xcc */ - if (dcSrc->bitsPerPixel == dcDst->bitsPerPixel) + if (physDevSrc->depth == physDevDst->depth) { wine_tsx11_lock(); XSetFunction( gdi_display, physDevDst->gc, GXcopy ); @@ -1409,7 +1405,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT wine_tsx11_unlock(); return TRUE; } - if (dcSrc->bitsPerPixel == 1) + if (physDevSrc->depth == 1) { wine_tsx11_lock(); XSetBackground( gdi_display, physDevDst->gc, physDevDst->textPixel ); @@ -1441,7 +1437,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT case WHITENESS: /* 0xff */ wine_tsx11_lock(); - if ((dcDst->bitsPerPixel == 1) || !X11DRV_PALETTE_PaletteToXPixel) + if ((physDevDst->depth == 1) || !X11DRV_PALETTE_PaletteToXPixel) XSetFunction( gdi_display, physDevDst->gc, GXset ); else { @@ -1464,11 +1460,11 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT XSetSubwindowMode( gdi_display, tmpGC, IncludeInferiors ); XSetGraphicsExposures( gdi_display, tmpGC, False ); pixmaps[DST] = XCreatePixmap( gdi_display, root_window, width, height, - dcDst->bitsPerPixel ); + physDevDst->depth ); if (useSrc) { pixmaps[SRC] = XCreatePixmap( gdi_display, root_window, width, height, - dcDst->bitsPerPixel ); + physDevDst->depth ); if (fStretch) BITBLT_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, xSrc, ySrc, widthSrc, heightSrc, @@ -1494,8 +1490,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT case OP_ARGS(SRC,TMP): if (!pixmaps[TMP]) pixmaps[TMP] = XCreatePixmap( gdi_display, root_window, - width, height, - dcDst->bitsPerPixel ); + width, height, physDevDst->depth ); /* fall through */ case OP_ARGS(DST,SRC): case OP_ARGS(SRC,DST): @@ -1510,8 +1505,7 @@ static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT case OP_ARGS(PAT,TMP): if (!pixmaps[TMP] && !fNullBrush) pixmaps[TMP] = XCreatePixmap( gdi_display, root_window, - width, height, - dcDst->bitsPerPixel ); + width, height, physDevDst->depth ); /* fall through */ case OP_ARGS(PAT,DST): case OP_ARGS(PAT,SRC): @@ -1570,7 +1564,7 @@ BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst, sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None, FALSE ); if ((sSrc == DIB_Status_AppMod) && (rop == SRCCOPY) && - (dcSrc->bitsPerPixel == dcDst->bitsPerPixel)) + (physDevSrc->depth == physDevDst->depth)) { POINT pts[2]; /* do everything ourselves; map coordinates */ diff --git a/dlls/x11drv/bitmap.c b/dlls/x11drv/bitmap.c index b43cf38be13..a952caab5c5 100644 --- a/dlls/x11drv/bitmap.c +++ b/dlls/x11drv/bitmap.c @@ -74,7 +74,6 @@ BOOL X11DRV_BITMAP_Init(void) HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap ) { BITMAPOBJ *bmp; - DC *dc = physDev->dc; if (!(bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0; @@ -88,8 +87,9 @@ HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap ) /* Change GC depth if needed */ - if (dc->bitsPerPixel != bmp->bitmap.bmBitsPixel) + if (physDev->depth != bmp->bitmap.bmBitsPixel) { + physDev->depth = bmp->bitmap.bmBitsPixel; wine_tsx11_lock(); XFreeGC( gdi_display, physDev->gc ); physDev->gc = XCreateGC( gdi_display, physDev->drawable, 0, NULL ); diff --git a/dlls/x11drv/brush.c b/dlls/x11drv/brush.c index 1632edc33a5..65b114b892c 100644 --- a/dlls/x11drv/brush.c +++ b/dlls/x11drv/brush.c @@ -107,7 +107,7 @@ static XImage *ditherImage = NULL; /*********************************************************************** * BRUSH_DitherColor */ -static Pixmap BRUSH_DitherColor( DC *dc, COLORREF color ) +static Pixmap BRUSH_DitherColor( COLORREF color ) { static COLORREF prevColor = 0xffffffff; unsigned int x, y; @@ -154,12 +154,10 @@ static Pixmap BRUSH_DitherColor( DC *dc, COLORREF color ) */ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color ) { - DC *dc = physDev->dc; - - if ((dc->bitsPerPixel > 1) && (screen_depth <= 8) && !X11DRV_IsSolidColor( color )) + if ((physDev->depth > 1) && (screen_depth <= 8) && !X11DRV_IsSolidColor( color )) { /* Dithered brush */ - physDev->brush.pixmap = BRUSH_DitherColor( dc, color ); + physDev->brush.pixmap = BRUSH_DitherColor( color ); physDev->brush.fillStyle = FillTiled; physDev->brush.pixel = 0; } @@ -178,14 +176,13 @@ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color ) static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap ) { BOOL ret = FALSE; - DC *dc = physDev->dc; BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ); if (!bmp) return FALSE; if(!bmp->physBitmap) goto done; wine_tsx11_lock(); - if ((dc->bitsPerPixel == 1) && (bmp->bitmap.bmBitsPixel != 1)) + if ((physDev->depth == 1) && (bmp->bitmap.bmBitsPixel != 1)) { /* Special case: a color pattern on a monochrome DC */ physDev->brush.pixmap = XCreatePixmap( gdi_display, root_window, 8, 8, 1); @@ -241,7 +238,7 @@ HBRUSH X11DRV_SelectBrush( X11DRV_PDEVICE *physDev, HBRUSH hbrush ) } physDev->brush.style = logbrush.lbStyle; if (hbrush == GetStockObject( DC_BRUSH )) - logbrush.lbColor = physDev->dc->dcBrushColor; + logbrush.lbColor = GetDCBrushColor( physDev->hdc ); switch(logbrush.lbStyle) { diff --git a/dlls/x11drv/dib.c b/dlls/x11drv/dib.c index 25c020a329a..425da5e2f23 100644 --- a/dlls/x11drv/dib.c +++ b/dlls/x11drv/dib.c @@ -3585,7 +3585,6 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO int height; BOOL top_down; POINT pt; - DC *dc = physDev->dc; if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &descr.infoBpp, &descr.compression ) == -1) @@ -3634,7 +3633,7 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO X11DRV_SetupGCForText( physDev ); /* To have the correct colors */ wine_tsx11_lock(); - XSetFunction(gdi_display, physDev->gc, X11DRV_XROPfunction[dc->ROPmode-1]); + XSetFunction(gdi_display, physDev->gc, X11DRV_XROPfunction[GetROP2(physDev->hdc) - 1]); wine_tsx11_unlock(); switch (descr.infoBpp) @@ -3644,7 +3643,7 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO case 8: descr.colorMap = (RGBQUAD *)X11DRV_DIB_BuildColorMap( coloruse == DIB_PAL_COLORS ? physDev : NULL, coloruse, - dc->bitsPerPixel, info, &descr.nColorMap ); + physDev->depth, info, &descr.nColorMap ); if (!descr.colorMap) return 0; descr.rMask = descr.gMask = descr.bMask = 0; break; @@ -3671,7 +3670,7 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO descr.palentry = NULL; descr.lines = top_down ? -lines : lines; descr.infoWidth = width; - descr.depth = dc->bitsPerPixel; + descr.depth = physDev->depth; descr.drawable = physDev->drawable; descr.gc = physDev->gc; descr.xSrc = xSrc; diff --git a/dlls/x11drv/graphics.c b/dlls/x11drv/graphics.c index 4fbba3dd8b8..fa09a229f0e 100644 --- a/dlls/x11drv/graphics.c +++ b/dlls/x11drv/graphics.c @@ -946,7 +946,6 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y ) int pixel; POINT pt; BOOL memdc = (GetObjectType(physDev->hdc) == OBJ_MEMDC); - DC *dc = physDev->dc; pt.x = x; pt.y = y; @@ -967,7 +966,7 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y ) /* If we are reading from the screen, use a temporary copy */ /* to avoid a BadMatch error */ if (!pixmap) pixmap = XCreatePixmap( gdi_display, root_window, - 1, 1, dc->bitsPerPixel ); + 1, 1, physDev->depth ); XCopyArea( gdi_display, physDev->drawable, pixmap, BITMAP_colorGC, physDev->org.x + pt.x, physDev->org.y + pt.y, 1, 1, 0, 0 ); image = XGetImage( gdi_display, pixmap, 0, 0, 1, 1, AllPlanes, ZPixmap ); diff --git a/dlls/x11drv/init.c b/dlls/x11drv/init.c index bd10202f404..11e93d0eab2 100644 --- a/dlls/x11drv/init.c +++ b/dlls/x11drv/init.c @@ -105,11 +105,12 @@ BOOL X11DRV_CreateDC( DC *dc, X11DRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR dev if (GetObjectType( dc->hSelf ) == OBJ_MEMDC) { physDev->drawable = BITMAP_stock_pixmap; + physDev->depth = 1; } else { physDev->drawable = root_window; - dc->bitsPerPixel = screen_depth; + physDev->depth = screen_depth; } physDev->org.x = physDev->org.y = 0; physDev->drawable_org.x = physDev->drawable_org.y = 0; diff --git a/dlls/x11drv/palette.c b/dlls/x11drv/palette.c index ec313b35038..f6001f2087d 100644 --- a/dlls/x11drv/palette.c +++ b/dlls/x11drv/palette.c @@ -891,7 +891,7 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color ) /* fall through to RGB */ case 0: /* RGB */ - if( dc && (dc->bitsPerPixel == 1) ) + if (physDev && (physDev->depth == 1) ) { GDI_ReleaseObj( hPal ); return (((color >> 16) & 0xff) + @@ -944,7 +944,7 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color ) /* fall through to RGB */ case 0: /* RGB */ - if( dc && (dc->bitsPerPixel == 1) ) + if (physDev && (physDev->depth == 1) ) { GDI_ReleaseObj( hPal ); return (((color >> 16) & 0xff) + diff --git a/dlls/x11drv/x11drv.h b/dlls/x11drv/x11drv.h index 4b06d07945e..bf4ae5312b1 100644 --- a/dlls/x11drv/x11drv.h +++ b/dlls/x11drv/x11drv.h @@ -97,6 +97,7 @@ typedef struct X_PHYSBRUSH brush; int backgroundPixel; int textPixel; + int depth; /* bit depth of the DC */ int exposures; /* count of graphics exposures operations */ XVisualInfo *visuals[MAX_PIXELFORMATS]; int used_visuals; diff --git a/dlls/x11drv/xrender.c b/dlls/x11drv/xrender.c index 7f106f10db4..8eedca9c2f8 100644 --- a/dlls/x11drv/xrender.c +++ b/dlls/x11drv/xrender.c @@ -1009,7 +1009,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE ); - if(dc->bitsPerPixel == 1) { + if(physDev->depth == 1) { if((dc->textColor & 0xffffff) == 0) { textPixel = 0; backgroundPixel = 1; @@ -1136,7 +1136,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag wine_tsx11_lock(); physDev->xrender->pict = pXRenderCreatePicture(gdi_display, physDev->drawable, - (dc->bitsPerPixel == 1) ? + (physDev->depth == 1) ? mono_format : screen_format, CPSubwindowMode, &pa); wine_tsx11_unlock(); @@ -1176,7 +1176,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag if(!physDev->xrender->tile_xpm) { XRenderPictureAttributes pa; - XRenderPictFormat *format = (dc->bitsPerPixel == 1) ? mono_format : screen_format; + XRenderPictFormat *format = (physDev->depth == 1) ? mono_format : screen_format; wine_tsx11_lock(); physDev->xrender->tile_xpm = XCreatePixmap(gdi_display, physDev->drawable, @@ -1195,7 +1195,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag } if(dc->textColor != physDev->xrender->lastTextColor) { - if(dc->bitsPerPixel != 1) { + if(physDev->depth != 1) { /* Map 0 -- 0xff onto 0 -- 0xffff */ col.red = GetRValue(dc->textColor); col.red |= col.red << 8; @@ -1218,7 +1218,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag /* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation. */ - if((dc->bitsPerPixel == 1) && (textPixel == 0)) + if((physDev->depth == 1) && (textPixel == 0)) render_op = PictOpOutReverse; /* This gives us 'black' text */ } @@ -1320,7 +1320,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag yoff += entry->gis[glyphs[idx]].yOff; } } - } else if(dc->bitsPerPixel == 1) { + } else if(physDev->depth == 1) { for(idx = 0; idx < count; idx++) { SharpGlyphGray(physDev, physDev->org.x + x + xoff, physDev->org.y + y + yoff, @@ -1406,10 +1406,10 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag TRACE("XGetImage(%p, %x, %d, %d, %d, %d, %lx, %x) depth = %d rets %p\n", gdi_display, (int)physDev->drawable, image_x, image_y, image_w, image_h, AllPlanes, ZPixmap, - dc->bitsPerPixel, image); + physDev->depth, image); if(!image) { Pixmap xpm = XCreatePixmap(gdi_display, physDev->drawable, image_w, image_h, - dc->bitsPerPixel); + physDev->depth); GC gc; XGCValues gcv; diff --git a/graphics/bitblt.c b/graphics/bitblt.c index 82b94f5be6c..a9f9629ee2a 100644 --- a/graphics/bitblt.c +++ b/graphics/bitblt.c @@ -60,9 +60,8 @@ BOOL WINAPI BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width, if ((dcDst = DC_GetDCUpdate( hdcDst ))) { dcSrc = DC_GetDCPtr( hdcSrc ); - TRACE("hdcSrc=%p %d,%d %d bpp->hdcDest=%p %d,%d %dx%dx%d rop=%06lx\n", - hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->bitsPerPixel : 0, - hdcDst, xDst, yDst, width, height, dcDst->bitsPerPixel, rop); + TRACE("hdcSrc=%p %d,%d -> hdcDest=%p %d,%d %dx%d rop=%06lx\n", + hdcSrc, xSrc, ySrc, hdcDst, xDst, yDst, width, height, rop); if (dcDst->funcs->pBitBlt) ret = dcDst->funcs->pBitBlt( dcDst->physDev, xDst, yDst, width, height, dcSrc ? dcSrc->physDev : NULL, xSrc, ySrc, rop ); @@ -91,10 +90,9 @@ BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, { dcSrc = DC_GetDCPtr( hdcSrc ); - TRACE("%p %d,%d %dx%dx%d -> %p %d,%d %dx%dx%d rop=%06lx\n", + TRACE("%p %d,%d %dx%d -> %p %d,%d %dx%d rop=%06lx\n", hdcSrc, xSrc, ySrc, widthSrc, heightSrc, - dcSrc ? dcSrc->bitsPerPixel : 0, hdcDst, xDst, yDst, - widthDst, heightDst, dcDst->bitsPerPixel, rop ); + hdcDst, xDst, yDst, widthDst, heightDst, rop ); if (dcSrc) { if (dcDst->funcs->pStretchBlt) diff --git a/include/gdi.h b/include/gdi.h index 66b8f238520..273bbb7205f 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -146,7 +146,6 @@ typedef struct tagDC short breakRem; /* breakTotalExtra % breakCount */ RECT totalExtent; - BYTE bitsPerPixel; INT MapMode; INT GraphicsMode; /* Graphics mode */ diff --git a/objects/bitmap.c b/objects/bitmap.c index 7ced4f7fceb..64d59e6b497 100644 --- a/objects/bitmap.c +++ b/objects/bitmap.c @@ -173,12 +173,24 @@ HBITMAP WINAPI CreateCompatibleBitmap( HDC hdc, INT width, INT height) if ((width >= 0x10000) || (height >= 0x10000)) { FIXME("got bad width %d or height %d, please look for reason\n", width, height ); - } else { - /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ - if (!width || !height) - hbmpRet = CreateBitmap( 1, 1, 1, 1, NULL ); - else - hbmpRet = CreateBitmap( width, height, 1, dc->bitsPerPixel, NULL ); + } + else + { + INT planes, bpp; + + if (GDIMAGIC( dc->header.wMagic ) != MEMORY_DC_MAGIC) + { + planes = GetDeviceCaps( hdc, PLANES ); + bpp = GetDeviceCaps( hdc, BITSPIXEL ); + } + else /* memory DC, get the depth of the bitmap */ + { + BITMAPOBJ *bmp = GDI_GetObjPtr( dc->hBitmap, BITMAP_MAGIC ); + planes = bmp->bitmap.bmPlanes; + bpp = bmp->bitmap.bmBitsPixel; + GDI_ReleaseObj( dc->hBitmap ); + } + hbmpRet = CreateBitmap( width, height, planes, bpp, NULL ); } TRACE("\t\t%p\n", hbmpRet); GDI_ReleaseObj(hdc); @@ -433,14 +445,7 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) dc->totalExtent.bottom = bitmap->bitmap.bmHeight; dc->flags &= ~DC_DIRTY; SetRectRgn( dc->hVisRgn, 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight); - CLIPPING_UpdateGCRegion( dc ); - - if (dc->bitsPerPixel != bitmap->bitmap.bmBitsPixel) - { - /* depth changed, reinitialize the DC */ - dc->bitsPerPixel = bitmap->bitmap.bmBitsPixel; - DC_InitDC( dc ); - } + DC_InitDC( dc ); } else ret = 0; diff --git a/objects/dc.c b/objects/dc.c index ebd8e8d6af5..1424b20b9f6 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -107,7 +107,6 @@ DC *DC_AllocDC( const DC_FUNCTIONS *funcs, WORD magic ) dc->totalExtent.top = 0; dc->totalExtent.right = 0; dc->totalExtent.bottom = 0; - dc->bitsPerPixel = 1; dc->MapMode = MM_TEXT; dc->GraphicsMode = GM_COMPATIBLE; dc->pAbortProc = NULL; @@ -297,7 +296,6 @@ HDC WINAPI GetDCState( HDC hdc ) newdc->hDevice = dc->hDevice; newdc->hPalette = dc->hPalette; newdc->totalExtent = dc->totalExtent; - newdc->bitsPerPixel = dc->bitsPerPixel; newdc->ROPmode = dc->ROPmode; newdc->polyFillMode = dc->polyFillMode; newdc->stretchBltMode = dc->stretchBltMode; @@ -424,8 +422,6 @@ void WINAPI SetDCState( HDC hdc, HDC hdcs ) dc->vportExtX = dcs->vportExtX; dc->vportExtY = dcs->vportExtY; - if (GDIMAGIC(dc->header.wMagic) != MEMORY_DC_MAGIC) dc->bitsPerPixel = dcs->bitsPerPixel; - if (dcs->hClipRgn) { if (!dc->hClipRgn) dc->hClipRgn = CreateRectRgn( 0, 0, 0, 0 ); @@ -723,8 +719,7 @@ HDC WINAPI CreateCompatibleDC( HDC hdc ) TRACE("(%p): returning %p\n", hdc, dc->hSelf ); - dc->bitsPerPixel = 1; - dc->hBitmap = GetStockObject( DEFAULT_BITMAP ); + dc->hBitmap = GetStockObject( DEFAULT_BITMAP ); /* Copy the driver-specific physical device info into * the new DC. The driver may use this read-only info