Alexandre Julliard : gdi32: Move the kerning pairs data into the generic font structure.
Alexandre Julliard
julliard at winehq.org
Mon Oct 26 16:59:42 CDT 2020
Module: wine
Branch: master
Commit: df335e3405c19fb9e91c1fd696bb58892aab30c2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=df335e3405c19fb9e91c1fd696bb58892aab30c2
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 26 11:50:07 2020 +0100
gdi32: Move the kerning pairs data into the generic font structure.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/font.c | 18 +++++++++++++++---
dlls/gdi32/freetype.c | 49 +++++++++++-------------------------------------
dlls/gdi32/gdi_private.h | 4 +++-
3 files changed, 29 insertions(+), 42 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 6fe211eac3d..27aa129c0de 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -426,6 +426,7 @@ struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_
font->refcount = 1;
font->matrix.eM11 = font->matrix.eM22 = 1.0;
font->scale_y = 1.0;
+ font->kern_count = -1;
if (file)
{
@@ -468,6 +469,7 @@ void free_gdi_font( struct gdi_font *font )
HeapFree( GetProcessHeap(), 0, font->otm.otmpFaceName );
HeapFree( GetProcessHeap(), 0, font->otm.otmpFullName );
HeapFree( GetProcessHeap(), 0, font->gm );
+ HeapFree( GetProcessHeap(), 0, font->kern_pairs );
HeapFree( GetProcessHeap(), 0, font );
}
@@ -1179,17 +1181,27 @@ static DWORD CDECL font_GetGlyphOutline( PHYSDEV dev, UINT glyph, UINT format,
static DWORD CDECL font_GetKerningPairs( PHYSDEV dev, DWORD count, KERNINGPAIR *pairs )
{
struct font_physdev *physdev = get_font_dev( dev );
- DWORD ret;
if (!physdev->font)
{
dev = GET_NEXT_PHYSDEV( dev, pGetKerningPairs );
return dev->funcs->pGetKerningPairs( dev, count, pairs );
}
+
EnterCriticalSection( &font_cs );
- ret = font_funcs->pGetKerningPairs( physdev->font, count, pairs );
+ if (physdev->font->kern_count == -1)
+ physdev->font->kern_count = font_funcs->get_kerning_pairs( physdev->font,
+ &physdev->font->kern_pairs );
LeaveCriticalSection( &font_cs );
- return ret;
+
+ if (count && pairs)
+ {
+ count = min( count, physdev->font->kern_count );
+ memcpy( pairs, physdev->font->kern_pairs, count * sizeof(*pairs) );
+ }
+ else count = physdev->font->kern_count;
+
+ return count;
}
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 01a66600063..16fb92dd73b 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -302,8 +302,6 @@ typedef struct {
struct tagGdiFont {
struct gdi_font *gdi_font;
- DWORD total_kern_pairs;
- KERNINGPAIR *kern_pairs;
struct list child_fonts;
/* the following members can be accessed without locking, they are never modified after creation */
@@ -4021,8 +4019,6 @@ static UINT get_nearest_charset(const WCHAR *family_name, Face *face, UINT *cp)
static BOOL CDECL freetype_alloc_font( struct gdi_font *font )
{
GdiFont *ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret));
- ret->total_kern_pairs = (DWORD)-1;
- ret->kern_pairs = NULL;
list_init(&ret->child_fonts);
ret->gdi_font = font;
font->private = ret;
@@ -4048,7 +4044,6 @@ static void CDECL freetype_destroy_font( struct gdi_font *gdi_font )
if (font->ft_face) pFT_Done_Face(font->ft_face);
if (font->mapping) unmap_font_file( font->mapping );
- HeapFree(GetProcessHeap(), 0, font->kern_pairs);
HeapFree(GetProcessHeap(), 0, font->GSUB_Table);
HeapFree(GetProcessHeap(), 0, font);
}
@@ -7458,31 +7453,18 @@ static DWORD parse_format0_kern_subtable(GdiFont *font,
}
/*************************************************************
- * freetype_GetKerningPairs
+ * freetype_get_kerning_pairs
*/
-static DWORD CDECL freetype_GetKerningPairs( struct gdi_font *gdi_font, DWORD cPairs, KERNINGPAIR *kern_pair )
+static DWORD CDECL freetype_get_kerning_pairs( struct gdi_font *gdi_font, KERNINGPAIR **pairs )
{
GdiFont *font = get_font_ptr(gdi_font);
- DWORD length;
+ DWORD length, count = 0;
void *buf;
const struct TT_kern_table *tt_kern_table;
const struct TT_kern_subtable *tt_kern_subtable;
USHORT i, nTables;
USHORT *glyph_to_char;
- if (font->total_kern_pairs != (DWORD)-1)
- {
- if (cPairs && kern_pair)
- {
- cPairs = min(cPairs, font->total_kern_pairs);
- memcpy(kern_pair, font->kern_pairs, cPairs * sizeof(*kern_pair));
- }
- else cPairs = font->total_kern_pairs;
- return cPairs;
- }
-
- font->total_kern_pairs = 0;
-
length = freetype_get_font_data(gdi_font, MS_KERN_TAG, 0, NULL, 0);
if (length == GDI_ERROR)
@@ -7563,21 +7545,19 @@ static DWORD CDECL freetype_GetKerningPairs( struct gdi_font *gdi_font, DWORD cP
*/
if (tt_kern_subtable_copy.coverage.bits.format == 0)
{
- DWORD new_chunk, old_total = font->total_kern_pairs;
+ DWORD new_chunk, old_total = count;
new_chunk = parse_format0_kern_subtable(font, (const struct TT_format0_kern_subtable *)(tt_kern_subtable + 1),
glyph_to_char, NULL, 0);
- font->total_kern_pairs += new_chunk;
+ count += new_chunk;
- if (!font->kern_pairs)
- font->kern_pairs = HeapAlloc(GetProcessHeap(), 0,
- font->total_kern_pairs * sizeof(*font->kern_pairs));
+ if (!*pairs)
+ *pairs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(**pairs));
else
- font->kern_pairs = HeapReAlloc(GetProcessHeap(), 0, font->kern_pairs,
- font->total_kern_pairs * sizeof(*font->kern_pairs));
+ *pairs = HeapReAlloc(GetProcessHeap(), 0, *pairs, count * sizeof(**pairs));
parse_format0_kern_subtable(font, (const struct TT_format0_kern_subtable *)(tt_kern_subtable + 1),
- glyph_to_char, font->kern_pairs + old_total, new_chunk);
+ glyph_to_char, *pairs + old_total, new_chunk);
}
else
TRACE("skipping kerning table format %u\n", tt_kern_subtable_copy.coverage.bits.format);
@@ -7587,14 +7567,7 @@ static DWORD CDECL freetype_GetKerningPairs( struct gdi_font *gdi_font, DWORD cP
HeapFree(GetProcessHeap(), 0, glyph_to_char);
HeapFree(GetProcessHeap(), 0, buf);
-
- if (cPairs && kern_pair)
- {
- cPairs = min(cPairs, font->total_kern_pairs);
- memcpy(kern_pair, font->kern_pairs, cPairs * sizeof(*kern_pair));
- }
- else cPairs = font->total_kern_pairs;
- return cPairs;
+ return count;
}
static const struct font_backend_funcs font_funcs =
@@ -7603,7 +7576,6 @@ static const struct font_backend_funcs font_funcs =
freetype_FontIsLinked,
freetype_GetCharWidthInfo,
freetype_GetFontUnicodeRanges,
- freetype_GetKerningPairs,
freetype_SelectFont,
freetype_AddFontResourceEx,
freetype_RemoveFontResourceEx,
@@ -7616,6 +7588,7 @@ static const struct font_backend_funcs font_funcs =
freetype_get_glyph_outline,
freetype_set_outline_text_metrics,
freetype_set_bitmap_text_metrics,
+ freetype_get_kerning_pairs,
freetype_destroy_font
};
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 1f744d1bf2b..8036dfb986b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -313,6 +313,8 @@ struct gdi_font
DWORD gm_size;
struct glyph_metrics **gm;
OUTLINETEXTMETRICW otm;
+ KERNINGPAIR *kern_pairs;
+ int kern_count;
/* the following members can be accessed without locking, they are never modified after creation */
void *private; /* font backend private data */
DWORD handle;
@@ -359,7 +361,6 @@ struct font_backend_funcs
BOOL (CDECL *pFontIsLinked)( struct gdi_font *font );
BOOL (CDECL *pGetCharWidthInfo)( struct gdi_font *font, struct char_width_info *info );
DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset );
- DWORD (CDECL *pGetKerningPairs)( struct gdi_font *font, DWORD count, KERNINGPAIR *pairs );
struct gdi_font * (CDECL *pSelectFont)( DC *dc, HFONT hfont, UINT *aa_flags, UINT default_aa_flags );
INT (CDECL *pAddFontResourceEx)( LPCWSTR file, DWORD flags, PVOID pdv );
@@ -377,6 +378,7 @@ struct font_backend_funcs
GLYPHMETRICS *gm, ABC *abc, DWORD buflen, void *buf, const MAT2 *mat );
BOOL (CDECL *set_outline_text_metrics)( struct gdi_font *font );
BOOL (CDECL *set_bitmap_text_metrics)( struct gdi_font *font );
+ DWORD (CDECL *get_kerning_pairs)( struct gdi_font *gdi_font, KERNINGPAIR **kern_pair );
void (CDECL *destroy_font)( struct gdi_font *font );
};
More information about the wine-cvs
mailing list