static void get_font_details_from_pattern (FontConfigFont * font, FcPattern * pattern) { int index; int slant; int weight; int width; int spacing; FcChar8 * file; FcChar8 * family; FcChar8 * style; g_assert(FcInit()); g_assert(FcPatternGetString(pattern, FC_FILE, 0, &file) == FcResultMatch); font_config_font_set_filepath(font, (const gchar *) file); font_config_font_set_owner(font, get_file_owner((const gchar *) file)); g_assert(FcPatternGetString(pattern, FC_FAMILY, 0, &family) == FcResultMatch); font_config_font_set_family(font, (const gchar *) family); if (FcPatternGetInteger(pattern, FC_INDEX, 0, &index) != FcResultMatch) index = 0; font_config_font_set_index(font, index); if (FcPatternGetInteger(pattern, FC_SPACING, 0, &spacing) != FcResultMatch) spacing = FC_PROPORTIONAL; font_config_font_set_spacing(font, spacing); if (FcPatternGetInteger(pattern, FC_SLANT, 0, &slant) != FcResultMatch) slant = FC_SLANT_ROMAN; font_config_font_set_slant(font, slant); if (FcPatternGetInteger(pattern, FC_WEIGHT, 0, &weight) != FcResultMatch) weight = FC_WEIGHT_MEDIUM; font_config_font_set_weight(font, weight); if (FcPatternGetInteger(pattern, FC_WIDTH, 0, &width) != FcResultMatch) width = FC_WIDTH_NORMAL; font_config_font_set_width(font, width); if (FcPatternGetString (pattern, FC_STYLE, 0, &style) != FcResultMatch) { /* Use the same style Pango would if none is given */ if (weight <= FC_WEIGHT_MEDIUM) { if (slant == FC_SLANT_ROMAN) font_config_font_set_style(font, "Regular"); else font_config_font_set_style(font, "Italic"); } else { if (slant == FC_SLANT_ROMAN) font_config_font_set_style(font, "Bold"); else font_config_font_set_style(font, "Bold Italic"); } } else { font_config_font_set_style(font, (const gchar *) style); } PangoFontDescription * descr = pango_fc_font_description_from_pattern(pattern, FALSE); gchar * desc_string = pango_font_description_to_string(descr); font_config_font_set_description(font, desc_string); pango_font_description_free(descr); g_free0(desc_string); return; }
static void setPangoAttributes(const Font* font, const TextRun& run, PangoLayout* layout) { #if USE(FREETYPE) if (font->primaryFont()->platformData().m_pattern) { PangoFontDescription* desc = pango_fc_font_description_from_pattern(font->primaryFont()->platformData().m_pattern.get(), FALSE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); } #elif USE(PANGO) if (font->primaryFont()->platformData().m_font) { PangoFontDescription* desc = pango_font_describe(font->primaryFont()->platformData().m_font); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); } #endif pango_layout_set_auto_dir(layout, FALSE); PangoContext* pangoContext = pango_layout_get_context(layout); PangoDirection direction = run.rtl() ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; pango_context_set_base_dir(pangoContext, direction); PangoAttrList* list = pango_attr_list_new(); PangoAttribute* attr; attr = pango_attr_size_new_absolute(font->pixelSize() * PANGO_SCALE); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); if (!run.spacingDisabled()) { attr = pango_attr_letter_spacing_new(font->letterSpacing() * PANGO_SCALE); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); } // Pango does not yet support synthesising small caps // See http://bugs.webkit.org/show_bug.cgi?id=15610 pango_layout_set_attributes(layout, list); pango_attr_list_unref(list); }
static void gimp_font_list_load_names (GimpFontList *list, PangoFontMap *fontmap, PangoContext *context) { FcObjectSet *os; FcPattern *pat; FcFontSet *fontset; gint i; os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, FC_SLANT, FC_WEIGHT, FC_WIDTH, NULL); pat = FcPatternCreate (); fontset = FcFontList (NULL, pat, os); FcPatternDestroy (pat); FcObjectSetDestroy (os); for (i = 0; i < fontset->nfont; i++) { PangoFontDescription *desc; desc = pango_fc_font_description_from_pattern (fontset->fonts[i], FALSE); gimp_font_list_add_font (list, context, desc); pango_font_description_free (desc); } /* only create aliases if there is at least one font available */ if (fontset->nfont > 0) gimp_font_list_load_aliases (list, context); FcFontSetDestroy (fontset); }