From 266846399296a55629ec0afd384998c2e3fd0e10 Mon Sep 17 00:00:00 2001 From: Karlen Simonyan Date: Wed, 22 Jul 2015 18:06:14 +0000 Subject: [PATCH] Initial DirectWrite support --- .../win/FontCustomPlatformDataCairo.cpp | 2 +- .../graphics/win/FontPlatformDataCairoWin.cpp | 2 +- .../graphics/win/SimpleFontDataCairoWin.cpp | 60 ++++++++++++++----- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp b/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp index 9e66cbd1f5c8f..fdab11a73031a 100644 --- a/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp +++ b/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp @@ -61,7 +61,7 @@ FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, b auto hfont = adoptGDIObject(::CreateFontIndirect(&logFont)); - cairo_font_face_t* fontFace = cairo_win32_font_face_create_for_hfont(hfont.get()); + cairo_font_face_t* fontFace = cairo_dwrite_font_face_create_for_hfont(hfont.get()); FontPlatformData fontPlatformData(WTF::move(hfont), fontFace, size, bold, italic); diff --git a/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp b/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp index c8d73f02c4cea..ac5a42cfc1f37 100644 --- a/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp +++ b/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp @@ -40,7 +40,7 @@ namespace WebCore { void FontPlatformData::platformDataInit(HFONT font, float size, HDC hdc, WCHAR* faceName) { - cairo_font_face_t* fontFace = cairo_win32_font_face_create_for_hfont(font); + cairo_font_face_t* fontFace = cairo_dwrite_font_face_create_for_hfont(font); cairo_matrix_t sizeMatrix, ctm; cairo_matrix_init_identity(&ctm); diff --git a/Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp b/Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp index 5ecdeac9ccd78..4bf1a2b3b019e 100644 --- a/Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp +++ b/Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp @@ -39,6 +39,7 @@ #include #include #include +#include namespace WebCore { @@ -68,21 +69,34 @@ void SimpleFontData::platformInit() cairo_scaled_font_t* scaledFont = m_platformData.scaledFont(); const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); - cairo_win32_scaled_font_select_font(scaledFont, dc); + IDWriteFontFace* dwriteFontFace = (IDWriteFontFace*)cairo_dwrite_font_face_get(scaledFont); + + cairo_font_face_t* win32fontface = cairo_logfontw_font_face_create_for_dwrite(scaledFont); + cairo_matrix_t sizeMatrix, ctm; + cairo_matrix_init_identity(&ctm); + cairo_matrix_init_scale(&sizeMatrix, m_platformData.size(), m_platformData.size()); + + static cairo_font_options_t* fontOptions = 0; + if (!fontOptions) { + fontOptions = cairo_font_options_create(); + cairo_font_options_set_antialias(fontOptions, CAIRO_ANTIALIAS_SUBPIXEL); + } + + cairo_scaled_font_t* win32font = cairo_scaled_font_create(win32fontface, &sizeMatrix, &ctm, fontOptions); + cairo_font_face_destroy(win32fontface); - TEXTMETRIC textMetrics; - GetTextMetrics(dc, &textMetrics); - float ascent = textMetrics.tmAscent * metricsMultiplier; - float descent = textMetrics.tmDescent * metricsMultiplier; - float xHeight = ascent * 0.56f; // Best guess for xHeight for non-Truetype fonts. - float lineGap = textMetrics.tmExternalLeading * metricsMultiplier; + cairo_win32_scaled_font_select_font(win32font, dc); - int faceLength = ::GetTextFace(dc, 0, 0); - Vector faceName(faceLength); - ::GetTextFace(dc, faceLength, faceName.data()); - m_isSystemFont = !wcscmp(faceName.data(), L"Lucida Grande"); - - ascent = ascentConsideringMacAscentHack(faceName.data(), ascent, descent); + TEXTMETRIC textMetrics; + GetTextMetrics(dc, &textMetrics); + + DWRITE_FONT_METRICS dwriteFontMetrics; + dwriteFontFace->GetMetrics(&dwriteFontMetrics); + + float ascent = ((FLOAT)dwriteFontMetrics.ascent / dwriteFontMetrics.designUnitsPerEm) * metricsMultiplier; + float descent = ((FLOAT)dwriteFontMetrics.descent / dwriteFontMetrics.designUnitsPerEm) * metricsMultiplier; + float xHeight = ((FLOAT)dwriteFontMetrics.xHeight / dwriteFontMetrics.designUnitsPerEm) * metricsMultiplier; + float lineGap = ((FLOAT)dwriteFontMetrics.lineGap / dwriteFontMetrics.designUnitsPerEm) * metricsMultiplier; m_fontMetrics.setAscent(ascent); m_fontMetrics.setDescent(descent); @@ -97,7 +111,8 @@ void SimpleFontData::platformInit() m_fontMetrics.setXHeight(xHeight); cairo_win32_scaled_font_done_font(scaledFont); - + cairo_win32_scaled_font_done_font(win32font); + m_scriptCache = 0; m_scriptFontProperties = 0; @@ -120,6 +135,7 @@ float SimpleFontData::platformWidthForGlyph(Glyph glyph) const if (!m_platformData.size()) return 0; + /* HWndDC dc(0); SaveDC(dc); @@ -135,6 +151,22 @@ float SimpleFontData::platformWidthForGlyph(Glyph glyph) const const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); return width * metricsMultiplier; + */ + cairo_scaled_font_t* scaledFont = m_platformData.scaledFont(); + + const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); + + IDWriteFontFace* dwriteFontFace = (IDWriteFontFace*)cairo_dwrite_font_face_get(scaledFont); + + DWRITE_FONT_METRICS dwriteFontMetrics; + dwriteFontFace->GetMetrics(&dwriteFontMetrics); + + DWRITE_GLYPH_METRICS metrics; + dwriteFontFace->GetDesignGlyphMetrics(&glyph, 1, &metrics); + + float width = (FLOAT)metrics.advanceWidth / dwriteFontMetrics.designUnitsPerEm; + + return width * metricsMultiplier; } }