]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dimension-cache.cc
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / lily / dimension-cache.cc
index be69da11157e7fadc12ca34cc2cb8e1f8a2e55fc..33294db5e62cd37c9a3253554b083f94f6b023de 100644 (file)
-/*   
-  dimension-cache.cc --  implement Dimension_cache
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
- */
-
-#include "dimension-cache.hh"
-#include "parray.hh"
-
-Dimension_cache::Dimension_cache (Dimension_cache const &d)
-{
-  init();
-  callback_l_ = d.callback_l_;
-  empty_b_ = d.empty_b_;
-  offset_ = d.offset_; //let's hope others will copy  the refpoint appropriately. 
-}
-
-Dimension_cache::Dimension_cache ()
-{
-  init();
-}
+/*
+  This file is part of LilyPond, the GNU music typesetter.
 
-void
-Dimension_cache::init()
-{
-  callback_l_ =0;
-  offset_ =0.0;
-  elt_l_ = 0;
-  dim_.set_empty ();
-  parent_l_ =0;
-  valid_b_ = false;
-  empty_b_ = false;
-}
+  Copyright (C) 1998--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-void
-Dimension_cache::invalidate ()
-{
-  valid_b_ = false;
-  invalidate_dependencies ();
-}
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-void
-Dimension_cache::invalidate_dependencies ()
-{
-  for (int i=0; i < dependencies_l_arr_.size (); i++)
-    {
-      Dimension_cache * g = dependencies_l_arr_[i];
-      if (g->valid_b_)
-       {
-         g->invalidate ();
-       }
-    }
-}
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
-void
-Dimension_cache::set_offset (Real x)
-{
-  invalidate_dependencies ();
-  offset_ = x;
-}
-
-void
-Dimension_cache::translate (Real x)
-{
-  invalidate_dependencies ();
-  offset_ += x;
-}
+#include "dimension-cache.hh"
 
+#include "warn.hh"
+#include "grob.hh"
 
-Real
-Dimension_cache::absolute_coordinate () const
+Dimension_cache::Dimension_cache (Dimension_cache const &d)
 {
-  Real r = offset_;
-  for (Dimension_cache * c = parent_l_;
-       c; c = c->parent_l_)
-    r += c->offset_;
-  return r;
+  init ();
+  offset_ = d.offset_ ? new Real (*d.offset_) : 0;
+  parent_ = d.parent_;
+  extent_ = d.extent_ ? new Interval (*d.extent_) : 0;
 }
 
-/*
-  what *should* these functions *do* anyway.
- */
-Real
-Dimension_cache::relative_coordinate (Dimension_cache *d) const
+Dimension_cache &
+Dimension_cache::operator = (Dimension_cache const &d)
 {
-  Real r =0.0;
-  if (d == this)               // UGH
-    return 0.0;
-
-  for (Dimension_cache* c = parent_l_;
-       c != d;
-       c = c->parent_l_)
-    r +=  c->offset_;
-  return r;
+  clear ();
+  offset_ = d.offset_ ? new Real (*d.offset_) : 0;
+  parent_ = d.parent_;
+  extent_ = d.extent_ ? new Interval (*d.extent_) : 0;
+  return *this;
 }
 
-Dimension_cache *
-Dimension_cache::common_group (Dimension_cache const* s) const
+Dimension_cache::Dimension_cache ()
 {
-  Link_array<Dimension_cache const> my_groups;
-  for (Dimension_cache const *c = this;
-       c ; c = c->parent_l_)
-    my_groups.push (c);
-  
-  
-  Dimension_cache const *common=0;
-  
-  for (Dimension_cache const * d = s;
-       !common && d;
-       d = d->parent_l_)
-    common = my_groups.find_l (d);
-
-  return (Dimension_cache*)common;
+  init ();
 }
 
-
-
-void
-Dimension_cache::set_empty (bool b)
-{
-  if (empty_b_ != b)
-    {
-      empty_b_ = b;
-      if (!empty_b_)
-       invalidate ();
-    }
-}  
-
 void
-Dimension_cache::set_dim (Interval v)
+Dimension_cache::init ()
 {
-  dim_ = v;
-  valid_b_ = true;
+  offset_ = 0;
+  extent_ = 0;
+  parent_ = 0;
 }
-  
 
-Interval
-Dimension_cache::get_dim () const
+Dimension_cache::~Dimension_cache ()
 {
-  Interval r;
-  if (empty_b_)
-    {
-      r.set_empty ();
-      return r;
-    }
-      
-  if (!valid_b_)
-    {
-      Dimension_cache *nc = ((Dimension_cache*)this);
-      nc->dim_= (*callback_l_ ) (nc);
-      nc->valid_b_ = true;
-    }
-
-  r=dim_;
-  if (!r.empty_b()) // float exception on DEC Alpha
-    r += offset_;
-
-  return r;
+  clear ();
 }
 
 void
-Dimension_cache::set_callback (Dim_cache_callback c)
-{
-  callback_l_ =c;
-}
-
-Real
-Dimension_cache::offset () const
+Dimension_cache::clear ()
 {
-  return offset_;
+  delete extent_;
+  delete offset_;
+  extent_ = 0;
+  offset_ = 0;
 }