gdi32: Use get_dc_attr in SetBkMode.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-07-26 23:30:20 +02:00 committed by Alexandre Julliard
parent 4a32a87537
commit 99b591582d
11 changed files with 56 additions and 37 deletions

View File

@ -1555,34 +1555,6 @@ INT WINAPI GetRelAbs( HDC hdc, DWORD dwIgnore )
}
/***********************************************************************
* SetBkMode (GDI32.@)
*/
INT WINAPI SetBkMode( HDC hdc, INT mode )
{
INT ret = 0;
DC *dc;
if ((mode <= 0) || (mode > BKMODE_LAST))
{
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
if ((dc = get_dc_ptr( hdc )))
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetBkMode );
mode = physdev->funcs->pSetBkMode( physdev, mode );
if (mode)
{
ret = dc->attr->background_mode;
dc->attr->background_mode = mode;
}
release_dc_ptr( dc );
}
return ret;
}
/***********************************************************************
* GetROP2 (GDI32.@)
*/

View File

@ -80,13 +80,13 @@ BOOL CDECL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakC
return EMFDRV_WriteRecord(dev, &emr.emr);
}
INT CDECL EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
BOOL EMFDC_SetBkMode( DC_ATTR *dc_attr, INT mode )
{
EMRSETBKMODE emr;
emr.emr.iType = EMR_SETBKMODE;
emr.emr.nSize = sizeof(emr);
emr.iMode = mode;
return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
}
COLORREF CDECL EMFDRV_SetBkColor( PHYSDEV dev, COLORREF color )

View File

@ -115,7 +115,6 @@ extern HPEN CDECL EMFDRV_SelectPen( PHYSDEV dev, HPEN handle, const struct b
extern HPALETTE CDECL EMFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPal, BOOL force ) DECLSPEC_HIDDEN;
extern INT CDECL EMFDRV_SetArcDirection( PHYSDEV dev, INT arcDirection ) DECLSPEC_HIDDEN;
extern COLORREF CDECL EMFDRV_SetBkColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern INT CDECL EMFDRV_SetBkMode( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
extern COLORREF CDECL EMFDRV_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern COLORREF CDECL EMFDRV_SetDCPenColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern INT CDECL EMFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest, DWORD cx, DWORD cy, INT xSrc,

View File

@ -129,7 +129,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
EMFDRV_SelectPen, /* pSelectPen */
EMFDRV_SetArcDirection, /* pSetArcDirection */
EMFDRV_SetBkColor, /* pSetBkColor */
EMFDRV_SetBkMode, /* pSetBkMode */
NULL, /* pSetBkMode */
NULL, /* pSetBoundsRect */
EMFDRV_SetDCBrushColor, /* pSetDCBrushColor*/
EMFDRV_SetDCPenColor, /* pSetDCPenColor*/

View File

@ -66,6 +66,7 @@ extern BOOL METADC_Polyline( HDC hdc, const POINT *points,INT count) DECLSPEC_HI
extern BOOL METADC_Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN;
extern BOOL METADC_RoundRect( HDC hdc, INT left, INT top, INT right, INT bottom,
INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
extern BOOL METADC_SetBkMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
extern BOOL METADC_SetPixel( HDC hdc, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
extern BOOL METADC_SetTextAlign( HDC hdc, UINT align ) DECLSPEC_HIDDEN;
@ -109,6 +110,7 @@ extern BOOL EMFDC_Rectangle( DC_ATTR *dc_attr, INT left, INT top, INT right,
INT bottom) DECLSPEC_HIDDEN;
extern BOOL EMFDC_RoundRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom,
INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_SetBkMode( DC_ATTR *dc_attr, INT mode ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_SetPixel( DC_ATTR *dc_attr, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_SetTextAlign( DC_ATTR *dc_attr, UINT align ) DECLSPEC_HIDDEN;

View File

@ -74,6 +74,29 @@ INT WINAPI GetBkMode( HDC hdc )
return dc_attr ? dc_attr->background_mode : 0;
}
/***********************************************************************
* SetBkMode (GDI32.@)
*/
INT WINAPI SetBkMode( HDC hdc, INT mode )
{
DC_ATTR *dc_attr;
INT ret;
if (mode <= 0 || mode > BKMODE_LAST)
{
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
if (is_meta_dc( hdc )) return METADC_SetBkMode( hdc, mode );
if (!(dc_attr = get_dc_attr( hdc ))) return 0;
if (dc_attr->emf && !EMFDC_SetBkMode( dc_attr, mode )) return 0;
ret = dc_attr->background_mode;
dc_attr->background_mode = mode;
return ret;
}
/***********************************************************************
* GetCurrentPositionEx (GDI32.@)
*/

View File

@ -35,9 +35,9 @@ BOOL METADC_SetTextAlign( HDC hdc, UINT align )
return metadc_param2( hdc, META_SETTEXTALIGN, HIWORD(align), LOWORD(align) );
}
INT CDECL MFDRV_SetBkMode( PHYSDEV dev, INT mode )
BOOL METADC_SetBkMode( HDC hdc, INT mode )
{
return MFDRV_MetaParam1( dev, META_SETBKMODE, (WORD)mode) ? mode : 0;
return metadc_param1( hdc, META_SETBKMODE, (WORD)mode );
}
COLORREF CDECL MFDRV_SetBkColor( PHYSDEV dev, COLORREF color )

View File

@ -192,7 +192,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
MFDRV_SelectPen, /* pSelectPen */
NULL, /* pSetArcDirection */
MFDRV_SetBkColor, /* pSetBkColor */
MFDRV_SetBkMode, /* pSetBkMode */
NULL, /* pSetBkMode */
MFDRV_SetBoundsRect, /* pSetBoundsRect */
MFDRV_SetDCBrushColor, /* pSetDCBrushColor*/
MFDRV_SetDCPenColor, /* pSetDCPenColor*/
@ -612,6 +612,14 @@ BOOL metadc_record( HDC hdc, METARECORD *mr, DWORD rlen )
return MFDRV_WriteRecord( &dev->dev, mr, rlen );
}
BOOL metadc_param1( HDC hdc, short func, short param )
{
METAFILEDRV_PDEVICE *dev;
if (!(dev = get_metadc_ptr( hdc ))) return FALSE;
return MFDRV_MetaParam1( &dev->dev, func, param );
}
BOOL metadc_param2( HDC hdc, short func, short param1, short param2 )
{
METAFILEDRV_PDEVICE *dev;

View File

@ -60,6 +60,7 @@ extern BOOL MFDRV_RemoveHandle( PHYSDEV dev, UINT index ) DECLSPEC_HIDDEN;
extern INT16 MFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) DECLSPEC_HIDDEN;
extern METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc ) DECLSPEC_HIDDEN;
extern BOOL metadc_param1( HDC hdc, short func, short param ) DECLSPEC_HIDDEN;
extern BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) DECLSPEC_HIDDEN;
extern BOOL metadc_param4( HDC hdc, short func, short param1, short param2,
short param3, short param4 ) DECLSPEC_HIDDEN;
@ -105,7 +106,6 @@ extern HPEN CDECL MFDRV_SelectPen( PHYSDEV dev, HPEN handle, const struct brush
extern HPALETTE CDECL MFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPalette, BOOL bForceBackground) DECLSPEC_HIDDEN;
extern UINT CDECL MFDRV_RealizePalette(PHYSDEV dev, HPALETTE hPalette, BOOL primary) DECLSPEC_HIDDEN;
extern COLORREF CDECL MFDRV_SetBkColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_SetBkMode( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
extern COLORREF CDECL MFDRV_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern COLORREF CDECL MFDRV_SetDCPenColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
extern DWORD CDECL MFDRV_SetLayout( PHYSDEV dev, DWORD layout ) DECLSPEC_HIDDEN;

View File

@ -40,7 +40,7 @@ static void test_dc_values(void)
{
HDC hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
COLORREF color;
int extra;
int extra, attr;
ok( hdc != NULL, "CreateDC failed\n" );
color = SetBkColor( hdc, 0x12345678 );
@ -81,6 +81,11 @@ static void test_dc_values(void)
extra = GetTextCharacterExtra( hdc );
ok( extra == 123, "initial extra %d\n", extra );
SetLastError(0xdeadbeef);
attr = SetBkMode(ULongToHandle(0xdeadbeef), OPAQUE);
ok(!attr, "attr = %x\n", attr);
ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError() = %u\n", GetLastError());
DeleteDC( hdc );
}

View File

@ -3127,6 +3127,11 @@ static void test_mf_attrs(void)
attr = SetTextAlign(hdc, TA_TOP);
ok(attr == TRUE, "attr = %x\n", attr);
attr = SetBkMode(hdc, TRANSPARENT);
ok(attr == TRUE, "attr = %x\n", attr);
attr = SetBkMode(hdc, OPAQUE);
ok(attr == TRUE, "attr = %x\n", attr);
mf = CloseMetaFile(hdc);
ok(mf != 0, "CloseEnhMetaFile failed\n");
DeleteMetaFile(mf);
@ -3280,6 +3285,11 @@ static void test_emf_attrs(void)
attr = SetTextAlign(hdc, TA_TOP);
ok(attr == TA_BOTTOM, "attr = %x\n", attr);
attr = SetBkMode(hdc, TRANSPARENT);
ok(attr == OPAQUE, "attr = %x\n", attr);
attr = SetBkMode(hdc, OPAQUE);
ok(attr == TRANSPARENT, "attr = %x\n", attr);
mf = CloseEnhMetaFile(hdc);
ok(mf != 0, "CloseEnhMetaFile failed\n");
DeleteEnhMetaFile(mf);