static void add_char ( VGFont font, FT_Face face, FT_ULong c ) { // Pango already provides us with the font index, not the glyph UNICODE // point. FT_Load_Glyph( face, c, FT_LOAD_DEFAULT ); FT_Outline *outline = &face->glyph->outline; VGPath path; path = vgCreatePath( VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.f, 0.f, 0, 0, VG_PATH_CAPABILITY_ALL ); // It could be a blank. If any character doesn't have a glyph, though, // nothing is drawn by vgDrawGlyphs. if ( outline->n_contours > 0 ) { convert_outline( outline->points, outline->tags, outline->contours, outline->n_contours, outline->n_points ); vgAppendPathData( path, segments_count, segments, coords ); } VGfloat origin[] = { 0.f, 0.f }; VGfloat escapement[] = { float_from_26_6(face->glyph->advance.x), float_from_26_6(face->glyph->advance.y) }; vgSetGlyphToPath( font, c, path, VG_TRUE, origin, escapement ); vgDestroyPath( path ); }
VCOS_STATUS_T vgft_font_convert_glyphs(VGFT_FONT_T *font, unsigned int char_height, unsigned int dpi_x, unsigned int dpi_y) { FT_UInt glyph_index; FT_ULong ch; if (FT_Set_Char_Size(font->ft_face, 0, char_height, dpi_x, dpi_y)) { FT_Done_Face(font->ft_face); vgDestroyFont(font->vg_font); return VCOS_EINVAL; } ch = FT_Get_First_Char(font->ft_face, &glyph_index); while (ch != 0) { if (FT_Load_Glyph(font->ft_face, glyph_index, FT_LOAD_DEFAULT)) { FT_Done_Face(font->ft_face); vgDestroyFont(font->vg_font); return VCOS_ENOMEM; } VGPath vg_path; FT_Outline *outline = &font->ft_face->glyph->outline; if (outline->n_contours != 0) { vg_path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); assert(vg_path != VG_INVALID_HANDLE); convert_outline(outline->points, outline->tags, outline->contours, outline->n_contours, outline->n_points); vgAppendPathData(vg_path, segments_count, segments, coords); } else { vg_path = VG_INVALID_HANDLE; } VGfloat origin[] = { 0.0f, 0.0f }; VGfloat escapement[] = { float_from_26_6(font->ft_face->glyph->advance.x), float_from_26_6(font->ft_face->glyph->advance.y) }; vgSetGlyphToPath(font->vg_font, glyph_index, vg_path, VG_FALSE, origin, escapement); if (vg_path != VG_INVALID_HANDLE) { vgDestroyPath(vg_path); } ch = FT_Get_Next_Char(font->ft_face, ch, &glyph_index); } return VCOS_SUCCESS; }