Hans Leidekker : gdi32: Implement WineEngGetCharABCWidthsFloat and forward GetCharABCWidthsFloat to it .
Alexandre Julliard
julliard at winehq.org
Fri Dec 11 11:04:48 CST 2009
Module: wine
Branch: master
Commit: 1d4fcc027035d11379cd462285b9ceb6b24eb803
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d4fcc027035d11379cd462285b9ceb6b24eb803
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Dec 11 11:38:24 2009 +0100
gdi32: Implement WineEngGetCharABCWidthsFloat and forward GetCharABCWidthsFloat to it.
---
dlls/gdi32/font.c | 40 +++++++++++++++++++++++-----------------
dlls/gdi32/freetype.c | 38 ++++++++++++++++++++++++++++++++++++++
dlls/gdi32/gdi_private.h | 2 ++
3 files changed, 63 insertions(+), 17 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 7f8f6f6..eea53fd 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2908,34 +2908,40 @@ BOOL WINAPI GetCharABCWidthsFloatA( HDC hdc, UINT first, UINT last, LPABCFLOAT a
* RETURNS
* Success: TRUE
* Failure: FALSE
- *
- * BUGS
- * Only works with TrueType fonts. It also doesn't return real
- * floats but converted integers because it's implemented on
- * top of GetCharABCWidthsW.
*/
BOOL WINAPI GetCharABCWidthsFloatW( HDC hdc, UINT first, UINT last, LPABCFLOAT abcf )
{
- ABC *abc, *abc_base;
- unsigned int i, size = sizeof(ABC) * (last - first + 1);
- BOOL ret;
+ UINT i;
+ BOOL ret = FALSE;
+ DC *dc = get_dc_ptr( hdc );
+
+ TRACE("%p, %d, %d, %p\n", hdc, first, last, abcf);
+
+ if (!dc) return FALSE;
- TRACE("%p, %d, %d, %p - partial stub\n", hdc, first, last, abcf);
+ if (!abcf)
+ {
+ release_dc_ptr( dc );
+ return FALSE;
+ }
- abc = abc_base = HeapAlloc( GetProcessHeap(), 0, size );
- if (!abc) return FALSE;
+ if (dc->gdiFont)
+ ret = WineEngGetCharABCWidthsFloat( dc->gdiFont, first, last, abcf );
+ else
+ FIXME("stub\n");
- ret = GetCharABCWidthsW( hdc, first, last, abc );
if (ret)
{
- for (i = first; i <= last; i++, abc++, abcf++)
+ /* convert device units to logical */
+ for (i = first; i <= last; i++, abcf++)
{
- abcf->abcfA = abc->abcA;
- abcf->abcfB = abc->abcB;
- abcf->abcfC = abc->abcC;
+ abcf->abcfA = abcf->abcfA * dc->xformVport2World.eM11;
+ abcf->abcfB = abcf->abcfB * dc->xformVport2World.eM11;
+ abcf->abcfC = abcf->abcfC * dc->xformVport2World.eM11;
}
}
- HeapFree( GetProcessHeap(), 0, abc_base );
+
+ release_dc_ptr( dc );
return ret;
}
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index ed37a25..a93cb60 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5913,6 +5913,38 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar,
}
/*************************************************************
+ * WineEngGetCharABCWidthsFloat
+ *
+ */
+BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer)
+{
+ static const MAT2 identity = {{0,1}, {0,0}, {0,0}, {0,1}};
+ UINT c;
+ GLYPHMETRICS gm;
+ FT_UInt glyph_index;
+ GdiFont *linked_font;
+
+ TRACE("%p, %d, %d, %p\n", font, first, last, buffer);
+
+ GDI_CheckNotLock();
+ EnterCriticalSection( &freetype_cs );
+
+ for (c = first; c <= last; c++)
+ {
+ get_glyph_index_linked(font, c, &linked_font, &glyph_index);
+ WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX,
+ &gm, 0, NULL, &identity);
+ buffer[c - first].abcfA = FONT_GM(linked_font, glyph_index)->lsb;
+ buffer[c - first].abcfB = FONT_GM(linked_font, glyph_index)->bbx;
+ buffer[c - first].abcfC = FONT_GM(linked_font, glyph_index)->adv -
+ FONT_GM(linked_font, glyph_index)->lsb -
+ FONT_GM(linked_font, glyph_index)->bbx;
+ }
+ LeaveCriticalSection( &freetype_cs );
+ return TRUE;
+}
+
+/*************************************************************
* WineEngGetCharABCWidthsI
*
*/
@@ -6605,6 +6637,12 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar,
return FALSE;
}
+BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer)
+{
+ ERR("called but we don't have FreeType\n");
+ return FALSE;
+}
+
BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD pgi,
LPABC buffer)
{
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 670ef41..d5f9112 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -412,6 +412,8 @@ extern BOOL WineEngDestroyFontInstance(HFONT handle) DECLSPEC_HIDDEN;
extern DWORD WineEngEnumFonts(LPLOGFONTW, FONTENUMPROCW, LPARAM) DECLSPEC_HIDDEN;
extern BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar,
UINT lastChar, LPABC buffer) DECLSPEC_HIDDEN;
+extern BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT firstChar,
+ UINT lastChar, LPABCFLOAT buffer) DECLSPEC_HIDDEN;
extern BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar,
UINT count, LPWORD pgi, LPABC buffer) DECLSPEC_HIDDEN;
extern BOOL WineEngGetCharWidth(GdiFont*, UINT, UINT, LPINT) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list