Huw Davies : gdi32: Add a helper to retrieve the fontsignature.
Alexandre Julliard
julliard at winehq.org
Tue Mar 27 12:48:06 CDT 2012
Module: wine
Branch: master
Commit: b5115f77bc1c24111d4e8182f24916c292600e8d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b5115f77bc1c24111d4e8182f24916c292600e8d
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Mar 27 11:48:44 2012 +0100
gdi32: Add a helper to retrieve the fontsignature.
---
dlls/gdi32/freetype.c | 112 ++++++++++++++++++++++++++++---------------------
1 files changed, 64 insertions(+), 48 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 6f916c1..be03c34 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1605,6 +1605,69 @@ static inline int get_bitmap_internal_leading( FT_Face ft_face )
return internal_leading;
}
+static inline void get_fontsig( FT_Face ft_face, FONTSIGNATURE *fs )
+{
+ TT_OS2 *os2;
+ FT_UInt dummy;
+ CHARSETINFO csi;
+ FT_WinFNT_HeaderRec winfnt_header;
+ int i;
+
+ memset( fs, 0, sizeof(*fs) );
+
+ os2 = pFT_Get_Sfnt_Table( ft_face, ft_sfnt_os2 );
+ if (os2)
+ {
+ fs->fsUsb[0] = os2->ulUnicodeRange1;
+ fs->fsUsb[1] = os2->ulUnicodeRange2;
+ fs->fsUsb[2] = os2->ulUnicodeRange3;
+ fs->fsUsb[3] = os2->ulUnicodeRange4;
+
+ if (os2->version == 0)
+ {
+ if (pFT_Get_First_Char( ft_face, &dummy ) < 0x100)
+ fs->fsCsb[0] = FS_LATIN1;
+ else
+ fs->fsCsb[0] = FS_SYMBOL;
+ }
+ else
+ {
+ fs->fsCsb[0] = os2->ulCodePageRange1;
+ fs->fsCsb[1] = os2->ulCodePageRange2;
+ }
+ }
+ else
+ {
+ if (!pFT_Get_WinFNT_Header( ft_face, &winfnt_header ))
+ {
+ TRACE("pix_h %d charset %d dpi %dx%d pt %d\n", winfnt_header.pixel_height, winfnt_header.charset,
+ winfnt_header.vertical_resolution,winfnt_header.horizontal_resolution, winfnt_header.nominal_point_size);
+ if (TranslateCharsetInfo( (DWORD*)(UINT_PTR)winfnt_header.charset, &csi, TCI_SRCCHARSET ))
+ *fs = csi.fs;
+ }
+ }
+
+ if (fs->fsCsb[0] == 0)
+ {
+ /* let's see if we can find any interesting cmaps */
+ for (i = 0; i < ft_face->num_charmaps; i++)
+ {
+ switch (ft_face->charmaps[i]->encoding)
+ {
+ case FT_ENCODING_UNICODE:
+ case FT_ENCODING_APPLE_ROMAN:
+ fs->fsCsb[0] |= FS_LATIN1;
+ break;
+ case FT_ENCODING_MS_SYMBOL:
+ fs->fsCsb[0] |= FS_SYMBOL;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
#define ADDFONT_EXTERNAL_FONT 0x01
#define ADDFONT_FORCE_BITMAP 0x02
#define ADDFONT_ADD_TO_CACHE 0x04
@@ -1616,10 +1679,8 @@ static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr
WCHAR *StyleW;
do {
- TT_OS2 *pOS2;
Face *face;
struct list *face_elem_ptr;
- FT_WinFNT_HeaderRec winfnt_header;
FONTSIGNATURE fs;
My_FT_Bitmap_Size *size = NULL;
FT_Fixed version;
@@ -1631,32 +1692,7 @@ static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr
StyleW = towstr(CP_ACP, ft_face->style_name);
- memset(&fs, 0, sizeof(fs));
-
- pOS2 = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
- if(pOS2) {
- fs.fsCsb[0] = pOS2->ulCodePageRange1;
- fs.fsCsb[1] = pOS2->ulCodePageRange2;
- fs.fsUsb[0] = pOS2->ulUnicodeRange1;
- fs.fsUsb[1] = pOS2->ulUnicodeRange2;
- fs.fsUsb[2] = pOS2->ulUnicodeRange3;
- fs.fsUsb[3] = pOS2->ulUnicodeRange4;
- if(pOS2->version == 0) {
- FT_UInt dummy;
-
- if(pFT_Get_First_Char( ft_face, &dummy ) < 0x100)
- fs.fsCsb[0] |= FS_LATIN1;
- else
- fs.fsCsb[0] |= FS_SYMBOL;
- }
- }
- else if(!pFT_Get_WinFNT_Header(ft_face, &winfnt_header)) {
- CHARSETINFO csi;
- TRACE("pix_h %d charset %d dpi %dx%d pt %d\n", winfnt_header.pixel_height, winfnt_header.charset,
- winfnt_header.vertical_resolution,winfnt_header.horizontal_resolution, winfnt_header.nominal_point_size);
- if(TranslateCharsetInfo((DWORD*)(UINT_PTR)winfnt_header.charset, &csi, TCI_SRCCHARSET))
- fs = csi.fs;
- }
+ get_fontsig( ft_face, &fs );
version = get_font_version( ft_face );
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
@@ -1726,26 +1762,6 @@ static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr
face->fs.fsUsb[0], face->fs.fsUsb[1],
face->fs.fsUsb[2], face->fs.fsUsb[3]);
- if(face->fs.fsCsb[0] == 0)
- {
- int i;
-
- /* let's see if we can find any interesting cmaps */
- for(i = 0; i < ft_face->num_charmaps; i++) {
- switch(ft_face->charmaps[i]->encoding) {
- case FT_ENCODING_UNICODE:
- case FT_ENCODING_APPLE_ROMAN:
- face->fs.fsCsb[0] |= FS_LATIN1;
- break;
- case FT_ENCODING_MS_SYMBOL:
- face->fs.fsCsb[0] |= FS_SYMBOL;
- break;
- default:
- break;
- }
- }
- }
-
if(flags & ADDFONT_ADD_TO_CACHE)
add_face_to_cache(face);
More information about the wine-cvs
mailing list