From 68926767412d644f03b3200058baca5d8c929991 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Thu, 14 May 2015 20:50:57 +0200 Subject: [PATCH] Issue 4398/3: Move the protection of all_fonts_global to Protected_scm Previously, this abused the protect/unprotect mechanism only intended for temporary protection. Also turns All_font_metrics into a Scheme Smob. --- lily/all-font-metrics-scheme.cc | 6 +++++- lily/all-font-metrics.cc | 24 ++++++++++++++++-------- lily/include/all-font-metrics.hh | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lily/all-font-metrics-scheme.cc b/lily/all-font-metrics-scheme.cc index 738f3179b9..b29ea4bf4b 100644 --- a/lily/all-font-metrics-scheme.cc +++ b/lily/all-font-metrics-scheme.cc @@ -20,13 +20,17 @@ #include "all-font-metrics.hh" #include "main.hh" +#include "protected-scm.hh" + +All_font_metrics *all_fonts_global = 0; +Protected_scm all_fonts_global_scm; LY_DEFINE (ly_reset_all_fonts, "ly:reset-all-fonts", 0, 0, 0, (), "Forget all about previously loaded fonts.") { - delete all_fonts_global; all_fonts_global = new All_font_metrics (global_path.to_string ()); + all_fonts_global_scm = all_fonts_global->unprotect (); return SCM_UNSPECIFIED; } diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index bc8ba15dae..31e8fbb619 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -42,9 +42,16 @@ All_font_metrics::get_index_to_charcode_map (const string &filename, All_font_metrics::All_font_metrics (const string &path) { +#if HAVE_PANGO_FT2 + pango_dict_ = new Scheme_hash_table; +#endif + otf_dict_ = new Scheme_hash_table; + smobify_self (); + otf_dict_->unprotect (); #if HAVE_PANGO_FT2 + pango_dict_->unprotect (); PangoFontMap *pfm = pango_ft2_font_map_new (); pango_ft2_fontmap_ = PANGO_FT2_FONT_MAP (pfm); @@ -52,8 +59,6 @@ All_font_metrics::All_font_metrics (const string &path) pango_dpi_ = PANGO_RESOLUTION; pango_ft2_font_map_set_resolution (pango_ft2_fontmap_, pango_dpi_, pango_dpi_); - - pango_dict_ = new Scheme_hash_table; #endif search_path_.parse_path (path); @@ -61,16 +66,21 @@ All_font_metrics::All_font_metrics (const string &path) All_font_metrics::~All_font_metrics () { - otf_dict_->unprotect (); - #if HAVE_PANGO_FT2 - pango_dict_->unprotect (); g_object_unref (pango_ft2_fontmap_); #endif } -All_font_metrics::All_font_metrics (All_font_metrics const &) +SCM +All_font_metrics::mark_smob () { +#if HAVE_PANGO_FT2 + if (pango_dict_) + scm_gc_mark (pango_dict_->self_scm ()); +#endif + if (otf_dict_) + return otf_dict_->self_scm (); + return SCM_UNDEFINED; } #if HAVE_PANGO_FT2 @@ -151,5 +161,3 @@ All_font_metrics::find_font (const string &name) return f; } - -All_font_metrics *all_fonts_global; diff --git a/lily/include/all-font-metrics.hh b/lily/include/all-font-metrics.hh index 784a337afa..88820ea363 100644 --- a/lily/include/all-font-metrics.hh +++ b/lily/include/all-font-metrics.hh @@ -33,7 +33,7 @@ Interface to all fonts (both system fonts and fonts loaded via Pango). */ -class All_font_metrics +class All_font_metrics : public Smob { Scheme_hash_table *otf_dict_; File_path search_path_; @@ -48,6 +48,7 @@ class All_font_metrics All_font_metrics (All_font_metrics const &); public: + SCM mark_smob (); Index_to_charcode_map const *get_index_to_charcode_map (const string &filename, int face_index, -- 2.39.5