void QFontEngineDirectWrite::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags) const { if (m_directWriteFontFace == 0) return; QVarLengthArray<UINT16> glyphIndices(glyphs->numGlyphs); // ### Caching? for(int i=0; i<glyphs->numGlyphs; i++) glyphIndices[i] = UINT16(glyphs->glyphs[i]); QVarLengthArray<DWRITE_GLYPH_METRICS> glyphMetrics(glyphIndices.size()); HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(), glyphIndices.size(), glyphMetrics.data()); if (SUCCEEDED(hr)) { for (int i=0; i<glyphs->numGlyphs; ++i) { glyphs->advances_x[i] = DESIGN_TO_LOGICAL(glyphMetrics[i].advanceWidth); if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) glyphs->advances_x[i] = glyphs->advances_x[i].round(); glyphs->advances_y[i] = 0; } } else { qErrnoWarning("QFontEngineDirectWrite::recalcAdvances: GetDesignGlyphMetrics failed"); } }
void fontMetrics(FontPtr font, int *max_awidth_return, int *min_x_return, int *min_y_return, int *max_x_return, int *max_y_return) { int i, rc; int max_awidth = 0; int min_x = 10000 << 16, min_y = 10000 << 16; int max_x = -10000 << 16, max_y = -10000 << 16; for(i = 0; i < FONT_CODES; i++) { int awidth, x0, y0, x1, y1; rc = glyphMetrics(font, i, &awidth, &x0, &y0, &x1, &y1); if(rc < 0) continue; if(awidth > max_awidth) max_awidth = awidth; if(x0 < min_x) min_x = x0; if(y0 < min_y) min_y = y0; if(x1 > max_x) max_x = x1; if(y1 > max_y) max_y = y1; } if(max_awidth_return) *max_awidth_return = max_awidth; if(min_x_return) *min_x_return = min_x; if(min_y_return) *min_y_return = min_y; if(max_x_return) *max_x_return = max_x; if(max_y_return) *max_y_return = max_y; }