예제 #1
0
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;
}