void SimpleFontData::platformInit() { FT_Face face = m_platformData.m_face; if (face) { m_ascent = static_cast<int> (DOUBLE_FROM_26_6(face->size->metrics.ascender)); m_descent = -static_cast<int> (DOUBLE_FROM_26_6(face->size->metrics.descender)); m_lineSpacing = static_cast<int> (DOUBLE_FROM_26_6(face->size->metrics.height)); FT_Load_Char(face, 'x', FT_LOAD_DEFAULT); m_xHeight = DOUBLE_FROM_26_6(face->glyph->metrics.height); FT_Load_Char(face, ' ', FT_LOAD_DEFAULT); m_spaceWidth = DOUBLE_FROM_26_6(face->glyph->metrics.horiAdvance); m_lineGap = m_lineSpacing - m_ascent + m_descent; } }
static cairo_status_t glyph_array_add_text(glyph_array_t *glyphs, cairo_t *cr, const char *s, double spacing) { cairo_scaled_font_t *scaled_font; cairo_status_t status; FT_Face face; unsigned long charcode; unsigned int index; cairo_text_extents_t extents; const char *p; FT_Vector kerning; double kern_x; int first = TRUE; scaled_font = cairo_get_scaled_font (cr); status = cairo_scaled_font_status (scaled_font); if (status) return status; face = cairo_ft_scaled_font_lock_face (scaled_font); if (face == NULL) return CAIRO_STATUS_FONT_TYPE_MISMATCH; p = s; while (*p) { charcode = *p; index = FT_Get_Char_Index (face, charcode); glyphs->glyph_list[glyphs->num_glyphs].index = index; if (first) { first = FALSE; glyphs->glyph_list[glyphs->num_glyphs].x = glyphs->x; glyphs->glyph_list[glyphs->num_glyphs].y = glyphs->y; } else { cairo_glyph_extents (cr, &glyphs->glyph_list[glyphs->num_glyphs - 1], 1, &extents); FT_Get_Kerning (face, glyphs->glyph_list[glyphs->num_glyphs - 1].index, glyphs->glyph_list[glyphs->num_glyphs].index, FT_KERNING_UNSCALED, &kerning); kern_x = DOUBLE_FROM_26_6(kerning.x); glyphs->glyph_list[glyphs->num_glyphs].x = glyphs->glyph_list[glyphs->num_glyphs - 1].x + extents.x_advance + kern_x + spacing; glyphs->glyph_list[glyphs->num_glyphs].y = glyphs->glyph_list[glyphs->num_glyphs - 1].y + extents.y_advance; } cairo_glyph_extents (cr, &glyphs->glyph_list[glyphs->num_glyphs], 1, &extents); glyphs->x = glyphs->glyph_list[glyphs->num_glyphs].x + extents.x_advance + spacing; glyphs->y = glyphs->glyph_list[glyphs->num_glyphs].y + extents.y_advance; p++; glyphs->num_glyphs++; } cairo_ft_scaled_font_unlock_face (scaled_font); return CAIRO_STATUS_SUCCESS; }
float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { FT_Face face = m_font.m_face; if (FT_Load_Glyph(face, glyph, FT_LOAD_DEFAULT)) { return m_spaceWidth; } if (face->glyph->advance.x) return DOUBLE_FROM_26_6(face->glyph->advance.x); return m_spaceWidth; }
float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { float width = 0; FT_Face face = m_platformData.m_face; if (FT_Load_Glyph(face, glyph, FT_LOAD_DEFAULT)) { width = m_spaceWidth; } else if (face->glyph->advance.x) { width = DOUBLE_FROM_26_6(face->glyph->advance.x); } else { width = m_spaceWidth; } return width; }
/* Currently not used */ static int CalculateStringWidthsUTF8 (cairo_t *ct, GDIPCONST GpFont *gdiFont, const BYTE *utf8, unsigned long StringDetailElements, GpStringDetailStruct *StringDetails) { FT_Face face; size_t i; gunichar *ucs4 = NULL; cairo_font_face_t *Font; GpStringDetailStruct *CurrentDetail; glong NumOfGlyphs; cairo_matrix_t matrix; #ifdef DRAWSTRING_DEBUG printf("CalculateStringWidths(font, %s, %d, details) called\n", utf8, StringDetailElements); #endif Font = (cairo_font_face_t *)gdiFont->cairofnt; face = gdip_cairo_ft_font_lock_face(Font); if (!face) return 0; cairo_get_font_matrix(ct, &matrix); cairo_matrix_scale(&matrix, gdiFont->sizeInPixels, gdiFont->sizeInPixels); ucs4 = g_utf8_to_ucs4 ((const gchar *) utf8, (glong)-1, NULL, &NumOfGlyphs, NULL); if ((NumOfGlyphs == 0) || (ucs4 == NULL)) { return 0; } CurrentDetail=StringDetails; for (i = 0; i < NumOfGlyphs; i++) { FT_Load_Glyph (face, FT_Get_Char_Index (face, ucs4[i]), FT_LOAD_DEFAULT); CurrentDetail->Width = DOUBLE_FROM_26_6 (face->glyph->advance.x); CurrentDetail++; } gdip_cairo_ft_font_unlock_face(Font); GdipFree(ucs4); #ifdef DRAWSTRING_DEBUG printf("CalculateStringWidths: string >%s< translated into %d glyphs\n", utf8, NumOfGlyphs); #endif return NumOfGlyphs; }