X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem-start-text.cc;h=ece932bd766194ff9cfde580135e53bb3c99df6f;hb=401c5c91b9a33dccc472fd58700a8a9f7f6af8a3;hp=1e7399409a2672915ace755028d79fe97539e14d;hpb=afa40986a9697cdf1cdb499f641fc80046ebe465;p=lilypond.git diff --git a/lily/system-start-text.cc b/lily/system-start-text.cc index 1e7399409a..ece932bd76 100644 --- a/lily/system-start-text.cc +++ b/lily/system-start-text.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2008 Han-Wen Nienhuys */ @@ -13,12 +13,13 @@ #include "font-interface.hh" #include "spanner.hh" #include "stencil.hh" +#include "item.hh" class System_start_text { public: static Stencil get_stencil (Grob *); - static bool has_interface (Grob *); + DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); }; @@ -44,9 +45,25 @@ System_start_text::get_stencil (Grob *me_grob) SCM align_y = me_grob->get_property ("self-alignment-Y"); if (scm_is_number (align_y)) p->align_to (Y_AXIS, robust_scm2double (align_y, 0.0)); - return *p; + + /* Horizontal alignment according to the self-alignment-X property + * and indent value. */ + Output_def *layout = me_grob->layout (); + Real indent; + if (me->get_break_index () == 0) + indent = robust_scm2double (layout->c_variable ("indent"), 0); + else + indent = robust_scm2double (layout->c_variable ("short-indent"), 0); + Real align_x = robust_scm2double (me->get_property ("self-alignment-X"), 0); + Interval p_extent_x = p->extent (X_AXIS); + Interval padding (0.0, max (0.0, indent - p_extent_x.length ())); + Real right_padding = padding.length () - padding.linear_combination (align_x); + Box box (Interval (p_extent_x[LEFT], p_extent_x[RIGHT] + right_padding), + p->extent (Y_AXIS)); + Stencil *aligned_p = new Stencil (box, p->expr ()); + return *aligned_p; } - return Stencil(); + return Stencil (); } @@ -56,7 +73,24 @@ System_start_text::print (SCM smob) { Spanner *me = unsmob_spanner (smob); - extract_grob_set (me, "elements", elts); + if (!me->get_bound (LEFT)->break_status_dir ()) + { + me->suicide (); + return SCM_EOL; + } + + extract_grob_set (me, "elements", all_elts); + vector elts; + for (vsize i = 0; i < all_elts.size (); i++) + if (all_elts[i]->is_live ()) + elts.push_back (all_elts[i]); + + if (!elts.size ()) + { + me->suicide (); + return SCM_EOL; + } + Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); Interval ext; @@ -70,17 +104,18 @@ System_start_text::print (SCM smob) } Stencil m = get_stencil (me); - m.translate_axis (ext.center (), Y_AXIS); + if (!ext.is_empty ()) + m.translate_axis (ext.center (), Y_AXIS); return m.smobbed_copy (); } ADD_INTERFACE (System_start_text, - "system-start-text-interface", "Text in front of the system.", /* properties */ "text " "long-text " "self-alignment-Y " + "self-alignment-X " );