Index: reactos/win32ss/gdi/gdi32/wine/enhmfdrv/objects.c =================================================================== --- reactos/win32ss/gdi/gdi32/wine/enhmfdrv/objects.c (revision 74045) +++ reactos/win32ss/gdi/gdi32/wine/enhmfdrv/objects.c (working copy) @@ -2,6 +2,7 @@ * Enhanced MetaFile objects * * Copyright 1999 Huw D M Davies + * Copyright 2017 Katayama Hirofumi MZ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -321,8 +322,54 @@ return hFont; } +static DWORD +EMFDRV_ExtCreatePen_(PHYSDEV dev, HPEN hPen) +{ + DWORD TotalSize, Index; + EMREXTCREATEPEN *pemrx; + INT Size; + /* get the size of EXTLOGPEN (variable length) */ + Size = GetObjectW(hPen, 0, NULL); + if (Size <= sizeof(LOGPEN)) + return 0; /* failure */ + /* allocate an EMREXTCREATEPEN (variable length) */ + TotalSize = Size + sizeof(EMREXTCREATEPEN) - sizeof(EXTLOGPEN); + pemrx = HeapAlloc(GetProcessHeap(), 0, TotalSize); + if (pemrx == NULL || !GetObjectW(hPen, Size, &pemrx->elp)) + { + if (pemrx) + HeapFree(GetProcessHeap(), 0, pemrx); + return 0; /* failure */ + } + + /* store */ + pemrx->emr.iType = EMR_EXTCREATEPEN; + pemrx->emr.nSize = TotalSize; + pemrx->ihPen = Index = EMFDRV_AddHandle(dev, hPen); + + switch (pemrx->elp.elpBrushStyle) + { + case BS_DIBPATTERN: case BS_DIBPATTERNPT: + /* FIXME: store a DIB */ + /* Hereby, pemrx->elp.elpHatch is a pointer to a packed DIB. */ + pemrx->offBmi = pemrx->cbBmi = 0; + pemrx->offBits = pemrx->cbBits = 0; + break; + default: + pemrx->offBmi = pemrx->cbBmi = 0; + pemrx->offBits = pemrx->cbBits = 0; + } + + if (!EMFDRV_WriteRecord(dev, &pemrx->emr)) + Index = 0; /* failure */ + + /* free the EMREXTCREATEPEN */ + HeapFree(GetProcessHeap(), 0, pemrx); + return Index; +} + /****************************************************************** * EMFDRV_CreatePenIndirect */ @@ -329,35 +376,22 @@ static DWORD EMFDRV_CreatePenIndirect(PHYSDEV dev, HPEN hPen) { EMRCREATEPEN emr; - DWORD index = 0; + DWORD Index = 0; - if (!GetObjectW( hPen, sizeof(emr.lopn), &emr.lopn )) + if (GetObjectW(hPen, sizeof(emr.lopn), &emr.lopn)) { - /* must be an extended pen */ - EXTLOGPEN *elp; - INT size = GetObjectW( hPen, 0, NULL ); - - if (!size) return 0; - - elp = HeapAlloc( GetProcessHeap(), 0, size ); - - GetObjectW( hPen, size, elp ); - /* FIXME: add support for user style pens */ - emr.lopn.lopnStyle = elp->elpPenStyle; - emr.lopn.lopnWidth.x = elp->elpWidth; - emr.lopn.lopnWidth.y = 0; - emr.lopn.lopnColor = elp->elpColor; - - HeapFree( GetProcessHeap(), 0, elp ); + emr.emr.iType = EMR_CREATEPEN; + emr.emr.nSize = sizeof(emr); + emr.ihPen = Index = EMFDRV_AddHandle(dev, hPen); + if (!EMFDRV_WriteRecord(dev, &emr.emr)) + Index = 0; /* failure */ } + else + { + Index = EMFDRV_ExtCreatePen_(dev, hPen); + } - emr.emr.iType = EMR_CREATEPEN; - emr.emr.nSize = sizeof(emr); - emr.ihPen = index = EMFDRV_AddHandle( dev, hPen ); - - if(!EMFDRV_WriteRecord( dev, &emr.emr )) - index = 0; - return index; + return Index; } /******************************************************************