Moved parts of the DC initialisation and bitmap selection out of the

drivers into the common code.
This commit is contained in:
Alexandre Julliard 2002-05-07 02:08:46 +00:00
parent 3fc3d06a66
commit 92b376d61d
9 changed files with 82 additions and 125 deletions

View File

@ -271,7 +271,6 @@ BOOL WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
wRet = PRTDRV_Enable(&physDev->DevCaps, GETGDIINFO, device, driver, output,NULL); wRet = PRTDRV_Enable(&physDev->DevCaps, GETGDIINFO, device, driver, output,NULL);
/* Add this to the DC */ /* Add this to the DC */
dc->hVisRgn = CreateRectRgn(0, 0, physDev->DevCaps.horzRes, physDev->DevCaps.vertRes);
dc->bitsPerPixel = physDev->DevCaps.bitsPixel; dc->bitsPerPixel = physDev->DevCaps.bitsPixel;
TRACE("Got devcaps width %d height %d bits %d planes %d\n", TRACE("Got devcaps width %d height %d bits %d planes %d\n",

View File

@ -145,9 +145,6 @@ HBITMAP TTYDRV_SelectBitmap(TTYDRV_PDEVICE *physDev, HBITMAP hbitmap)
TRACE("(%p, 0x%04x)\n", dc, hbitmap); TRACE("(%p, 0x%04x)\n", dc, hbitmap);
if(!(dc->flags & DC_MEMORY))
return 0;
if (!(bitmap = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0; if (!(bitmap = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
/* Assure that the bitmap device dependent */ /* Assure that the bitmap device dependent */
if(!bitmap->physBitmap && !TTYDRV_DC_CreateBitmap(hbitmap)) if(!bitmap->physBitmap && !TTYDRV_DC_CreateBitmap(hbitmap))
@ -162,25 +159,6 @@ HBITMAP TTYDRV_SelectBitmap(TTYDRV_PDEVICE *physDev, HBITMAP hbitmap)
return 0; return 0;
} }
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = bitmap->bitmap.bmWidth;
dc->totalExtent.bottom = bitmap->bitmap.bmHeight;
/* FIXME: Should be done in the common code instead */
if(dc->hVisRgn) {
SetRectRgn(dc->hVisRgn, 0, 0,
bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
} else {
HRGN hrgn;
if(!(hrgn = CreateRectRgn(0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight)))
{
GDI_ReleaseObj( hbitmap );
return 0;
}
dc->hVisRgn = hrgn;
}
GDI_ReleaseObj( hbitmap ); GDI_ReleaseObj( hbitmap );
return hbitmap; return hbitmap;
} }

View File

@ -21,8 +21,6 @@
#include "config.h" #include "config.h"
#include "gdi.h" #include "gdi.h"
#include "bitmap.h"
#include "palette.h"
#include "ttydrv.h" #include "ttydrv.h"
#include "winbase.h" #include "winbase.h"
#include "wine/debug.h" #include "wine/debug.h"
@ -48,7 +46,6 @@ BOOL TTYDRV_DC_CreateDC(DC *dc, LPCSTR driver, LPCSTR device,
LPCSTR output, const DEVMODEA *initData) LPCSTR output, const DEVMODEA *initData)
{ {
TTYDRV_PDEVICE *physDev; TTYDRV_PDEVICE *physDev;
BITMAPOBJ *bmp;
TRACE("(%p, %s, %s, %s, %p)\n", TRACE("(%p, %s, %s, %s, %p)\n",
dc, debugstr_a(driver), debugstr_a(device), dc, debugstr_a(driver), debugstr_a(device),
@ -72,28 +69,12 @@ BOOL TTYDRV_DC_CreateDC(DC *dc, LPCSTR driver, LPCSTR device,
physDev->cellHeight = 1; physDev->cellHeight = 1;
TTYDRV_DC_CreateBitmap(dc->hBitmap); TTYDRV_DC_CreateBitmap(dc->hBitmap);
bmp = (BITMAPOBJ *) GDI_GetObjPtr(dc->hBitmap, BITMAP_MAGIC);
dc->bitsPerPixel = bmp->bitmap.bmBitsPixel;
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = bmp->bitmap.bmWidth;
dc->totalExtent.bottom = bmp->bitmap.bmHeight;
dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent );
GDI_ReleaseObj( dc->hBitmap );
} else { } else {
physDev->window = root_window; physDev->window = root_window;
physDev->cellWidth = cell_width; physDev->cellWidth = cell_width;
physDev->cellHeight = cell_height; physDev->cellHeight = cell_height;
dc->bitsPerPixel = 1; dc->bitsPerPixel = 1;
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = cell_width * screen_cols;
dc->totalExtent.bottom = cell_height * screen_rows;
dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent );
} }
return TRUE; return TRUE;
@ -128,9 +109,9 @@ INT TTYDRV_GetDeviceCaps( TTYDRV_PDEVICE *physDev, INT cap )
case VERTSIZE: case VERTSIZE:
return 0; /* FIXME: Screen height in mm */ return 0; /* FIXME: Screen height in mm */
case HORZRES: case HORZRES:
return 640; /* FIXME: Screen width in pixel */ return cell_width * screen_cols;
case VERTRES: case VERTRES:
return 480; /* FIXME: Screen height in pixel */ return cell_height * screen_rows;
case BITSPIXEL: case BITSPIXEL:
return 1; /* FIXME */ return 1; /* FIXME */
case PLANES: case PLANES:

View File

@ -133,23 +133,6 @@ BOOL TTYDRV_DestroyWindow( HWND hwnd )
} }
/***********************************************************************
* DCE_OffsetVisRgn
*
* Change region from DC-origin relative coordinates to screen coords.
*/
static void DCE_OffsetVisRgn( HDC hDC, HRGN hVisRgn )
{
DC *dc;
if (!(dc = DC_GetDCPtr( hDC ))) return;
OffsetRgn( hVisRgn, dc->DCOrgX, dc->DCOrgY );
GDI_ReleaseObj( hDC );
}
/*********************************************************************** /***********************************************************************
* DCE_GetVisRect * DCE_GetVisRect
* *
@ -388,25 +371,28 @@ BOOL TTYDRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
DC *dc; DC *dc;
BOOL updateVisRgn; BOOL updateVisRgn;
HRGN hrgnVisible = 0; HRGN hrgnVisible = 0;
POINT org;
if (!wndPtr) return FALSE; if (!wndPtr) return FALSE;
if(flags & DCX_WINDOW)
{
org.x = wndPtr->rectWindow.left;
org.y = wndPtr->rectWindow.top;
}
else
{
org.x = wndPtr->rectClient.left;
org.y = wndPtr->rectClient.top;
}
if (!(dc = DC_GetDCPtr( hdc ))) if (!(dc = DC_GetDCPtr( hdc )))
{ {
WIN_ReleaseWndPtr( wndPtr ); WIN_ReleaseWndPtr( wndPtr );
return FALSE; return FALSE;
} }
dc->DCOrgX = org.x;
if(flags & DCX_WINDOW) dc->DCOrgY = org.y;
{
dc->DCOrgX = wndPtr->rectWindow.left;
dc->DCOrgY = wndPtr->rectWindow.top;
}
else
{
dc->DCOrgX = wndPtr->rectClient.left;
dc->DCOrgY = wndPtr->rectClient.top;
}
updateVisRgn = (dc->flags & DC_DIRTY) != 0; updateVisRgn = (dc->flags & DC_DIRTY) != 0;
GDI_ReleaseObj( hdc ); GDI_ReleaseObj( hdc );
@ -433,7 +419,7 @@ BOOL TTYDRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
else else
OffsetRgn( hrgnVisible, -wndPtr->rectClient.left, OffsetRgn( hrgnVisible, -wndPtr->rectClient.left,
-wndPtr->rectClient.top ); -wndPtr->rectClient.top );
DCE_OffsetVisRgn( hdc, hrgnVisible ); OffsetRgn( hrgnVisible, org.x, org.y );
} }
else else
hrgnVisible = CreateRectRgn( 0, 0, 0, 0 ); hrgnVisible = CreateRectRgn( 0, 0, 0, 0 );
@ -442,7 +428,7 @@ BOOL TTYDRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
else else
{ {
hrgnVisible = DCE_GetVisRgn( hwnd, flags, 0, 0 ); hrgnVisible = DCE_GetVisRgn( hwnd, flags, 0, 0 );
DCE_OffsetVisRgn( hdc, hrgnVisible ); OffsetRgn( hrgnVisible, org.x, org.y );
} }
SelectVisRgn16( hdc, hrgnVisible ); SelectVisRgn16( hdc, hrgnVisible );
} }
@ -457,7 +443,7 @@ BOOL TTYDRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
SaveVisRgn16( hdc ); SaveVisRgn16( hdc );
CombineRgn( hrgnVisible, hrgn, 0, RGN_COPY ); CombineRgn( hrgnVisible, hrgn, 0, RGN_COPY );
DCE_OffsetVisRgn( hdc, hrgnVisible ); OffsetRgn( hrgnVisible, org.x, org.y );
CombineRgn( hrgnVisible, InquireVisRgn16( hdc ), hrgnVisible, CombineRgn( hrgnVisible, InquireVisRgn16( hdc ), hrgnVisible,
(flags & DCX_INTERSECTRGN) ? RGN_AND : RGN_DIFF ); (flags & DCX_INTERSECTRGN) ? RGN_AND : RGN_DIFF );
SelectVisRgn16( hdc, hrgnVisible ); SelectVisRgn16( hdc, hrgnVisible );

View File

@ -285,7 +285,6 @@ BOOL PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
} }
PSDRV_UpdateDevCaps(physDev); PSDRV_UpdateDevCaps(physDev);
dc->hVisRgn = CreateRectRgn(0, 0, physDev->horzRes, physDev->vertRes);
dc->hFont = PSDRV_DefaultFont; dc->hFont = PSDRV_DefaultFont;
return TRUE; return TRUE;
} }

View File

@ -79,20 +79,10 @@ BOOL X11DRV_BITMAP_Init(void)
HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap ) HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
{ {
BITMAPOBJ *bmp; BITMAPOBJ *bmp;
HRGN hrgn;
DC *dc = physDev->dc; DC *dc = physDev->dc;
if (!(dc->flags & DC_MEMORY)) return 0;
if (hbitmap == dc->hBitmap) return hbitmap; /* nothing to do */
if (!(bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0; if (!(bmp = GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0;
if (bmp->header.dwCount && (hbitmap != GetStockObject(DEFAULT_BITMAP)))
{
WARN( "Bitmap already selected in another DC\n" );
GDI_ReleaseObj( hbitmap );
return 0;
}
if(!bmp->physBitmap) if(!bmp->physBitmap)
{ {
if(!X11DRV_CreateBitmap(hbitmap)) if(!X11DRV_CreateBitmap(hbitmap))
@ -108,22 +98,7 @@ HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
return 0; return 0;
} }
if (!(hrgn = CreateRectRgn(0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight)))
{
GDI_ReleaseObj( hbitmap );
return 0;
}
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = bmp->bitmap.bmWidth;
dc->totalExtent.bottom = bmp->bitmap.bmHeight;
physDev->drawable = (Pixmap)bmp->physBitmap; physDev->drawable = (Pixmap)bmp->physBitmap;
dc->hBitmap = hbitmap;
SelectVisRgn16( dc->hSelf, hrgn );
DeleteObject( hrgn );
/* Change GC depth if needed */ /* Change GC depth if needed */
@ -136,8 +111,6 @@ HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
XSetSubwindowMode( gdi_display, physDev->gc, IncludeInferiors ); XSetSubwindowMode( gdi_display, physDev->gc, IncludeInferiors );
XFlush( gdi_display ); XFlush( gdi_display );
wine_tsx11_unlock(); wine_tsx11_unlock();
dc->bitsPerPixel = bmp->bitmap.bmBitsPixel;
DC_InitDC( dc );
} }
GDI_ReleaseObj( hbitmap ); GDI_ReleaseObj( hbitmap );
return hbitmap; return hbitmap;

View File

@ -125,11 +125,6 @@ BOOL X11DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
if (!bmp->physBitmap) X11DRV_CreateBitmap( dc->hBitmap ); if (!bmp->physBitmap) X11DRV_CreateBitmap( dc->hBitmap );
physDev->drawable = (Pixmap)bmp->physBitmap; physDev->drawable = (Pixmap)bmp->physBitmap;
physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL ); physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL );
dc->bitsPerPixel = bmp->bitmap.bmBitsPixel;
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = bmp->bitmap.bmWidth;
dc->totalExtent.bottom = bmp->bitmap.bmHeight;
GDI_ReleaseObj( dc->hBitmap ); GDI_ReleaseObj( dc->hBitmap );
} }
else else
@ -137,22 +132,11 @@ BOOL X11DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
physDev->drawable = root_window; physDev->drawable = root_window;
physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL ); physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL );
dc->bitsPerPixel = screen_depth; dc->bitsPerPixel = screen_depth;
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = screen_width;
dc->totalExtent.bottom = screen_height;
} }
physDev->current_pf = 0; physDev->current_pf = 0;
physDev->used_visuals = 0; physDev->used_visuals = 0;
if (!(dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent )))
{
TSXFreeGC( gdi_display, physDev->gc );
HeapFree( GetProcessHeap(), 0, physDev );
return FALSE;
}
wine_tsx11_lock(); wine_tsx11_lock();
XSetGraphicsExposures( gdi_display, physDev->gc, False ); XSetGraphicsExposures( gdi_display, physDev->gc, False );
XSetSubwindowMode( gdi_display, physDev->gc, IncludeInferiors ); XSetSubwindowMode( gdi_display, physDev->gc, IncludeInferiors );

View File

@ -605,6 +605,12 @@ HDC WINAPI CreateDCA( LPCSTR driver, LPCSTR device, LPCSTR output,
return 0; return 0;
} }
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = GetDeviceCaps( dc->hSelf, HORZRES );
dc->totalExtent.bottom = GetDeviceCaps( dc->hSelf, VERTRES );
dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent );
DC_InitDC( dc ); DC_InitDC( dc );
hdc = dc->hSelf; hdc = dc->hSelf;
GDI_ReleaseObj( hdc ); GDI_ReleaseObj( hdc );
@ -720,6 +726,12 @@ HDC WINAPI CreateCompatibleDC( HDC hdc )
return 0; return 0;
} }
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = 1; /* default bitmap is 1x1 */
dc->totalExtent.bottom = 1;
dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent );
DC_InitDC( dc ); DC_InitDC( dc );
GDI_ReleaseObj( dc->hSelf ); GDI_ReleaseObj( dc->hSelf );
if (origDC) GDI_ReleaseObj( hdc ); if (origDC) GDI_ReleaseObj( hdc );

View File

@ -1173,6 +1173,52 @@ static HGDIOBJ FONT_SelectObject(DC *dc, HGDIOBJ hFont)
return ret; return ret;
} }
/***********************************************************************
* select_bitmap
*/
static HGDIOBJ select_bitmap( DC *dc, HBITMAP handle )
{
BITMAPOBJ *bitmap;
HGDIOBJ ret = handle;
if (!(dc->flags & DC_MEMORY)) return 0;
if (handle == dc->hBitmap) return handle; /* nothing to do */
if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC ))) return 0;
if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP)))
{
WARN( "Bitmap already selected in another DC\n" );
GDI_ReleaseObj( handle );
return 0;
}
if (dc->funcs->pSelectBitmap) ret = dc->funcs->pSelectBitmap( dc->physDev, handle );
if (ret)
{
dc->hBitmap = ret;
dc->totalExtent.left = 0;
dc->totalExtent.top = 0;
dc->totalExtent.right = bitmap->bitmap.bmWidth;
dc->totalExtent.bottom = bitmap->bitmap.bmHeight;
if (dc->hVisRgn)
SetRectRgn( dc->hVisRgn, 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
else
dc->hVisRgn = CreateRectRgn( 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight );
if (dc->bitsPerPixel != bitmap->bitmap.bmBitsPixel)
{
/* depth changed, reinitialize the DC */
dc->bitsPerPixel = bitmap->bitmap.bmBitsPixel;
DC_InitDC( dc );
}
}
GDI_ReleaseObj( handle );
return ret;
}
/*********************************************************************** /***********************************************************************
* SelectObject (GDI.45) * SelectObject (GDI.45)
*/ */
@ -1198,9 +1244,8 @@ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ handle )
{ {
case OBJ_BITMAP: case OBJ_BITMAP:
ret = dc->hBitmap; ret = dc->hBitmap;
if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle ); handle = select_bitmap( dc, handle );
if (handle) dc->hBitmap = handle; if (!handle) ret = 0;
else ret = 0;
break; break;
case OBJ_BRUSH: case OBJ_BRUSH:
ret = dc->hBrush; ret = dc->hBrush;