]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 1.2.12.jcn2
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 10 Oct 1999 15:19:11 +0000 (17:19 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 10 Oct 1999 15:19:11 +0000 (17:19 +0200)
pl 12.jcn2
- smobs

CHANGES
VERSION
lily/engraver.cc
lily/include/score-element.hh
lily/lily-guile.cc
lily/paper-score.cc
lily/score-element.cc

diff --git a/CHANGES b/CHANGES
index 4c8deed900a2ead5f88e78cc20180dc9c4ed45e0..8d88e61cef91933a008bd46a33eb449ea1782c8a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+pl 12.jcn2
+       - smobs
+
+
 pl 12.jcn1
        - auto-knees, input/test/auto-knee.ly
 
diff --git a/VERSION b/VERSION
index b14be88b798233f3dd0c0c5e285eff18e7b3aeb4..23ddbdd17ee37dad44ed82740f5aacd47800d51c 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=2
 PATCH_LEVEL=12
-MY_PATCH_LEVEL=jcn1
+MY_PATCH_LEVEL=jcn2
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index f8ed5e5d6a726911dbba088648edcfef6f26f70f..d5e82fd1a4d685b501ad8a7799e5f725c742090f 100644 (file)
@@ -12,6 +12,7 @@
 #include "engraver-group-engraver.hh"
 #include "debug.hh"
 #include "paper-def.hh"
+#include "score-element.hh"
 
 void
 Engraver::fill_staff_info (Staff_info&)
@@ -23,6 +24,12 @@ void
 Engraver::announce_element (Score_element_info i)
 {
   i.origin_trans_l_arr_.push (this);
+  Score_element *s  = i.elem_l_;
+  if (s->self_scm_ == SCM_EOL)
+    {
+      scm_protect_object (s->smobify_self ());
+    }
+  
   daddy_grav_l()->announce_element (i);
 }
 
index af9b484faa5f19e137d0223565779be05721d9ef..69ac3526fdadf3c19bcd3e76e5fa9b860f689f29 100644 (file)
@@ -144,6 +144,14 @@ protected:
   virtual Link_array<Score_element> get_extra_dependencies () const;
 
   static Interval dim_cache_callback (Dimension_cache*);
+public:
+  SCM smobify_self ();
+  static SCM mark_smob (SCM);
+  static scm_sizet free_smob (SCM s);
+  static int print_smob (SCM s, SCM p, scm_print_state*);
+  static long smob_tag;
+  static void init_smobs();
+  SCM self_scm_;
 };
 
 
index b2017c27af3de9817b19fb7d86c22db0a54fa0fc..311397cdd857a66669592b0a828b0928a4a4b218 100644 (file)
@@ -169,10 +169,13 @@ init_functions ()
 }
 
 extern void init_symbols ();
+extern void init_smobs ();     // guh -> .hh
+
 
 void
 init_lily_guile ()
 {
   init_symbols();
   init_functions ();
+  init_smobs ();
 }
index 5de1ecf8cbb980a7bcb3ee44506579a5d356b905..8769502ec9a581cc74526a68f9a875edad07cc3f 100644 (file)
@@ -57,9 +57,10 @@ Paper_score::typeset_element (Score_element * elem_p)
   elem_p->pscore_l_ = this;
 
   // take over protection.
-  SCM_CDR(protected_scms_) = gh_cons (elem_p->element_property_alist_,
+  assert (elem_p->self_scm_ != SCM_EOL);
+  SCM_CDR(protected_scms_) = gh_cons (elem_p->self_scm_,
                                      SCM_CDR (protected_scms_));
-  scm_unprotect_object (elem_p->element_property_alist_);
+  scm_unprotect_object (elem_p->self_scm_);
   
   SCM p =  elem_p->remove_elt_property (break_helper_only_scm_sym);
   if (p != SCM_BOOL_F)
index bdb4f4bd3067cb7228dad3c3453066ba30e6394d..5f7c890e76597a431dcc517566b11f032b636cb7 100644 (file)
@@ -44,6 +44,7 @@ Score_element::Score_element()
   pscore_l_=0;
   lookup_l_ =0;
   status_i_ = 0;
+  self_scm_ = SCM_EOL;
   original_l_ = 0;
   element_property_alist_ = scm_protect_object (gh_cons (gh_cons (void_scm_sym, SCM_BOOL_T) , SCM_EOL));
 }
@@ -51,6 +52,7 @@ Score_element::Score_element()
 Score_element::Score_element (Score_element const&s)
   : Graphical_element (s)
 {
+  self_scm_ = SCM_EOL;
   used_b_ = true;
   original_l_ =(Score_element*) &s;
   element_property_alist_ = scm_protect_object (scm_list_copy (s.element_property_alist_));
@@ -424,3 +426,60 @@ Score_element::find_broken_piece (Line_of_score*) const
 {
   return 0;
 }
+
+static scm_smobfuns score_elt_funs = {
+ Score_element::mark_smob, Score_element::free_smob,
+ Score_element::print_smob, 0,
+};
+
+
+SCM
+Score_element::smobify_self ()
+{
+  if (self_scm_ != SCM_EOL)
+    return self_scm_;
+  
+  SCM s;
+  SCM_NEWCELL(s);
+  SCM_SETCAR(s,smob_tag);
+  SCM_SETCDR(s,this);
+  self_scm_ = s;
+  scm_unprotect_object (element_property_alist_); // ugh
+  return s;
+}
+
+SCM
+Score_element::mark_smob (SCM ses)
+{
+  Score_element * s = (Score_element*) SCM_CDR(ses);
+  scm_gc_mark (s->self_scm_);
+  return s->element_property_alist_;
+}
+
+scm_sizet
+Score_element::free_smob (SCM ses)
+{
+  Score_element * s = (Score_element*) SCM_CDR(ses);
+  delete s;
+  return 0;
+}
+
+int
+Score_element::print_smob (SCM s, SCM p, scm_print_state *)
+{
+  return 0;
+}
+
+long Score_element::smob_tag;
+
+void
+Score_element::init_smobs ()
+{
+  smob_tag = scm_newsmob (&score_elt_funs);
+}
+
+void
+init_smobs()
+{
+  Score_element::init_smobs ();
+}