diff --git a/app/core/meson.build b/app/core/meson.build index 36fead6b32..a7430dafc0 100644 --- a/app/core/meson.build +++ b/app/core/meson.build @@ -279,5 +279,6 @@ libappcore = static_library('appcore', math, dl, libunwind, + pango, ], ) diff --git a/app/pdb/fonts-cmds.c b/app/pdb/fonts-cmds.c index df27a74e77..a1378eace4 100644 --- a/app/pdb/fonts-cmds.c +++ b/app/pdb/fonts-cmds.c @@ -68,7 +68,7 @@ fonts_get_custom_configs_invoker (GimpProcedure *procedure, GimpValueArray *return_vals; gchar *config = NULL; gchar *sysconfig = NULL; - gchar *renaming_config = NULL; + gchar **renaming_config = NULL; gchar **dirs = NULL; if (! gimp_data_factory_data_wait (gimp->font_factory)) @@ -76,9 +76,10 @@ fonts_get_custom_configs_invoker (GimpProcedure *procedure, if (success) { - GList *list = gimp_font_factory_get_custom_fonts_dirs (GIMP_FONT_FACTORY (gimp->font_factory)); - guint length = g_list_length (list); - gint i; + GList *list = gimp_font_factory_get_custom_fonts_dirs (GIMP_FONT_FACTORY (gimp->font_factory)); + GSList *fonts_renaming_config = gimp_font_factory_get_fonts_renaming_config (GIMP_FONT_FACTORY (gimp->font_factory)); + guint length = g_list_length (list); + gint i; gimp_font_factory_get_custom_config_path (GIMP_FONT_FACTORY (gimp->font_factory), &config, @@ -86,14 +87,19 @@ fonts_get_custom_configs_invoker (GimpProcedure *procedure, config = g_strdup (config); sysconfig = g_strdup (sysconfig); - renaming_config = g_strdup (gimp_font_factory_get_fonts_renaming_config (GIMP_FONT_FACTORY (gimp->font_factory))); - dirs = g_new0 (gchar *, length + 1); for (i = 0; list; list = g_list_next (list), i++) dirs[i] = g_file_get_path (list->data); g_list_free_full (list, (GDestroyNotify) g_object_unref); + + length = g_slist_length (fonts_renaming_config); + + renaming_config = g_new0 (gchar *, length + 1); + + for (i = 0; fonts_renaming_config; fonts_renaming_config = g_slist_next (fonts_renaming_config), i++) + renaming_config[i] = g_strdup (fonts_renaming_config->data); } return_vals = gimp_procedure_get_return_values (procedure, success, @@ -103,7 +109,7 @@ fonts_get_custom_configs_invoker (GimpProcedure *procedure, { g_value_take_string (gimp_value_array_index (return_vals, 1), config); g_value_take_string (gimp_value_array_index (return_vals, 2), sysconfig); - g_value_take_string (gimp_value_array_index (return_vals, 3), renaming_config); + g_value_take_boxed (gimp_value_array_index (return_vals, 3), renaming_config); g_value_take_boxed (gimp_value_array_index (return_vals, 4), dirs); } @@ -195,12 +201,11 @@ register_fonts_procs (GimpPDB *pdb) NULL, GIMP_PARAM_READWRITE)); gimp_procedure_add_return_value (procedure, - gimp_param_spec_string ("renaming-config", - "renaming config", - "fonts renaming config", - FALSE, FALSE, FALSE, - NULL, - GIMP_PARAM_READWRITE)); + g_param_spec_boxed ("renaming-config", + "renaming config", + "fonts renaming config", + G_TYPE_STRV, + GIMP_PARAM_READWRITE)); gimp_procedure_add_return_value (procedure, g_param_spec_boxed ("dirs", "dirs", diff --git a/app/pdb/meson.build b/app/pdb/meson.build index 02a83d69d4..a02af884e1 100644 --- a/app/pdb/meson.build +++ b/app/pdb/meson.build @@ -83,7 +83,7 @@ libappinternalprocs = static_library('appinternalprocs', include_directories: [ rootInclude, rootAppInclude, ], c_args: '-DG_LOG_DOMAIN="Gimp-PDB"', dependencies: [ - cairo, gegl, gdk_pixbuf, pangocairo, + cairo, gegl, gdk_pixbuf, pangocairo, pango, ], sources: [ pdbgen diff --git a/app/text/gimpfont.c b/app/text/gimpfont.c index 2e509c0554..8400e1bc07 100644 --- a/app/text/gimpfont.c +++ b/app/text/gimpfont.c @@ -85,8 +85,6 @@ struct _GimpFont { GimpData parent_instance; - PangoContext *pango_context; - PangoLayout *popup_layout; gint popup_width; gint popup_height; @@ -112,17 +110,13 @@ struct _GimpFont struct _GimpFontClass { - GimpDataClass parent_class; + GimpDataClass parent_class; - GimpContainer *fonts_container; + GimpFontFactory *font_factory; }; static void gimp_font_finalize (GObject *object); -static void gimp_font_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); static void gimp_font_get_preview_size (GimpViewable *viewable, gint size, @@ -240,9 +234,9 @@ gimp_font_deserialize_create (GType type, gpointer data) { GimpFont *font = NULL; - GimpContainer *fonts_container = GIMP_FONT_CLASS (g_type_class_peek (GIMP_TYPE_FONT))->fonts_container; + GimpContainer *fonts_container; gint most_similar_font_index = -1; - gint font_count = gimp_container_get_n_children (fonts_container); + gint font_count; gint largest_similarity = 0; GList *similar_fonts = NULL; GList *iter; @@ -260,6 +254,8 @@ gimp_font_deserialize_create (GType type, guint scope_id; guint old_scope_id; + fonts_container = gimp_data_factory_get_container (GIMP_DATA_FACTORY (GIMP_FONT_CLASS (g_type_class_peek (GIMP_TYPE_FONT))->font_factory)); + font_count = gimp_container_get_n_children (fonts_container); /* This is for backward compatibility with older xcf files. * The font used to be serialized as a string containing * its name. @@ -540,7 +536,7 @@ gimp_font_class_set_font_factory (GimpFontFactory *factory) g_return_if_fail (GIMP_IS_FONT_FACTORY (factory)); - klass->fonts_container = gimp_data_factory_get_container (GIMP_DATA_FACTORY (factory)); + klass->font_factory = factory; } void @@ -596,7 +592,6 @@ gimp_font_class_init (GimpFontClass *klass) GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass); object_class->finalize = gimp_font_finalize; - object_class->set_property = gimp_font_set_property; gimp_object_class->get_memsize = gimp_font_get_memsize; viewable_class->get_preview_size = gimp_font_get_preview_size; @@ -604,12 +599,6 @@ gimp_font_class_init (GimpFontClass *klass) viewable_class->get_new_preview = gimp_font_get_new_preview; viewable_class->default_icon_name = "gtk-select-font"; - - g_object_class_install_property (object_class, PROP_PANGO_CONTEXT, - g_param_spec_object ("pango-context", - NULL, NULL, - PANGO_TYPE_CONTEXT, - GIMP_PARAM_WRITABLE)); } static void @@ -622,7 +611,6 @@ gimp_font_finalize (GObject *object) { GimpFont *font = GIMP_FONT (object); - g_clear_object (&font->pango_context); g_clear_object (&font->popup_layout); g_free (font->lookup_name); g_free (font->hash); @@ -637,28 +625,6 @@ gimp_font_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static void -gimp_font_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GimpFont *font = GIMP_FONT (object); - - switch (property_id) - { - case PROP_PANGO_CONTEXT: - if (font->pango_context) - g_object_unref (font->pango_context); - font->pango_context = g_value_dup_object (value); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - static gint64 gimp_font_get_memsize (GimpObject *object, gint64 *gui_size) @@ -701,12 +667,15 @@ gimp_font_get_popup_size (GimpViewable *viewable, gint *popup_height) { GimpFont *font = GIMP_FONT (viewable); + PangoContext *pango_context; PangoFontDescription *font_desc; PangoRectangle ink; PangoRectangle logical; const gchar *name; - if (! font->pango_context) + pango_context = gimp_font_factory_get_pango_context (GIMP_FONT_CLASS (g_type_class_peek (GIMP_TYPE_FONT))->font_factory); + + if (! pango_context) return FALSE; name = font->lookup_name; @@ -719,7 +688,7 @@ gimp_font_get_popup_size (GimpViewable *viewable, if (font->popup_layout) g_object_unref (font->popup_layout); - font->popup_layout = pango_layout_new (font->pango_context); + font->popup_layout = pango_layout_new (pango_context); pango_layout_set_font_description (font->popup_layout, font_desc); pango_font_description_free (font_desc); @@ -744,6 +713,7 @@ gimp_font_get_new_preview (GimpViewable *viewable, gint height) { GimpFont *font = GIMP_FONT (viewable); + PangoContext *pango_context; PangoLayout *layout; PangoRectangle ink; PangoRectangle logical; @@ -755,7 +725,9 @@ gimp_font_get_new_preview (GimpViewable *viewable, cairo_t *cr; cairo_surface_t *surface; - if (! font->pango_context) + pango_context = gimp_font_factory_get_pango_context (GIMP_FONT_CLASS (g_type_class_peek (GIMP_TYPE_FONT))->font_factory); + + if (! pango_context) return NULL; if (! font->popup_layout || @@ -774,11 +746,11 @@ gimp_font_get_new_preview (GimpViewable *viewable, pango_font_description_set_size (font_desc, PANGO_SCALE * height * 2.0 / 3.0); - layout = pango_layout_new (font->pango_context); + layout = pango_layout_new (pango_context); pango_layout_set_font_description (layout, font_desc); pango_layout_set_text (layout, - gimp_font_get_sample_string (font->pango_context, + gimp_font_get_sample_string (pango_context, font_desc), -1); @@ -1369,9 +1341,11 @@ gimp_font_get_hash (GimpFont *font) */ if (font->hash == NULL) { - PangoFontDescription *pfd = pango_font_description_from_string (font->lookup_name); - PangoFcFont *pango_font = PANGO_FC_FONT (pango_context_load_font (font->pango_context, pfd)); - GChecksum *checksum = g_checksum_new (G_CHECKSUM_SHA256); + PangoFontDescription *pfd = pango_font_description_from_string (font->lookup_name); + GimpFontFactory *font_factory = GIMP_FONT_CLASS (g_type_class_peek (GIMP_TYPE_FONT))->font_factory; + PangoContext *pango_context = gimp_font_factory_get_pango_context (font_factory); + PangoFcFont *pango_font = PANGO_FC_FONT (pango_context_load_font (pango_context, pfd)); + GChecksum *checksum = g_checksum_new (G_CHECKSUM_SHA256); gchar *file; hb_blob_t *hb_blob; guint length; diff --git a/app/text/gimpfontfactory.c b/app/text/gimpfontfactory.c index 3896f5619b..67d026cf14 100644 --- a/app/text/gimpfontfactory.c +++ b/app/text/gimpfontfactory.c @@ -55,7 +55,10 @@ struct _GimpFontFactoryPrivate { - gpointer foo; /* can't have an empty struct */ + GSList *fonts_renaming_config; + gchar *conf; + gchar *sysconf; + PangoContext *pango_context; }; #define GET_PRIVATE(obj) (((GimpFontFactory *) (obj))->priv) @@ -87,11 +90,10 @@ static void gimp_font_factory_recursive_add_fontdir (FcConfig *config, GFile *file, GError **error); -static void gimp_font_factory_load_names (GimpFontFactory *container, - PangoFontMap *fontmap, +static int gimp_font_factory_load_names (GimpFontFactory *container); +static void gimp_font_factory_load_aliases (GimpContainer *container, PangoContext *context); - G_DEFINE_TYPE_WITH_PRIVATE (GimpFontFactory, gimp_font_factory, GIMP_TYPE_DATA_FACTORY) @@ -207,9 +209,11 @@ gimp_font_factory_finalize (GObject *object) { GimpFontFactory *font_factory = GIMP_FONT_FACTORY(object); - g_free (font_factory->fonts_renaming_config); - g_free (font_factory->sysconf); - g_free (font_factory->conf); + g_slist_free_full (GET_PRIVATE (font_factory)->fonts_renaming_config, (GDestroyNotify) g_free); + g_free (GET_PRIVATE (font_factory)->sysconf); + g_free (GET_PRIVATE (font_factory)->conf); + g_object_unref (GET_PRIVATE (font_factory)->pango_context); + FcConfigDestroy (FcConfigGetCurrent ()); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -244,29 +248,35 @@ gimp_font_factory_get_custom_config_path (GimpFontFactory *factory, gchar **conf, gchar **sysconf) { - *conf = factory->conf; - *sysconf = factory->sysconf; + *conf = GET_PRIVATE (factory)->conf; + *sysconf = GET_PRIVATE (factory)->sysconf; } -gchar * +GSList * gimp_font_factory_get_fonts_renaming_config (GimpFontFactory *factory) { - return factory->fonts_renaming_config; + return (GET_PRIVATE (factory))->fonts_renaming_config; +} + +PangoContext * +gimp_font_factory_get_pango_context (GimpFontFactory *factory) +{ + return GET_PRIVATE (factory)->pango_context; } /* private functions */ static void -gimp_font_factory_load_async (GimpAsync *async, - FcConfig *config) +gimp_font_factory_load_async (GimpAsync *async, + GimpFontFactory *factory) { - if (FcConfigBuildFonts (config)) + if (FcConfigBuildFonts (NULL)) { - gimp_async_finish (async, config); + gimp_async_finish (async, GINT_TO_POINTER (gimp_font_factory_load_names (factory))); } else { - FcConfigDestroy (config); + FcConfigDestroy (FcConfigGetCurrent ()); gimp_async_abort (async); } @@ -288,12 +298,10 @@ gimp_font_factory_load_async_callback (GimpAsync *async, if (gimp_async_is_finished (async)) { - FcConfig *config = gimp_async_get_result (async); + gint num_fonts = GPOINTER_TO_INT (gimp_async_get_result (async)); PangoFontMap *fontmap; PangoContext *context; - FcConfigSetCurrent (config); - fontmap = pango_cairo_font_map_new_for_font_type (CAIRO_FONT_TYPE_FT); if (! fontmap) g_error ("You are using a Pango that has been built against a cairo " @@ -302,11 +310,12 @@ gimp_font_factory_load_async_callback (GimpAsync *async, pango_cairo_font_map_set_resolution (PANGO_CAIRO_FONT_MAP (fontmap), 72.0 /* FIXME */); context = pango_font_map_create_context (fontmap); + GET_PRIVATE (factory)->pango_context = context; g_object_unref (fontmap); - gimp_font_factory_load_names (factory, PANGO_FONT_MAP (fontmap), context); - g_object_unref (context); - FcConfigDestroy (config); + /* only create aliases if there is at least one font available */ + if (num_fonts > 0) + gimp_font_factory_load_aliases (container, context); } gimp_container_thaw (container); @@ -352,8 +361,8 @@ gimp_font_factory_load (GimpFontFactory *factory, } else { - g_free (factory->conf); - factory->conf = g_file_get_path (fonts_conf); + g_free (GET_PRIVATE (factory)->conf); + GET_PRIVATE (factory)->conf = g_file_get_path (fonts_conf); } g_object_unref (fonts_conf); @@ -366,8 +375,8 @@ gimp_font_factory_load (GimpFontFactory *factory, } else { - g_free (factory->sysconf); - factory->sysconf = g_file_get_path (fonts_conf); + g_free (GET_PRIVATE (factory)->sysconf); + GET_PRIVATE (factory)->sysconf = g_file_get_path (fonts_conf); } g_object_unref (fonts_conf); @@ -382,6 +391,7 @@ gimp_font_factory_load (GimpFontFactory *factory, gimp_font_factory_add_directories (factory, config, path, error); g_list_free_full (path, (GDestroyNotify) g_object_unref); + FcConfigSetCurrent (config); /* We perform font cache initialization in a separate thread, so * in the case a cache rebuild is to be done it will not block * the UI. @@ -389,7 +399,7 @@ gimp_font_factory_load (GimpFontFactory *factory, async = gimp_parallel_run_async_independent_full ( +10, (GimpRunAsyncFunc) gimp_font_factory_load_async, - config); + factory); gimp_async_add_callback_for_object ( async, @@ -591,7 +601,6 @@ gimp_font_factory_recursive_add_fontdir (FcConfig *config, static void gimp_font_factory_add_font (GimpContainer *container, - PangoContext *context, PangoFontDescription *desc, const gchar *full_name, const gchar *path, @@ -616,7 +625,6 @@ gimp_font_factory_add_font (GimpContainer *container, font = g_object_new (GIMP_TYPE_FONT, "name", name, - "pango-context", context, NULL); gimp_font_set_lookup_name (font, pango_font_description_to_string (desc)); @@ -717,7 +725,7 @@ gimp_font_factory_make_alias (GimpContainer *container, * are the best way to have differing text renders over time (and that's not * something to be wished for). XXX */ - gimp_font_factory_add_font (container, context, desc, NULL, NULL, font_info); + gimp_font_factory_add_font (container, desc, NULL, NULL, font_info); g_free (desc_str); pango_font_description_free (desc); @@ -743,10 +751,8 @@ gimp_font_factory_load_aliases (GimpContainer *container, } } -static void -gimp_font_factory_load_names (GimpFontFactory *factory, - PangoFontMap *fontmap, - PangoContext *context) +static gint +gimp_font_factory_load_names (GimpFontFactory *factory) { GimpContainer *container; FcObjectSet *os; @@ -761,6 +767,8 @@ gimp_font_factory_load_names (GimpFontFactory *factory, GString *ignored_fonts; gint n_ignored = 0; gint i; + gint num_fonts_in_current_config = 0; + gint n_loaded_fonts = 0; container = gimp_data_factory_get_container (GIMP_DATA_FACTORY (factory)); @@ -775,20 +783,20 @@ gimp_font_factory_load_names (GimpFontFactory *factory, FC_INDEX, FC_FONTVERSION, NULL); - g_return_if_fail (os); + g_return_val_if_fail (os, -1); pat = FcPatternCreate (); if (! pat) { FcObjectSetDestroy (os); g_critical ("%s: FcPatternCreate() returned NULL.", G_STRFUNC); - return; + return -1; } - if (FT_Init_FreeType(&ft)) + if (FT_Init_FreeType (&ft)) { - g_critical ("%s: FreeType Initialization Failed.", G_STRFUNC); - return -1; + g_critical ("%s: FreeType Initialization Failed.", G_STRFUNC); + return -1; } fontset = FcFontList (NULL, pat, os); @@ -796,7 +804,7 @@ gimp_font_factory_load_names (GimpFontFactory *factory, FcPatternDestroy (pat); FcObjectSetDestroy (os); - g_return_if_fail (fontset); + g_return_val_if_fail (fontset, -1); xml_configs_list = NULL; xml = g_string_new (NULL); @@ -805,6 +813,8 @@ gimp_font_factory_load_names (GimpFontFactory *factory, xml_bold_italic_variant_and_global = g_string_new (""); ignored_fonts = g_string_new (NULL); +#define MAX_NUM_FONTS_PER_CONFIG 1000 + for (i = 0; i < fontset->nfont; i++) { PangoFontDescription *pfd; @@ -836,7 +846,7 @@ gimp_font_factory_load_names (GimpFontFactory *factory, continue; } - if (FT_New_Face(ft, file, 0, &face)) + if (FT_New_Face (ft, file, 0, &face)) { g_string_append_printf (ignored_fonts, "- %s (Failed To Create A FreeType Face)\n", file); n_ignored++; @@ -852,8 +862,7 @@ gimp_font_factory_load_names (GimpFontFactory *factory, */ if (face->face_flags & FT_FACE_FLAG_SFNT) { - /* If this is an SFNT wrapper, try to sniff the SFNT tag which is the - * first 4 bytes, to see if it is a WOFF or WOFF2 wrapper. */ + /* If this is an SFNT wrapper, read the first 4 bytes to see if it is a WOFF[2] font. */ char buf[4] = {0}; int fd = g_open ((gchar *) file, O_RDONLY, 0); @@ -861,7 +870,7 @@ gimp_font_factory_load_names (GimpFontFactory *factory, g_close (fd, NULL); FT_Done_Face (face); - if (buf[0] == 'w' && buf[1] == 'O' && buf[2] == 'F') + if (buf[0] == 'w' && buf[1] == 'O' && buf[2] == 'F' && (buf[3] == 'F' || buf[3] == '2')) { g_string_append_printf (ignored_fonts, "- %s (WOFF[2] font)\n", file); n_ignored++; @@ -914,8 +923,31 @@ gimp_font_factory_load_names (GimpFontFactory *factory, newname = g_strdup_printf ("gimpfont%i", i); - xml = g_string_append (xml, ""); + if (num_fonts_in_current_config == MAX_NUM_FONTS_PER_CONFIG) + { + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml_italic_variant->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml_bold_variant->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, ""); + xml_configs_list = g_slist_append (xml_configs_list, xml_bold_italic_variant_and_global->str); + + FcConfigParseAndLoadFromMemory (FcConfigGetCurrent (), (const FcChar8 *) xml_bold_italic_variant_and_global->str, FcTrue); + + g_string_free (xml, TRUE); + g_string_free (xml_italic_variant, TRUE); + g_string_free (xml_bold_variant, TRUE); + g_string_free (xml_bold_italic_variant_and_global, FALSE); + + xml = g_string_new (NULL); + xml_italic_variant = g_string_new (NULL); + xml_bold_variant = g_string_new (NULL); + xml_bold_italic_variant_and_global = g_string_new (""); + + num_fonts_in_current_config = 0; + } + + xml = g_string_append (xml, ""); /*We can't use faux bold (sometimes real bold) unless it is specified in fontconfig*/ xml_bold_variant = g_string_append (xml_bold_variant, ""); xml_italic_variant = g_string_append (xml_italic_variant, ""); @@ -1072,34 +1104,43 @@ gimp_font_factory_load_names (GimpFontFactory *factory, if (display_name != NULL) { - gimp_font_factory_add_font (container, context, pfd, display_name, (const gchar *) file, font_info); + gimp_font_factory_add_font (container, pfd, display_name, (const gchar *) file, font_info); g_free (display_name); } else { - gimp_font_factory_add_font (container, context, pfd, fullname, (const gchar *) file, font_info); + gimp_font_factory_add_font (container, pfd, fullname, (const gchar *) file, font_info); } pango_font_description_free (pattern_pfd); g_free (pattern_pfd_desc); pango_font_description_free (pfd); g_free (newname); + num_fonts_in_current_config++; } - g_string_append (xml_bold_italic_variant_and_global, xml_italic_variant->str); - g_string_append (xml_bold_italic_variant_and_global, xml_bold_variant->str); - g_string_append (xml_bold_italic_variant_and_global, xml->str); - g_string_append (xml_bold_italic_variant_and_global, ""); +#undef MAX_NUM_FONTS_PER_CONFIG - g_free (factory->fonts_renaming_config); + if (num_fonts_in_current_config > 0) + { + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml_italic_variant->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml_bold_variant->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, xml->str); + xml_bold_italic_variant_and_global = g_string_append (xml_bold_italic_variant_and_global, ""); - FcConfigParseAndLoadFromMemory (FcConfigGetCurrent (), (const FcChar8 *) xml_bold_italic_variant_and_global->str, FcTrue); + xml_configs_list = g_slist_append (xml_configs_list, xml_bold_italic_variant_and_global->str); - factory->fonts_renaming_config = xml_bold_italic_variant_and_global->str; + FcConfigParseAndLoadFromMemory (FcConfigGetCurrent (), (const FcChar8 *) xml_bold_italic_variant_and_global->str, FcTrue); - /* only create aliases if there is at least one font available */ - if (fontset->nfont > 0) - gimp_font_factory_load_aliases (container, context); + g_string_free (xml, TRUE); + g_string_free (xml_italic_variant, TRUE); + g_string_free (xml_bold_variant, TRUE); + g_string_free (xml_bold_italic_variant_and_global, FALSE); + } + + g_slist_free_full (GET_PRIVATE (factory)->fonts_renaming_config, (GDestroyNotify) g_free); + + GET_PRIVATE (factory)->fonts_renaming_config = xml_configs_list; if (n_ignored > 0) { @@ -1111,11 +1152,11 @@ gimp_font_factory_load_names (GimpFontFactory *factory, #endif } + n_loaded_fonts = fontset->nfont - n_ignored; + g_string_free (ignored_fonts, TRUE); - g_string_free (xml, TRUE); - g_string_free (xml_italic_variant, TRUE); - g_string_free (xml_bold_variant, TRUE); - g_string_free (xml_bold_italic_variant_and_global, FALSE); - FT_Done_FreeType(ft); + FT_Done_FreeType (ft); FcFontSetDestroy (fontset); + + return n_loaded_fonts; } diff --git a/app/text/gimpfontfactory.h b/app/text/gimpfontfactory.h index b42df2ac4d..77a82ea79b 100644 --- a/app/text/gimpfontfactory.h +++ b/app/text/gimpfontfactory.h @@ -22,6 +22,7 @@ #define __GIMP_FONT_FACTORY_H__ +#include #include "core/gimpdatafactory.h" @@ -40,10 +41,6 @@ struct _GimpFontFactory { GimpDataFactory parent_instance; - gchar *fonts_renaming_config; - gchar *conf; - gchar *sysconf; - GimpFontFactoryPrivate *priv; }; @@ -61,7 +58,8 @@ GList * gimp_font_factory_get_custom_fonts_dirs (GimpFontFactory void gimp_font_factory_get_custom_config_path (GimpFontFactory *factory, gchar **conf, gchar **sysconf); -gchar * gimp_font_factory_get_fonts_renaming_config (GimpFontFactory *factory); +GSList * gimp_font_factory_get_fonts_renaming_config (GimpFontFactory *factory); +PangoContext * gimp_font_factory_get_pango_context (GimpFontFactory *factory); #endif /* __GIMP_FONT_FACTORY_H__ */ diff --git a/libgimp/gimpfont.c b/libgimp/gimpfont.c index b9a87fec6f..186a1a1c90 100644 --- a/libgimp/gimpfont.c +++ b/libgimp/gimpfont.c @@ -63,7 +63,7 @@ gimp_font_get_pango_font_description (GimpFont *font) { gchar *config; gchar *sysconfig; - gchar *fonts_renaming_config; + gchar **fonts_renaming_config; gchar **dirs; FcConfigSetCurrent (FcInitLoadConfig ()); @@ -82,11 +82,11 @@ gimp_font_get_pango_font_description (GimpFont *font) if (dirs[i]) FcConfigAppFontAddDir (FcConfigGetCurrent (), (const FcChar8 *)dirs[i]); - FcConfigParseAndLoadFromMemory (FcConfigGetCurrent (), - (const FcChar8 *) fonts_renaming_config, - FcTrue); + for (int i = 0; fonts_renaming_config[i] != NULL; ++i) + if (fonts_renaming_config[i]) + FcConfigParseAndLoadFromMemory (FcConfigGetCurrent (), (const FcChar8 *)fonts_renaming_config[i], FcTrue); - g_free (fonts_renaming_config); + g_strfreev (fonts_renaming_config); g_free (sysconfig); g_free (config); g_strfreev (dirs); diff --git a/libgimp/gimpfonts_pdb.c b/libgimp/gimpfonts_pdb.c index d959731a15..ebf8b4136e 100644 --- a/libgimp/gimpfonts_pdb.c +++ b/libgimp/gimpfonts_pdb.c @@ -72,7 +72,7 @@ gimp_fonts_refresh (void) /** * _gimp_fonts_get_custom_configs: * @sysconfig: (out) (transfer full): sysconfig path. - * @renaming_config: (out) (transfer full): fonts renaming config. + * @renaming_config: (out) (array zero-terminated=1) (transfer full): fonts renaming config. * @dirs: (out) (array zero-terminated=1) (transfer full): custom fonts directories. * * Retrieve custom configs. @@ -87,7 +87,7 @@ gimp_fonts_refresh (void) **/ gchar * _gimp_fonts_get_custom_configs (gchar **sysconfig, - gchar **renaming_config, + gchar ***renaming_config, gchar ***dirs) { GimpValueArray *args; @@ -106,7 +106,7 @@ _gimp_fonts_get_custom_configs (gchar **sysconfig, { config = GIMP_VALUES_DUP_STRING (return_vals, 1); *sysconfig = GIMP_VALUES_DUP_STRING (return_vals, 2); - *renaming_config = GIMP_VALUES_DUP_STRING (return_vals, 3); + *renaming_config = GIMP_VALUES_DUP_STRV (return_vals, 3); *dirs = GIMP_VALUES_DUP_STRV (return_vals, 4); } diff --git a/libgimp/gimpfonts_pdb.h b/libgimp/gimpfonts_pdb.h index 2e3ccb20ad..5496525bf3 100644 --- a/libgimp/gimpfonts_pdb.h +++ b/libgimp/gimpfonts_pdb.h @@ -34,7 +34,7 @@ G_BEGIN_DECLS gboolean gimp_fonts_refresh (void); G_GNUC_INTERNAL gchar* _gimp_fonts_get_custom_configs (gchar **sysconfig, - gchar **renaming_config, + gchar ***renaming_config, gchar ***dirs); GimpFont** gimp_fonts_get_list (const gchar *filter); diff --git a/pdb/groups/fonts.pdb b/pdb/groups/fonts.pdb index a0c0487a45..57bdfe29b7 100644 --- a/pdb/groups/fonts.pdb +++ b/pdb/groups/fonts.pdb @@ -137,7 +137,7 @@ HELP desc => 'config path' }, { name => 'sysconfig', type => 'string', desc => 'sysconfig path' }, - { name => 'renaming_config', type => 'string', + { name => 'renaming_config', type => 'strv', desc => 'fonts renaming config' }, { name => 'dirs', type => 'strv', desc => 'custom fonts directories' } @@ -152,9 +152,10 @@ HELP if (success) { - GList *list = gimp_font_factory_get_custom_fonts_dirs (GIMP_FONT_FACTORY (gimp->font_factory)); - guint length = g_list_length (list); - gint i; + GList *list = gimp_font_factory_get_custom_fonts_dirs (GIMP_FONT_FACTORY (gimp->font_factory)); + GSList *fonts_renaming_config = gimp_font_factory_get_fonts_renaming_config (GIMP_FONT_FACTORY (gimp->font_factory)); + guint length = g_list_length (list); + gint i; gimp_font_factory_get_custom_config_path (GIMP_FONT_FACTORY (gimp->font_factory), @@ -163,14 +164,19 @@ HELP config = g_strdup (config); sysconfig = g_strdup (sysconfig); - renaming_config = g_strdup (gimp_font_factory_get_fonts_renaming_config (GIMP_FONT_FACTORY (gimp->font_factory))); - dirs = g_new0 (gchar *, length + 1); for (i = 0; list; list = g_list_next (list), i++) dirs[i] = g_file_get_path (list->data); g_list_free_full (list, (GDestroyNotify) g_object_unref); + + length = g_slist_length (fonts_renaming_config); + + renaming_config = g_new0 (gchar *, length + 1); + + for (i = 0; fonts_renaming_config; fonts_renaming_config = g_slist_next (fonts_renaming_config), i++) + renaming_config[i] = g_strdup (fonts_renaming_config->data); } } CODE