Huw Davies : gdi32: Factor out the code to call FT_Load_Sfnt_Table.
Alexandre Julliard
julliard at winehq.org
Mon Oct 15 11:27:47 CDT 2007
Module: wine
Branch: master
Commit: 6ee7182ebbe36ea68f9d6f4cdc5f9785498e8cad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ee7182ebbe36ea68f9d6f4cdc5f9785498e8cad
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Oct 12 14:06:24 2007 +0100
gdi32: Factor out the code to call FT_Load_Sfnt_Table.
---
dlls/gdi32/freetype.c | 103 ++++++++++++++++++++++++++++--------------------
1 files changed, 60 insertions(+), 43 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 495db78..b9bc82a 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -944,6 +944,58 @@ static WCHAR *get_familyname(FT_Face ft_face)
}
+/*****************************************************************
+ * load_sfnt_table
+ *
+ * Wrapper around FT_Load_Sfnt_Table to cope with older versions
+ * of FreeType that don't export this function.
+ *
+ */
+static FT_Error load_sfnt_table(FT_Face ft_face, FT_ULong table, FT_Long offset, FT_Byte *buf, FT_ULong *len)
+{
+
+ FT_Error err;
+
+ /* If the FT_Load_Sfnt_Table function is there we'll use it */
+ if(pFT_Load_Sfnt_Table)
+ {
+ err = pFT_Load_Sfnt_Table(ft_face, table, offset, buf, len);
+ }
+#ifdef HAVE_FREETYPE_INTERNAL_SFNT_H
+ else /* Do it the hard way */
+ {
+ TT_Face tt_face = (TT_Face) ft_face;
+ SFNT_Interface *sfnt;
+ if (FT_Version.major==2 && FT_Version.minor==0)
+ {
+ /* 2.0.x */
+ sfnt = *(SFNT_Interface**)((char*)tt_face + 528);
+ }
+ else
+ {
+ /* A field was added in the middle of the structure in 2.1.x */
+ sfnt = *(SFNT_Interface**)((char*)tt_face + 532);
+ }
+ err = sfnt->load_any(tt_face, table, offset, buf, len);
+ }
+#else
+ else
+ {
+ static int msg;
+ if(!msg)
+ {
+ MESSAGE("This version of Wine was compiled with freetype headers later than 2.2.0\n"
+ "but is being run with a freetype library without the FT_Load_Sfnt_Table function.\n"
+ "Please upgrade your freetype library.\n");
+ msg++;
+ }
+ err = FT_Err_Unimplemented_Feature;
+ }
+#endif
+ return err;
+}
+
+
#define ADDFONT_EXTERNAL_FONT 0x01
#define ADDFONT_FORCE_BITMAP 0x02
static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_size, char *fake_family, const WCHAR *target_family, DWORD flags)
@@ -4564,50 +4616,15 @@ DWORD WineEngGetFontData(GdiFont *font, DWORD table, DWORD offset, LPVOID buf,
(table >> 8 & 0xff00) | (table << 8 & 0xff0000);
}
- /* If the FT_Load_Sfnt_Table function is there we'll use it */
- if(pFT_Load_Sfnt_Table) {
- /* make sure value of len is the value freetype says it needs */
- if( buf && len) {
- FT_ULong needed = 0;
- err = pFT_Load_Sfnt_Table(ft_face, table, offset, NULL, &needed);
- if( !err && needed < len) len = needed;
- }
- err = pFT_Load_Sfnt_Table(ft_face, table, offset, buf, &len);
- }
-#ifdef HAVE_FREETYPE_INTERNAL_SFNT_H
- else { /* Do it the hard way */
- TT_Face tt_face = (TT_Face) ft_face;
- SFNT_Interface *sfnt;
- if (FT_Version.major==2 && FT_Version.minor==0)
- {
- /* 2.0.x */
- sfnt = *(SFNT_Interface**)((char*)tt_face + 528);
- }
- else
- {
- /* A field was added in the middle of the structure in 2.1.x */
- sfnt = *(SFNT_Interface**)((char*)tt_face + 532);
- }
- /* make sure value of len is the value freetype says it needs */
- if( buf && len) {
- FT_ULong needed = 0;
- err = sfnt->load_any(tt_face, table, offset, NULL, &needed);
- if( !err && needed < len) len = needed;
- }
- err = sfnt->load_any(tt_face, table, offset, buf, &len);
- }
-#else
- else {
- static int msg;
- if(!msg) {
- MESSAGE("This version of Wine was compiled with freetype headers later than 2.2.0\n"
- "but is being run with a freetype library without the FT_Load_Sfnt_Table function.\n"
- "Please upgrade your freetype library.\n");
- msg++;
- }
- err = FT_Err_Unimplemented_Feature;
+ /* make sure value of len is the value freetype says it needs */
+ if(buf && len)
+ {
+ FT_ULong needed = 0;
+ err = load_sfnt_table(ft_face, table, offset, NULL, &needed);
+ if( !err && needed < len) len = needed;
}
-#endif
+ err = load_sfnt_table(ft_face, table, offset, buf, &len);
+
if(err) {
TRACE("Can't find table %c%c%c%c\n",
/* bytes were reversed */
More information about the wine-cvs
mailing list