gdi32: Store the reference DC in the enhanced metafile and use it to retrieve device caps.
This commit is contained in:
parent
2776a97931
commit
88bcd13d7f
|
@ -515,43 +515,5 @@ INT EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
|
|||
{
|
||||
EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
|
||||
|
||||
switch(cap) {
|
||||
|
||||
case HORZRES:
|
||||
return physDev->horzres;
|
||||
case VERTRES:
|
||||
return physDev->vertres;
|
||||
case LOGPIXELSX:
|
||||
return physDev->logpixelsx;
|
||||
case LOGPIXELSY:
|
||||
return physDev->logpixelsy;
|
||||
case HORZSIZE:
|
||||
return physDev->horzsize;
|
||||
case VERTSIZE:
|
||||
return physDev->vertsize;
|
||||
case BITSPIXEL:
|
||||
return physDev->bitspixel;
|
||||
case TEXTCAPS:
|
||||
return physDev->textcaps;
|
||||
case RASTERCAPS:
|
||||
return physDev->rastercaps;
|
||||
case TECHNOLOGY:
|
||||
return physDev->technology;
|
||||
case PLANES:
|
||||
return physDev->planes;
|
||||
case NUMCOLORS:
|
||||
return physDev->numcolors;
|
||||
case CURVECAPS:
|
||||
return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
|
||||
CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT);
|
||||
case LINECAPS:
|
||||
return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
|
||||
LC_STYLED | LC_WIDESTYLED | LC_INTERIORS);
|
||||
case POLYGONALCAPS:
|
||||
return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
|
||||
PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
|
||||
default:
|
||||
FIXME("Unimplemented cap %d\n", cap);
|
||||
return 0;
|
||||
}
|
||||
return GetDeviceCaps( physDev->ref_dc, cap );
|
||||
}
|
||||
|
|
|
@ -39,15 +39,8 @@ typedef struct
|
|||
HANDLE hFile; /* Handle for disk based MetaFile */
|
||||
HBRUSH dc_brush;
|
||||
HPEN dc_pen;
|
||||
INT horzres, vertres;
|
||||
INT horzsize, vertsize;
|
||||
INT logpixelsx, logpixelsy;
|
||||
INT bitspixel;
|
||||
INT textcaps;
|
||||
INT rastercaps;
|
||||
INT technology;
|
||||
INT planes;
|
||||
INT numcolors;
|
||||
HDC ref_dc; /* Reference device */
|
||||
HDC screen_dc; /* Screen DC if no reference device specified */
|
||||
INT restoring; /* RestoreDC counter */
|
||||
} EMFDRV_PDEVICE;
|
||||
|
||||
|
|
|
@ -317,8 +317,6 @@ HDC WINAPI CreateEnhMetaFileW(
|
|||
static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
|
||||
HDC ret;
|
||||
DC *dc;
|
||||
HDC hRefDC = hdc ? hdc : CreateDCW(displayW,NULL,NULL,NULL);
|
||||
/* If no ref, use current display */
|
||||
EMFDRV_PDEVICE *physDev;
|
||||
HANDLE hFile;
|
||||
DWORD size = 0, length = 0;
|
||||
|
@ -354,19 +352,12 @@ HDC WINAPI CreateEnhMetaFileW(
|
|||
physDev->hFile = 0;
|
||||
physDev->dc_brush = 0;
|
||||
physDev->dc_pen = 0;
|
||||
physDev->horzres = GetDeviceCaps(hRefDC, HORZRES);
|
||||
physDev->vertres = GetDeviceCaps(hRefDC, VERTRES);
|
||||
physDev->logpixelsx = GetDeviceCaps(hRefDC, LOGPIXELSX);
|
||||
physDev->logpixelsy = GetDeviceCaps(hRefDC, LOGPIXELSY);
|
||||
physDev->horzsize = GetDeviceCaps(hRefDC, HORZSIZE);
|
||||
physDev->vertsize = GetDeviceCaps(hRefDC, VERTSIZE);
|
||||
physDev->bitspixel = GetDeviceCaps(hRefDC, BITSPIXEL);
|
||||
physDev->textcaps = GetDeviceCaps(hRefDC, TEXTCAPS);
|
||||
physDev->rastercaps = GetDeviceCaps(hRefDC, RASTERCAPS);
|
||||
physDev->technology = GetDeviceCaps(hRefDC, TECHNOLOGY);
|
||||
physDev->planes = GetDeviceCaps(hRefDC, PLANES);
|
||||
physDev->numcolors = GetDeviceCaps(hRefDC, NUMCOLORS);
|
||||
physDev->screen_dc = 0;
|
||||
physDev->restoring = 0;
|
||||
if (hdc) /* if no ref, use current display */
|
||||
physDev->ref_dc = hdc;
|
||||
else
|
||||
physDev->ref_dc = physDev->screen_dc = CreateDCW( displayW, NULL, NULL, NULL );
|
||||
|
||||
SetVirtualResolution(physDev->dev.hdc, 0, 0, 0, 0);
|
||||
|
||||
|
@ -400,16 +391,16 @@ HDC WINAPI CreateEnhMetaFileW(
|
|||
physDev->emh->nPalEntries = 0; /* I guess this should start at 0 */
|
||||
|
||||
/* Size in pixels */
|
||||
physDev->emh->szlDevice.cx = physDev->horzres;
|
||||
physDev->emh->szlDevice.cy = physDev->vertres;
|
||||
physDev->emh->szlDevice.cx = GetDeviceCaps( physDev->ref_dc, HORZRES );
|
||||
physDev->emh->szlDevice.cy = GetDeviceCaps( physDev->ref_dc, VERTRES );
|
||||
|
||||
/* Size in millimeters */
|
||||
physDev->emh->szlMillimeters.cx = physDev->horzsize;
|
||||
physDev->emh->szlMillimeters.cy = physDev->vertsize;
|
||||
physDev->emh->szlMillimeters.cx = GetDeviceCaps( physDev->ref_dc, HORZSIZE );
|
||||
physDev->emh->szlMillimeters.cy = GetDeviceCaps( physDev->ref_dc, VERTSIZE );
|
||||
|
||||
/* Size in micrometers */
|
||||
physDev->emh->szlMicrometers.cx = physDev->horzsize * 1000;
|
||||
physDev->emh->szlMicrometers.cy = physDev->vertsize * 1000;
|
||||
physDev->emh->szlMicrometers.cx = physDev->emh->szlMillimeters.cx * 1000;
|
||||
physDev->emh->szlMicrometers.cy = physDev->emh->szlMillimeters.cy * 1000;
|
||||
|
||||
memcpy((char *)physDev->emh + sizeof(ENHMETAHEADER), description, length);
|
||||
|
||||
|
@ -431,9 +422,6 @@ HDC WINAPI CreateEnhMetaFileW(
|
|||
ret = physDev->dev.hdc;
|
||||
release_dc_ptr( dc );
|
||||
|
||||
if( !hdc )
|
||||
DeleteDC( hRefDC );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -469,6 +457,7 @@ HENHMETAFILE WINAPI CloseEnhMetaFile(HDC hdc) /* [in] metafile DC */
|
|||
|
||||
if (physDev->dc_brush) DeleteObject( physDev->dc_brush );
|
||||
if (physDev->dc_pen) DeleteObject( physDev->dc_pen );
|
||||
if (physDev->screen_dc) DeleteDC( physDev->screen_dc );
|
||||
|
||||
emr.emr.iType = EMR_EOF;
|
||||
emr.emr.nSize = sizeof(emr);
|
||||
|
|
|
@ -383,7 +383,10 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr )
|
|||
ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == 0xdeadbeef), /* nt4 */
|
||||
"wrong error %u on %s\n", GetLastError(), descr );
|
||||
type = GetClipBox( hdc, &rect );
|
||||
ok( type == SIMPLEREGION, "GetClipBox returned %d on memdc for %s\n", type, descr );
|
||||
if (GetObjectType( hdc ) == OBJ_ENHMETADC)
|
||||
todo_wine ok( type == SIMPLEREGION, "GetClipBox returned %d on memdc for %s\n", type, descr );
|
||||
else
|
||||
ok( type == SIMPLEREGION, "GetClipBox returned %d on memdc for %s\n", type, descr );
|
||||
|
||||
SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
|
||||
SetMapMode( hdc, MM_TEXT );
|
||||
|
@ -494,8 +497,7 @@ static void test_CreateCompatibleDC(void)
|
|||
ok( SelectObject( hNewDC, bitmap ) != 0, "SelectObject failed\n" );
|
||||
caps = GetDeviceCaps( hdcMetafile, TECHNOLOGY );
|
||||
ok( caps == DT_RASDISPLAY, "wrong caps %u\n", caps );
|
||||
caps = GetDeviceCaps( hNewDC, TECHNOLOGY );
|
||||
ok( caps == DT_RASDISPLAY, "wrong caps %u\n", caps );
|
||||
test_device_caps( hdcMetafile, hdc, "enhmetafile dc" );
|
||||
DeleteDC( hNewDC );
|
||||
DeleteEnhMetaFile( CloseEnhMetaFile( hdcMetafile ));
|
||||
ReleaseDC( 0, hdc );
|
||||
|
@ -1144,7 +1146,7 @@ done:
|
|||
|
||||
static void test_printer_dc(void)
|
||||
{
|
||||
HDC memdc, display_memdc;
|
||||
HDC memdc, display_memdc, enhmf_dc;
|
||||
HBITMAP orig, bmp;
|
||||
DWORD ret;
|
||||
HDC hdc = create_printer_dc();
|
||||
|
@ -1188,6 +1190,11 @@ static void test_printer_dc(void)
|
|||
ret = GetPixel( hdc, 0, 0 );
|
||||
ok( ret == CLR_INVALID, "wrong pixel value %x\n", ret );
|
||||
|
||||
enhmf_dc = CreateEnhMetaFileA( hdc, NULL, NULL, NULL );
|
||||
ok(enhmf_dc != 0, "CreateEnhMetaFileA failed\n");
|
||||
test_device_caps( enhmf_dc, hdc, "enhmetafile printer dc" );
|
||||
DeleteEnhMetaFile( CloseEnhMetaFile( enhmf_dc ));
|
||||
|
||||
DeleteDC( memdc );
|
||||
DeleteDC( display_memdc );
|
||||
DeleteDC( hdc );
|
||||
|
|
Loading…
Reference in New Issue