]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4398/3: Move the protection of all_fonts_global to Protected_scm
authorDavid Kastrup <dak@gnu.org>
Thu, 14 May 2015 18:50:57 +0000 (20:50 +0200)
committerDavid Kastrup <dak@gnu.org>
Thu, 21 May 2015 18:29:54 +0000 (20:29 +0200)
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
lily/all-font-metrics.cc
lily/include/all-font-metrics.hh

index 738f3179b915edf23827f19cd6c372f26f448699..b29ea4bf4bfc48c885b72d7f7aefff50901752e6 100644 (file)
 
 #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;
 }
index bc8ba15dae43fcd93f8e81fe9bdfe4c15b4ca04d..31e8fbb619ed57b36f93ef91c32836e17588f61a 100644 (file)
@@ -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;
index 784a337afab3a7b54fef35afd59aaaf62a825136..88820ea363a6765bff0d34906b5313bd7c2bcd8e 100644 (file)
@@ -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<All_font_metrics>
 {
   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,