diff --git a/dlls/gdi/freetype.c b/dlls/gdi/freetype.c index 3644e27ec67..feb8b79a696 100644 --- a/dlls/gdi/freetype.c +++ b/dlls/gdi/freetype.c @@ -2376,6 +2376,31 @@ BOOL WineEngGetCharWidth(GdiFont font, UINT firstChar, UINT lastChar, return TRUE; } +/************************************************************* + * WineEngGetCharABCWidths + * + */ +BOOL WineEngGetCharABCWidths(GdiFont font, UINT firstChar, UINT lastChar, + LPABC buffer) +{ + UINT c; + GLYPHMETRICS gm; + FT_UInt glyph_index; + + TRACE("%p, %d, %d, %p\n", font, firstChar, lastChar, buffer); + + for(c = firstChar; c <= lastChar; c++) { + glyph_index = get_glyph_index(font, c); + WineEngGetGlyphOutline(font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, + &gm, 0, NULL, NULL); + buffer[c - firstChar].abcA = font->gm[glyph_index].lsb; + buffer[c - firstChar].abcB = font->gm[glyph_index].bbx; + buffer[c - firstChar].abcC = font->gm[glyph_index].adv - font->gm[glyph_index].lsb - + font->gm[glyph_index].bbx; + } + return TRUE; +} + /************************************************************* * WineEngGetTextExtentPoint * @@ -2557,6 +2582,13 @@ BOOL WineEngGetCharWidth(GdiFont font, UINT firstChar, UINT lastChar, return FALSE; } +BOOL WineEngGetCharABCWidths(GdiFont font, UINT firstChar, UINT lastChar, + LPABC buffer) +{ + ERR("called but we don't have FreeType\n"); + return FALSE; +} + BOOL WineEngGetTextExtentPoint(GdiFont font, LPCWSTR wstr, INT count, LPSIZE size) { diff --git a/dlls/gdi/gdi_private.h b/dlls/gdi/gdi_private.h index 5d961808741..a4d2078f8ab 100644 --- a/dlls/gdi/gdi_private.h +++ b/dlls/gdi/gdi_private.h @@ -218,6 +218,8 @@ extern INT WineEngAddFontResourceEx(LPCWSTR, DWORD, PVOID); extern GdiFont WineEngCreateFontInstance(DC*, HFONT); extern BOOL WineEngDestroyFontInstance(HFONT handle); extern DWORD WineEngEnumFonts(LPLOGFONTW, FONTENUMPROCW, LPARAM); +extern BOOL WineEngGetCharABCWidths(GdiFont font, UINT firstChar, + UINT lastChar, LPABC buffer); extern BOOL WineEngGetCharWidth(GdiFont, UINT, UINT, LPINT); extern DWORD WineEngGetFontData(GdiFont, DWORD, DWORD, LPVOID, DWORD); extern DWORD WineEngGetGlyphIndices(GdiFont font, LPCWSTR lpstr, INT count, diff --git a/objects/font.c b/objects/font.c index c53a90c57a1..2f12f4be8c3 100644 --- a/objects/font.c +++ b/objects/font.c @@ -1668,19 +1668,25 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar, LPABC abc ) { DC *dc = DC_GetDCPtr(hdc); - int i; - GLYPHMETRICS gm; + int i; BOOL ret = FALSE; - if(dc->gdiFont) { - for (i=firstChar;i<=lastChar;i++) { - GetGlyphOutlineW(hdc, i, GGO_METRICS, &gm, 0, NULL, NULL); - abc[i-firstChar].abcA = gm.gmptGlyphOrigin.x; - abc[i-firstChar].abcB = gm.gmBlackBoxX; - abc[i-firstChar].abcC = gm.gmCellIncX - gm.gmptGlyphOrigin.x - gm.gmBlackBoxX; + if(dc->gdiFont) + ret = WineEngGetCharABCWidths( dc->gdiFont, firstChar, lastChar, abc ); + else + FIXME(": stub\n"); + + if (ret) + { + /* convert device units to logical */ + for( i = firstChar; i <= lastChar; i++, abc++ ) { + abc->abcA = INTERNAL_XDSTOWS(dc, abc->abcA); + abc->abcB = INTERNAL_XDSTOWS(dc, abc->abcB); + abc->abcC = INTERNAL_XDSTOWS(dc, abc->abcC); } - ret = TRUE; + ret = TRUE; } + GDI_ReleaseObj(hdc); return ret; }