Return correct height and width for stock fonts in GetObject.
This commit is contained in:
parent
6efcd9d857
commit
12668f5e2f
|
@ -26,6 +26,7 @@
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "tweak.h"
|
#include "tweak.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(gdi)
|
DEFAULT_DEBUG_CHANNEL(gdi)
|
||||||
|
|
||||||
|
@ -235,6 +236,80 @@ static void ReadFontInformation(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Because the stock fonts have their structure initialized with
|
||||||
|
* a height of 0 to keep them independent of mapping mode, simply
|
||||||
|
* returning the LOGFONT as is will not work correctly.
|
||||||
|
* These "FixStockFontSizeXXX()" methods will get the correct
|
||||||
|
* size for the fonts.
|
||||||
|
*/
|
||||||
|
static void GetFontMetrics(HFONT handle, LPTEXTMETRICA lptm)
|
||||||
|
{
|
||||||
|
HDC hdc = GetDC((HWND)0);
|
||||||
|
HFONT hOldFont;
|
||||||
|
|
||||||
|
hOldFont = (HFONT)SelectObject(hdc, handle);
|
||||||
|
|
||||||
|
GetTextMetricsA(hdc, lptm);
|
||||||
|
|
||||||
|
SelectObject(hdc, hOldFont);
|
||||||
|
|
||||||
|
ReleaseDC((HWND)0, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void FixStockFontSize16(
|
||||||
|
HFONT handle,
|
||||||
|
INT16 count,
|
||||||
|
LPVOID buffer)
|
||||||
|
{
|
||||||
|
TEXTMETRICA tm;
|
||||||
|
LOGFONT16* pLogFont = (LOGFONT16*)buffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Was the lfHeight field copied (it's the first field)?
|
||||||
|
* If it was and it was null, replace the height.
|
||||||
|
*/
|
||||||
|
if ( (count >= 2*sizeof(INT16)) &&
|
||||||
|
(pLogFont->lfHeight == 0) )
|
||||||
|
{
|
||||||
|
GetFontMetrics(handle, &tm);
|
||||||
|
|
||||||
|
pLogFont->lfHeight = tm.tmHeight;
|
||||||
|
pLogFont->lfWidth = tm.tmAveCharWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void FixStockFontSizeA(
|
||||||
|
HFONT handle,
|
||||||
|
INT count,
|
||||||
|
LPVOID buffer)
|
||||||
|
{
|
||||||
|
TEXTMETRICA tm;
|
||||||
|
LOGFONTA* pLogFont = (LOGFONTA*)buffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Was the lfHeight field copied (it's the first field)?
|
||||||
|
* If it was and it was null, replace the height.
|
||||||
|
*/
|
||||||
|
if ( (count >= 2*sizeof(INT)) &&
|
||||||
|
(pLogFont->lfHeight == 0) )
|
||||||
|
{
|
||||||
|
GetFontMetrics(handle, &tm);
|
||||||
|
|
||||||
|
pLogFont->lfHeight = tm.tmHeight;
|
||||||
|
pLogFont->lfWidth = tm.tmAveCharWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Since the LOGFONTA and LOGFONTW structures are identical up to the
|
||||||
|
* lfHeight member (the one of interest in this case) we simply define
|
||||||
|
* the W version as the A version.
|
||||||
|
*/
|
||||||
|
#define FixStockFontSizeW FixStockFontSizeA
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GDI_Init
|
* GDI_Init
|
||||||
*
|
*
|
||||||
|
@ -450,6 +525,13 @@ INT16 WINAPI GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
|
||||||
break;
|
break;
|
||||||
case FONT_MAGIC:
|
case FONT_MAGIC:
|
||||||
result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
|
result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix the LOGFONT structure for the stock fonts
|
||||||
|
*/
|
||||||
|
if ( (handle >= FIRST_STOCK_HANDLE) &&
|
||||||
|
(handle <= LAST_STOCK_HANDLE) )
|
||||||
|
FixStockFontSize16(handle, count, buffer);
|
||||||
break;
|
break;
|
||||||
case PALETTE_MAGIC:
|
case PALETTE_MAGIC:
|
||||||
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
||||||
|
@ -489,6 +571,13 @@ INT WINAPI GetObjectA( HANDLE handle, INT count, LPVOID buffer )
|
||||||
break;
|
break;
|
||||||
case FONT_MAGIC:
|
case FONT_MAGIC:
|
||||||
result = FONT_GetObjectA( (FONTOBJ *)ptr, count, buffer );
|
result = FONT_GetObjectA( (FONTOBJ *)ptr, count, buffer );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix the LOGFONT structure for the stock fonts
|
||||||
|
*/
|
||||||
|
if ( (handle >= FIRST_STOCK_HANDLE) &&
|
||||||
|
(handle <= LAST_STOCK_HANDLE) )
|
||||||
|
FixStockFontSizeA(handle, count, buffer);
|
||||||
break;
|
break;
|
||||||
case PALETTE_MAGIC:
|
case PALETTE_MAGIC:
|
||||||
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
||||||
|
@ -530,6 +619,13 @@ INT WINAPI GetObjectW( HANDLE handle, INT count, LPVOID buffer )
|
||||||
break;
|
break;
|
||||||
case FONT_MAGIC:
|
case FONT_MAGIC:
|
||||||
result = FONT_GetObjectW( (FONTOBJ *)ptr, count, buffer );
|
result = FONT_GetObjectW( (FONTOBJ *)ptr, count, buffer );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix the LOGFONT structure for the stock fonts
|
||||||
|
*/
|
||||||
|
if ( (handle >= FIRST_STOCK_HANDLE) &&
|
||||||
|
(handle <= LAST_STOCK_HANDLE) )
|
||||||
|
FixStockFontSizeW(handle, count, buffer);
|
||||||
break;
|
break;
|
||||||
case PALETTE_MAGIC:
|
case PALETTE_MAGIC:
|
||||||
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
|
||||||
|
|
Loading…
Reference in New Issue