]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/stencil.hh
Aligns horizontally-offset fingerings in a column if X distance is small (issue 3269)
[lilypond.git] / lily / include / stencil.hh
index 234681b7a798258b7da343540cd96ba19a4364a1..65c0b7a0f1e295e0523b3f035c4b7ad8fa8bdd30 100644 (file)
@@ -1,19 +1,29 @@
 /*
 /*
-  stencil.hh -- declare Stencil
+  This file is part of LilyPond, the GNU music typesetter.
 
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
-  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.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.
+
+  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.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 #ifndef STENCIL_HH
 #define STENCIL_HH
 
 */
 #ifndef STENCIL_HH
 #define STENCIL_HH
 
-#include <stdlib.h>            // size_t
+#include <cstdlib>              // size_t
+using namespace std;
+
 #include "lily-proto.hh"
 #include "box.hh"
 #include "lily-proto.hh"
 #include "box.hh"
-#include "axes.hh"
-#include "direction.hh"
-#include "lily-guile.hh"
 #include "smobs.hh"
 
 /** a group of individually translated symbols. You can add stencils
 #include "smobs.hh"
 
 /** a group of individually translated symbols. You can add stencils
 
     It is implemented as a "tree" of scheme expressions, as in
 
 
     It is implemented as a "tree" of scheme expressions, as in
 
-     Expr = combine Expr Expr
-              | translate Offset Expr
-             | SCHEME
-             ;
+    Expr = combine Expr-list
+    | translate Offset Expr
+    | origin (ORIGIN) Expr
+    | no-origin Expr
+    | (SCHEME)
+    ;
 
     SCHEME is a Scheme expression that --when eval'd-- produces the
 
     SCHEME is a Scheme expression that --when eval'd-- produces the
-    desired output.  
+    desired output.
 
 
+    Notes:
 
 
-    Because of the way that Stencil is implemented, it is the most
+    Because of the way that Stencil is implemented, it is the most
     efficient to add "fresh" stencils to what you're going to build.
     efficient to add "fresh" stencils to what you're going to build.
-    
-    Dimension behavior:
 
 
-    Empty stencils have empty dimensions.  If add_at_edge is used to
+    * Do not create Stencil objects on the heap. That includes passing
+    around Stencil* which are produced by unsmob_stencil(). Either
+    copy Stencil objects, or use SCM references.
+
+    * Empty stencils have empty dimensions.  If add_at_edge is used to
     init the stencil, we assume that
     init the stencil, we assume that
-    DIMENSIONS = (Interval (0,0),Interval (0,0)
+
+    DIMENSIONS = (Interval (0, 0), Interval (0, 0)
 */
 class Stencil
 {
 */
 class Stencil
 {
-  friend SCM ly_stencil_set_extent_x (SCM, SCM, SCM);
-
-  Offset origin_;
   Box dim_;
   SCM expr_;
   Box dim_;
   SCM expr_;
-  
-  DECLARE_SIMPLE_SMOBS (Stencil,);  
+
+  DECLARE_SIMPLE_SMOBS (Stencil);
 public:
   Stencil (Box, SCM s);
   Stencil ();
 public:
   Stencil (Box, SCM s);
   Stencil ();
-  
-  Offset origin () const;
-  SCM smobbed_copy () const;
-  SCM get_expr () const;
+
+  SCM expr () const;
 
   /**
 
   /**
-     Set dimensions to empty, or to (Interval (0,0),Interval (0,0) */
+     Set dimensions to empty, or to (Interval (0, 0), Interval (0, 0) */
   void set_empty (bool);
   void set_empty (bool);
-  Stencil moved_to_edge (Axis a, Direction d, const Stencil &m, Real padding,
-                        Real minimum) const;
-
-  void add_at_edge (Axis a, Direction d, const Stencil &m, Real padding,
-                   Real minimum);
+  void add_at_edge (Axis a, Direction d, const Stencil &m, Real padding);
   void add_stencil (Stencil const &m);
   void translate (Offset);
   void add_stencil (Stencil const &m);
   void translate (Offset);
+  Stencil translated (Offset) const;
+  void rotate (Real, Offset);
+  void rotate_degrees (Real, Offset);
+  void rotate_degrees_absolute (Real, Offset);
   void align_to (Axis a, Real x);
   void align_to (Axis a, Real x);
-  void translate_axis (Real,Axis);
-  
+  void translate_axis (Real, Axis);
+  void scale (Real, Real);
+
   Interval extent (Axis) const;
   Box extent_box () const;
   Interval extent (Axis) const;
   Box extent_box () const;
-  /**
-     codify THIS into a Scheme expression.
-   */
-  SCM create_scheme () const;
   bool is_empty () const;
   bool is_empty () const;
-
-
-  static SCM ly_get_stencil_extent (SCM mol, SCM axis);
-  static SCM ly_set_stencil_extent_x (SCM,SCM,SCM);
-  static SCM ly_stencil_combined_at_edge (SCM,SCM,SCM,SCM,SCM);
+  Stencil in_color (Real r, Real g, Real b) const;
+  static SCM skylines_from_stencil (SCM, Real, Axis);
 };
 
 };
 
+DECLARE_UNSMOB (Stencil, stencil);
 
 
-DECLARE_UNSMOB(Stencil,stencil);
-SCM fontify_atom (Font_metric const*, SCM atom);
-
-Stencil create_stencil (SCM print);
-
+void interpret_stencil_expression (SCM expr,
+                                   void (*func) (void *, SCM),
+                                   void *func_arg,
+                                   Offset o);
+SCM find_expression_fonts (SCM expr);
 
 
+void register_stencil_head (SCM symbol);
+bool is_stencil_head (SCM symbol);
+SCM all_stencil_heads ();
 
 
-#endif
+#endif /* STENCIL_HH */