X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Ftext-item.cc;h=fef4babe23d08c088616013472c6e0a198affb5b;hb=11b3094461e045deafd0e2b1cef8c60f79e259a1;hp=1cc4105f69690eefebbd27a8273cc041a9e6e222;hpb=dc9082a408724f100eb54ec80fbb0c8d0decb898;p=lilypond.git diff --git a/lily/text-item.cc b/lily/text-item.cc index 1cc4105f69..fef4babe23 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -1,84 +1,87 @@ -/* +/* text-item.cc -- implement Text_item source file of the GNU LilyPond music typesetter + + (c) 1998--2003 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ +#include - (c) 1997--1998 Han-Wen Nienhuys -*/ - - -#include "musical-request.hh" -#include "paper-def.hh" +#include "warn.hh" +#include "grob.hh" #include "text-item.hh" -#include "stem.hh" -#include "molecule.hh" -#include "lookup.hh" -#include "debug.hh" - -Text_item::Text_item (General_script_def* tdef_l, Direction d) -{ - dir_ = d; - fat_b_ = false; - tdef_p_ = tdef_l->clone (); -} - -Text_item::~Text_item () -{ - delete tdef_p_; -} - -void -Text_item::do_pre_processing () -{ - if (!dir_) - dir_ = DOWN; -} +#include "font-interface.hh" +#include "virtual-font-metric.hh" +#include "paper-def.hh" -Real -Text_item::get_position_f () const +MAKE_SCHEME_CALLBACK(Text_item,interpret_markup,3); +SCM +Text_item::interpret_markup (SCM paper, SCM props, SCM markup) { - // uhuh, tdef/gdef? - if (Text_def *tdl = dynamic_cast(tdef_p_)) + if (gh_string_p (markup)) { - if (tdl->style_str_ != "finger") // HUHH? - return Staff_side::get_position_f (); + Paper_def *pap = unsmob_paper (paper); + Font_metric *fm = select_font (pap, props); + + SCM list = scm_list_n (ly_symbol2scm ("text"), markup, SCM_UNDEFINED); + + if (dynamic_cast (fm)) + { + /* + ARGH. + */ + programming_error ("Can't use virtual font for text."); + } + else + list = fontify_atom (fm, list); + + Box b = fm->text_dimension (ly_scm2string (markup)); + return Molecule (b, list).smobbed_copy(); } - - if (!dir_) + else if (gh_pair_p (markup)) { - warning (_ ("Text_item::get_position_f(): " - "somebody forgot to set my vertical direction, returning -20")); - return -20; + SCM func = gh_car (markup); + SCM args = gh_cdr (markup); + if (!markup_p (markup)) + programming_error ("Markup head has no markup signature."); + + return scm_apply_2 (func, paper, props, args); + } + else + { + return SCM_EOL; } - - Interval v = support_extent (); - // add no extra: fingers should be just above note, no? - return v[dir_]; } -Interval -Text_item::symbol_height () const +MAKE_SCHEME_CALLBACK(Text_item,brew_molecule,1); +SCM +Text_item::brew_molecule (SCM grob) { - return tdef_p_->get_atom (paper (), dir_).dim_.y (); -} + Grob * me = unsmob_grob (grob); -Molecule* -Text_item::brew_molecule_p () const -{ - Atom a (tdef_p_->get_atom (paper (), dir_)); - - if (!fat_b_) - a.dim_[X_AXIS] = Interval (0,0); - Molecule* mol_p = new Molecule (a); + SCM t = me->get_grob_property ("text"); + SCM chain = Font_interface::font_alist_chain (me); + return interpret_markup (me->get_paper ()->self_scm (), chain, t); +} - if (dir_<0) // should do something better anyway. - mol_p->translate_axis (mol_p->extent ().y ().left , Y_AXIS); - mol_p->translate_axis (coordinate_offset_f_, Y_AXIS); - // fine for one lyric, urg for lyric chord - mol_p->translate_axis (a.dim_.y ().length (), Y_AXIS); - return mol_p; +/* + Ugh. Duplicated from Scheme. + */ +bool +Text_item::markup_p (SCM x) +{ + return + gh_string_p (x) || + (gh_pair_p (x) + && SCM_BOOL_F != scm_object_property (gh_car (x), ly_symbol2scm ("markup-signature"))); } +ADD_INTERFACE (Text_item,"text-interface", + "A scheme markup text, see @ref{Markup functions}.", + "text baseline-skip word-space"); + +