float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { if (m_platformData.useGDI()) return widthForGDIGlyph(glyph); if (!m_platformData.size()) return 0; HDC hdc = GetDC(0); SaveDC(hdc); cairo_scaled_font_t* scaledFont = m_platformData.scaledFont(); cairo_win32_scaled_font_select_font(scaledFont, hdc); int width; GetCharWidthI(hdc, glyph, 1, 0, &width); cairo_win32_scaled_font_done_font(scaledFont); RestoreDC(hdc, -1); ReleaseDC(0, hdc); const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); return width * metricsMultiplier; }
float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { #if __WXMSW__ // under Windows / wxMSW we currently always use GDI fonts. return widthForGDIGlyph(glyph); #else // TODO: fix this! Make GetTextExtents a method of wxFont in 2.9 int width = 10; GetTextExtent(*m_platformData.font(), (wxChar)glyph, &width, NULL); return width; #endif }
float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { #if __WXMSW__ // under Windows / wxMSW we currently always use GDI fonts. return widthForGDIGlyph(glyph); #elif OS(DARWIN) float pointSize = m_platformData.size(); CGAffineTransform m = CGAffineTransformMakeScale(pointSize, pointSize); CGSize advance; NSFont* nsfont = (NSFont*)m_platformData.nsFont(); if (!wkGetGlyphTransformedAdvances(m_platformData.cgFont(), nsfont, &m, &glyph, &advance)) { // LOG_ERROR("Unable to cache glyph widths for %@ %f", [nsfont displayName], pointSize); advance.width = 0; } return advance.width + m_syntheticBoldOffset; #else // TODO: fix this! Make GetTextExtents a method of wxFont in 2.9 int width = 10; GetTextExtent(*m_platformData.font(), (wxChar)glyph, &width, NULL); return width; #endif }