使用NVPath扩展和Pango渲染多行文本

时间:2015-07-15 02:52:30

标签: opengl nvidia opengl-4 pango opengl-extensions

我正在使用Pango来布局我的文本和NV Path来渲染字形。

难以找到获得每个字形位置的正确方法。正如您所看到的那样,我正在根据线条和字形索引计算这些值。

但是Pango有更好的方法;比如每个字形,每行,范围查询。我的问题是这些方法没有文档,我无法找到任何样本。

如何从Pango获得这种类型的正确字形位置?

std::vector<uint32_t>   glyphs;
std::vector<GLfloat>    positions;

int lineCount                           = pango_layout_get_line_count( pangoLayout );

for ( int l = 0; l < lineCount; ++l )
{
    PangoLayoutLine*    line            = pango_layout_get_line_readonly( pangoLayout, l );
    GSList*             runs            = line->runs;

    float xOffset                       = 0.0f;

    while( runs )
    {
        PangoLayoutRun* run             = static_cast<PangoLayoutRun*>( runs->data );

        glyphs.resize( run->glyphs->num_glyphs, 0 );
        positions.resize( run->glyphs->num_glyphs * 2, 0 );

        for( int g = 0; g < run->glyphs->num_glyphs; ++g )
        {               
            glyphs[g]                   = run->glyphs->glyphs[g].glyph;
            // Need Correct Values Here
            positions[ g * 2 + 0 ]      = xOffset * NVPATH_DEFUALT_EMSCALE;
            positions[ g * 2 + 1 ]      = (float)l * NVPATH_DEFUALT_EMSCALE;

            xOffset                 += PANGO_PIXELS( run->glyphs->glyphs[g].geometry.width ) / getFontSize();
        }

        const Font::RefT font           = getFont( pango_font_description_get_family( pango_font_describe( run->item->analysis.font ) ) );

        glEnable( GL_STENCIL_TEST );

        glStencilFillPathInstancedNV(   run->glyphs->num_glyphs,
                                        GL_UNSIGNED_INT,
                                        &glyphs[0],
                                        font->nvPath,
                                        GL_PATH_FILL_MODE_NV,
                                        0xFF,
                                        GL_TRANSLATE_2D_NV,
                                        &positions[0]
                                        );


        glStencilFunc( GL_NOTEQUAL, 0, 0xFF );
        glStencilOp( GL_KEEP, GL_KEEP, GL_ZERO );
        glColor3f( 0.0, 0.0, 0.0 );

        glCoverFillPathInstancedNV(     run->glyphs->num_glyphs,
                                        GL_UNSIGNED_INT,
                                        &glyphs[0],
                                        font->nvPath,
                                        GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV,
                                        GL_TRANSLATE_2D_NV,
                                        &positions[0]
                                        );

        glDisable( GL_STENCIL_TEST );

        runs                            = runs->next;
    }
}

0 个答案:

没有答案