Alexandre Julliard : gdi32: Implement GetFontData as a standard driver entry point.
Alexandre Julliard
julliard at winehq.org
Wed Oct 26 12:35:46 CDT 2011
Module: wine
Branch: master
Commit: e31c51b65e63e159b6361abba5aa8825c3fbb5d3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e31c51b65e63e159b6361abba5aa8825c3fbb5d3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Oct 20 17:58:09 2011 +0200
gdi32: Implement GetFontData as a standard driver entry point.
---
dlls/gdi32/font.c | 8 ++--
dlls/gdi32/freetype.c | 110 +++++++++++++++++++++++-----------------------
dlls/gdi32/gdi_private.h | 1 -
3 files changed, 59 insertions(+), 60 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index ae00b89..0416103 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2759,13 +2759,13 @@ DWORD WINAPI GetFontData(HDC hdc, DWORD table, DWORD offset,
LPVOID buffer, DWORD length)
{
DC *dc = get_dc_ptr(hdc);
- DWORD ret = GDI_ERROR;
+ PHYSDEV dev;
+ DWORD ret;
if(!dc) return GDI_ERROR;
- if(dc->gdiFont)
- ret = WineEngGetFontData(dc->gdiFont, table, offset, buffer, length);
-
+ dev = GET_DC_PHYSDEV( dc, pGetFontData );
+ ret = dev->funcs->pGetFontData( dev, table, offset, buffer, length );
release_dc_ptr( dc );
return ret;
}
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 3ac3677..f11d935 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -3440,6 +3440,40 @@ static void free_font(GdiFont *font)
}
+static DWORD get_font_data( GdiFont *font, DWORD table, DWORD offset, LPVOID buf, DWORD cbData)
+{
+ FT_Face ft_face = font->ft_face;
+ FT_ULong len;
+ FT_Error err;
+
+ if (!FT_IS_SFNT(ft_face)) return GDI_ERROR;
+
+ if(!buf)
+ len = 0;
+ else
+ len = cbData;
+
+ table = RtlUlongByteSwap( table ); /* MS tags differ in endianness from FT ones */
+
+ /* 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);
+ if (err)
+ {
+ TRACE("Can't find table %c%c%c%c\n",
+ /* bytes were reversed */
+ HIBYTE(HIWORD(table)), LOBYTE(HIWORD(table)),
+ HIBYTE(LOWORD(table)), LOBYTE(LOWORD(table)));
+ return GDI_ERROR;
+ }
+ return len;
+}
+
/*************************************************************
* load_VDMX
*
@@ -3477,7 +3511,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
LONG ppem = 0;
int i;
- result = WineEngGetFontData(font, MS_VDMX_TAG, 0, hdr, 6);
+ result = get_font_data(font, MS_VDMX_TAG, 0, hdr, 6);
if(result == GDI_ERROR) /* no vdmx table present, use linear scaling */
return ppem;
@@ -3494,7 +3528,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
Ratios ratio;
offset = (3 * 2) + (i * sizeof(Ratios));
- WineEngGetFontData(font, MS_VDMX_TAG, offset, &ratio, sizeof(Ratios));
+ get_font_data(font, MS_VDMX_TAG, offset, &ratio, sizeof(Ratios));
offset = -1;
TRACE("Ratios[%d] %d %d : %d -> %d\n", i, ratio.bCharSet, ratio.xRatio, ratio.yStartRatio, ratio.yEndRatio);
@@ -3507,7 +3541,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
devYRatio <= ratio.yEndRatio))
{
offset = (3 * 2) + (numRatios * 4) + (i * 2);
- WineEngGetFontData(font, MS_VDMX_TAG, offset, &tmp, 2);
+ get_font_data(font, MS_VDMX_TAG, offset, &tmp, 2);
offset = GET_BE_WORD(tmp);
break;
}
@@ -3518,7 +3552,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
return ppem;
}
- if(WineEngGetFontData(font, MS_VDMX_TAG, offset, &group, 4) != GDI_ERROR) {
+ if(get_font_data(font, MS_VDMX_TAG, offset, &group, 4) != GDI_ERROR) {
USHORT recs;
BYTE startsz, endsz;
WORD *vTable;
@@ -3530,7 +3564,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
TRACE("recs=%d startsz=%d endsz=%d\n", recs, startsz, endsz);
vTable = HeapAlloc(GetProcessHeap(), 0, recs * 6);
- result = WineEngGetFontData(font, MS_VDMX_TAG, offset + 4, vTable, recs * 6);
+ result = get_font_data(font, MS_VDMX_TAG, offset + 4, vTable, recs * 6);
if(result == GDI_ERROR) {
FIXME("Failed to retrieve vTable\n");
goto end;
@@ -4217,11 +4251,11 @@ found_face:
if (lf.lfFaceName[0]=='@') /* We need to try to load the GSUB table */
{
- int length = WineEngGetFontData (ret, GSUB_TAG , 0, NULL, 0);
+ int length = get_font_data(ret, GSUB_TAG , 0, NULL, 0);
if (length != GDI_ERROR)
{
ret->GSUB_Table = HeapAlloc(GetProcessHeap(),0,length);
- WineEngGetFontData(ret, GSUB_TAG , 0, ret->GSUB_Table, length);
+ get_font_data(ret, GSUB_TAG , 0, ret->GSUB_Table, length);
TRACE("Loaded GSUB table of %i bytes\n",length);
}
}
@@ -6548,50 +6582,23 @@ static BOOL freetype_GetTextExtentExPointI( PHYSDEV dev, const WORD *indices, IN
}
/*************************************************************
- * WineEngGetFontData
- *
+ * freetype_GetFontData
*/
-DWORD WineEngGetFontData(GdiFont *font, DWORD table, DWORD offset, LPVOID buf,
- DWORD cbData)
+static DWORD freetype_GetFontData( PHYSDEV dev, DWORD table, DWORD offset, LPVOID buf, DWORD cbData )
{
- FT_Face ft_face = font->ft_face;
- FT_ULong len;
- FT_Error err;
-
- TRACE("font=%p, table=%c%c%c%c, offset=0x%x, buf=%p, cbData=0x%x\n",
- font, LOBYTE(LOWORD(table)), HIBYTE(LOWORD(table)),
- LOBYTE(HIWORD(table)), HIBYTE(HIWORD(table)), offset, buf, cbData);
-
- if(!FT_IS_SFNT(ft_face))
- return GDI_ERROR;
-
- if(!buf)
- len = 0;
- else
- len = cbData;
-
- if(table) { /* MS tags differ in endianness from FT ones */
- table = table >> 24 | table << 24 |
- (table >> 8 & 0xff00) | (table << 8 & 0xff0000);
- }
+ struct freetype_physdev *physdev = get_freetype_dev( dev );
- /* make sure value of len is the value freetype says it needs */
- if(buf && len)
+ if (!physdev->font)
{
- FT_ULong needed = 0;
- err = pFT_Load_Sfnt_Table(ft_face, table, offset, NULL, &needed);
- if( !err && needed < len) len = needed;
+ dev = GET_NEXT_PHYSDEV( dev, pGetFontData );
+ return dev->funcs->pGetFontData( dev, table, offset, buf, cbData );
}
- err = pFT_Load_Sfnt_Table(ft_face, table, offset, buf, &len);
- if(err) {
- TRACE("Can't find table %c%c%c%c\n",
- /* bytes were reversed */
- HIBYTE(HIWORD(table)), LOBYTE(HIWORD(table)),
- HIBYTE(LOWORD(table)), LOBYTE(LOWORD(table)));
- return GDI_ERROR;
- }
- return len;
+ TRACE("font=%p, table=%c%c%c%c, offset=0x%x, buf=%p, cbData=0x%x\n",
+ physdev->font, LOBYTE(LOWORD(table)), HIBYTE(LOWORD(table)),
+ LOBYTE(HIWORD(table)), HIBYTE(HIWORD(table)), offset, buf, cbData);
+
+ return get_font_data( physdev->font, table, offset, buf, cbData );
}
/*************************************************************
@@ -6963,7 +6970,7 @@ static DWORD freetype_GetKerningPairs( PHYSDEV dev, DWORD cPairs, KERNINGPAIR *k
font->total_kern_pairs = 0;
- length = WineEngGetFontData(font, MS_KERN_TAG, 0, NULL, 0);
+ length = get_font_data(font, MS_KERN_TAG, 0, NULL, 0);
if (length == GDI_ERROR)
{
@@ -6980,7 +6987,7 @@ static DWORD freetype_GetKerningPairs( PHYSDEV dev, DWORD cPairs, KERNINGPAIR *k
return 0;
}
- WineEngGetFontData(font, MS_KERN_TAG, 0, buf, length);
+ get_font_data(font, MS_KERN_TAG, 0, buf, length);
/* build a glyph index to char code map */
glyph_to_char = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USHORT) * 65536);
@@ -7132,7 +7139,7 @@ static const struct gdi_dc_funcs freetype_funcs =
freetype_GetCharWidth, /* pGetCharWidth */
NULL, /* pGetDeviceCaps */
NULL, /* pGetDeviceGammaRamp */
- NULL, /* pGetFontData */
+ freetype_GetFontData, /* pGetFontData */
freetype_GetFontUnicodeRanges, /* pGetFontUnicodeRanges */
freetype_GetGlyphIndices, /* pGetGlyphIndices */
freetype_GetGlyphOutline, /* pGetGlyphOutline */
@@ -7236,13 +7243,6 @@ BOOL WineEngDestroyFontInstance(HFONT hfont)
return FALSE;
}
-DWORD WineEngGetFontData(GdiFont *font, DWORD table, DWORD offset, LPVOID buf,
- DWORD cbData)
-{
- ERR("called but we don't have FreeType\n");
- return GDI_ERROR;
-}
-
INT WineEngAddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
{
FIXME("(%s, %x, %p): stub\n", debugstr_w(file), flags, pdv);
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 2e1a650..40c3cba 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -292,7 +292,6 @@ typedef struct
extern INT WineEngAddFontResourceEx(LPCWSTR, DWORD, PVOID) DECLSPEC_HIDDEN;
extern HANDLE WineEngAddFontMemResourceEx(PVOID, DWORD, PVOID, LPDWORD) DECLSPEC_HIDDEN;
extern BOOL WineEngDestroyFontInstance(HFONT handle) DECLSPEC_HIDDEN;
-extern DWORD WineEngGetFontData(GdiFont*, DWORD, DWORD, LPVOID, DWORD) DECLSPEC_HIDDEN;
extern BOOL WineEngGetLinkedHFont(DC *dc, WCHAR c, HFONT *new_hfont, UINT *glyph) DECLSPEC_HIDDEN;
extern BOOL WineEngFontIsLinked(GdiFont*) DECLSPEC_HIDDEN;
extern BOOL WineEngInit(void) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list