Dmitry Timoshkov : gdi32: Allocate cache for face enumeration data only when necessary.
Alexandre Julliard
julliard at winehq.org
Wed Jan 16 07:09:34 CST 2008
Module: wine
Branch: master
Commit: ec4a46f93a9c94d43f596e3450ceb4e1a01904b5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ec4a46f93a9c94d43f596e3450ceb4e1a01904b5
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Wed Jan 16 14:46:24 2008 +0800
gdi32: Allocate cache for face enumeration data only when necessary.
---
dlls/gdi32/freetype.c | 33 ++++++++++++++++++++-------------
1 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index b72ee50..b48cbcc 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -242,6 +242,13 @@ typedef struct {
FT_Pos size, x_ppem, y_ppem;
} My_FT_Bitmap_Size;
+struct enum_data
+{
+ ENUMLOGFONTEXW elf;
+ NEWTEXTMETRICEXW ntm;
+ DWORD type;
+};
+
typedef struct tagFace {
struct list entry;
WCHAR *StyleName;
@@ -260,10 +267,7 @@ typedef struct tagFace {
BOOL external; /* TRUE if we should manually add this font to the registry */
struct tagFamily *family;
/* Cached data for Enum */
- BOOL cache_valid;
- ENUMLOGFONTEXW elf;
- NEWTEXTMETRICEXW ntm;
- DWORD type;
+ struct enum_data *cached_enum_data;
} Face;
typedef struct tagFamily {
@@ -1239,7 +1243,7 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
}
}
face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
- face->cache_valid = FALSE;
+ face->cached_enum_data = NULL;
list_add_tail(&family->faces, &face->entry);
face->StyleName = StyleW;
if (file)
@@ -3290,12 +3294,12 @@ static void GetEnumStructs(Face *face, LPENUMLOGFONTEXW pelf,
GdiFont *font;
LONG width, height;
- if (face->cache_valid)
+ if (face->cached_enum_data)
{
TRACE("Cached\n");
- memcpy(pelf,&face->elf,sizeof(ENUMLOGFONTEXW));
- memcpy(pntm,&face->ntm,sizeof(NEWTEXTMETRICEXW));
- *ptype = face->type;
+ memcpy(pelf, &face->cached_enum_data->elf, sizeof(ENUMLOGFONTEXW));
+ memcpy(pntm, &face->cached_enum_data->ntm, sizeof(NEWTEXTMETRICEXW));
+ *ptype = face->cached_enum_data->type;
return;
}
@@ -3374,10 +3378,13 @@ static void GetEnumStructs(Face *face, LPENUMLOGFONTEXW pelf,
if(!(pntm->ntmTm.tmPitchAndFamily & TMPF_VECTOR))
*ptype |= RASTER_FONTTYPE;
- memcpy(&face->elf,pelf,sizeof(ENUMLOGFONTEXW));
- memcpy(&face->ntm,pntm,sizeof(NEWTEXTMETRICEXW));
- face->type = *ptype;
- face->cache_valid = TRUE;
+ face->cached_enum_data = HeapAlloc(GetProcessHeap(), 0, sizeof(*face->cached_enum_data));
+ if (face->cached_enum_data)
+ {
+ memcpy(&face->cached_enum_data->elf, pelf, sizeof(ENUMLOGFONTEXW));
+ memcpy(&face->cached_enum_data->ntm, pntm, sizeof(NEWTEXTMETRICEXW));
+ face->cached_enum_data->type = *ptype;
+ }
free_font(font);
}
More information about the wine-cvs
mailing list