Alexandre Julliard : gdi32: Avoid calling GetObject16 from 32-bit code.
Alexandre Julliard
julliard at winehq.org
Tue Feb 19 08:05:11 CST 2008
Module: wine
Branch: master
Commit: 1fa9e526ff0931991aa547c8137327f6143307bc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1fa9e526ff0931991aa547c8137327f6143307bc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 18 18:07:51 2008 +0100
gdi32: Avoid calling GetObject16 from 32-bit code.
---
dlls/gdi32/mfdrv/objects.c | 51 +++++++++++++++++++++++++++++++++----------
1 files changed, 39 insertions(+), 12 deletions(-)
diff --git a/dlls/gdi32/mfdrv/objects.c b/dlls/gdi32/mfdrv/objects.c
index a43598b..c6dbb87 100644
--- a/dlls/gdi32/mfdrv/objects.c
+++ b/dlls/gdi32/mfdrv/objects.c
@@ -354,14 +354,32 @@ HBRUSH MFDRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
* MFDRV_CreateFontIndirect
*/
-static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONT16 *logfont)
+static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONTW *logfont)
{
char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT16)];
METARECORD *mr = (METARECORD *)&buffer;
+ LOGFONT16 *font16;
mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT16) - 2) / 2;
mr->rdFunction = META_CREATEFONTINDIRECT;
- memcpy(&(mr->rdParm), logfont, sizeof(LOGFONT16));
+ font16 = (LOGFONT16 *)&mr->rdParm;
+
+ font16->lfHeight = logfont->lfHeight;
+ font16->lfWidth = logfont->lfWidth;
+ font16->lfEscapement = logfont->lfEscapement;
+ font16->lfOrientation = logfont->lfOrientation;
+ font16->lfWeight = logfont->lfWeight;
+ font16->lfItalic = logfont->lfItalic;
+ font16->lfUnderline = logfont->lfUnderline;
+ font16->lfStrikeOut = logfont->lfStrikeOut;
+ font16->lfCharSet = logfont->lfCharSet;
+ font16->lfOutPrecision = logfont->lfOutPrecision;
+ font16->lfClipPrecision = logfont->lfClipPrecision;
+ font16->lfQuality = logfont->lfQuality;
+ font16->lfPitchAndFamily = logfont->lfPitchAndFamily;
+ WideCharToMultiByte( CP_ACP, 0, logfont->lfFaceName, -1, font16->lfFaceName, LF_FACESIZE, NULL, NULL );
+ font16->lfFaceName[LF_FACESIZE-1] = 0;
+
if (!(MFDRV_WriteRecord( dev, mr, mr->rdSize * 2)))
return 0;
return MFDRV_AddHandle( dev, hFont );
@@ -374,15 +392,15 @@ static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONT16 *logf
HFONT MFDRV_SelectFont( PHYSDEV dev, HFONT hfont, HANDLE gdiFont )
{
METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dev;
- LOGFONT16 lf16;
+ LOGFONTW font;
INT16 index;
index = MFDRV_FindObject(dev, hfont);
if( index < 0 )
{
- if (!GetObject16( HFONT_16(hfont), sizeof(lf16), &lf16 ))
+ if (!GetObjectW( hfont, sizeof(font), &font ))
return HGDI_ERROR;
- index = MFDRV_CreateFontIndirect(dev, hfont, &lf16);
+ index = MFDRV_CreateFontIndirect(dev, hfont, &font);
if( index < 0 )
return HGDI_ERROR;
GDI_hdc_using_object(hfont, physDev->hdc);
@@ -419,15 +437,24 @@ HPEN MFDRV_SelectPen( PHYSDEV dev, HPEN hpen )
index = MFDRV_FindObject(dev, hpen);
if( index < 0 )
{
- if (!GetObject16( HPEN_16(hpen), sizeof(logpen), &logpen ))
- {
- /* must be an extended pen */
- EXTLOGPEN *elp;
- INT size = GetObjectW( hpen, 0, NULL );
+ /* must be an extended pen */
+ INT size = GetObjectW( hpen, 0, NULL );
+
+ if (!size) return 0;
- if (!size) return 0;
+ if (size == sizeof(LOGPEN))
+ {
+ LOGPEN pen;
- elp = HeapAlloc( GetProcessHeap(), 0, size );
+ GetObjectW( hpen, sizeof(pen), &pen );
+ logpen.lopnStyle = pen.lopnStyle;
+ logpen.lopnWidth.x = pen.lopnWidth.x;
+ logpen.lopnWidth.y = pen.lopnWidth.y;
+ logpen.lopnColor = pen.lopnColor;
+ }
+ else /* must be an extended pen */
+ {
+ EXTLOGPEN *elp = HeapAlloc( GetProcessHeap(), 0, size );
GetObjectW( hpen, size, elp );
/* FIXME: add support for user style pens */
More information about the wine-cvs
mailing list