X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftext-item.cc;h=b03027b965ea9304bdc755dc5468d2aa8eb539db;hb=664070d837cc4855091455892cb942cdcedeef0c;hp=7d242ed48e915406151a1b177de34baad9adb353;hpb=c26d3ace597521dcc473ae70d9a058f6783d2c88;p=lilypond.git diff --git a/lily/text-item.cc b/lily/text-item.cc index 7d242ed48e..b03027b965 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -3,138 +3,99 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2000 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys Jan Nieuwenhuizen */ +#include +#include "warn.hh" +#include "grob.hh" #include "text-item.hh" -#include "paper-def.hh" -#include "lookup.hh" -#include "staff-symbol-referencer.hh" -#include "staff-symbol-referencer.hh" -#include "main.hh" -#include "all-font-metrics.hh" -#include "afm.hh" - -/* - text: string | (markup sentence) - markup: markup-symbol | (markup-symbol . parameter) - sentence: text | sentence text +#include "font-interface.hh" +#include "virtual-font-metric.hh" +#include "output-def.hh" +#include "scaled-font-metric.hh" + +MAKE_SCHEME_CALLBACK (Text_item, interpret_string, 4) +SCM +Text_item::interpret_string (SCM paper, SCM props, SCM encoding, SCM markup) +{ + Output_def *pap = unsmob_output_def (paper); + SCM_ASSERT_TYPE(pap, paper, SCM_ARG1, __FUNCTION__, "Paper definition"); + SCM_ASSERT_TYPE(ly_c_string_p (markup), markup, SCM_ARG3, __FUNCTION__, "string"); + SCM_ASSERT_TYPE(encoding == SCM_EOL + || ly_c_symbol_p (encoding), encoding, SCM_ARG2, __FUNCTION__, "symbol"); + + String str = ly_scm2string (markup); + Font_metric *fm = select_encoded_font (pap, props, encoding); - Properties: - - * Font: - ---* Type: - ------* Series: medium, bold - ------* Shape: upright, italic, slanted - ------* Family: roman, music, orator, typewriter + SCM lst = SCM_EOL; + Box b; + if (Modified_font_metric* mf = dynamic_cast (fm)) + { + lst = scm_list_3 (ly_symbol2scm ("text"), + mf->self_scm (), + markup); + + b = mf->text_dimension (str); + } + else + { + /* ARGH. */ + programming_error ("Must have Modified_font_metric for text."); + } + + return Stencil (b, lst).smobbed_copy (); +} - ---* Size: - ------* size: ...,-2,-1,0,1,2,... (style-sheet -> cmrXX, fetaXX) - ------* points: 11,13,16,20,23,26 (for feta) - ------* magnification: UNSIGNED - * Typesetting: - ---* kern: INT (staff-space) - ---* align: horizontal/vertical / lines / rows - */ -Molecule -Text_item::text2molecule (Score_element *me, SCM text, SCM properties) +MAKE_SCHEME_CALLBACK (Text_item, interpret_markup, 3) +SCM +Text_item::interpret_markup (SCM paper, SCM props, SCM markup) { - if (gh_string_p (text)) - return string2molecule (me, text, properties); - else if (gh_list_p (text)) + if (ly_c_string_p (markup)) + return interpret_string (paper, props, SCM_EOL, markup); + else if (ly_c_pair_p (markup)) { - if (!gh_pair_p (gh_car (text)) && gh_string_p (gh_car (text))) - return string2molecule (me, gh_car (text), properties); - else - return markup_sentence2molecule (me, text, properties); + SCM func = ly_car (markup); + SCM args = ly_cdr (markup); + if (!markup_p (markup)) + programming_error ("Markup head has no markup signature."); + + return scm_apply_2 (func, paper, props, args); } - return Molecule (); + return SCM_EOL; } -Molecule -Text_item::string2molecule (Score_element *me, SCM text, SCM properties) +MAKE_SCHEME_CALLBACK (Text_item,print,1); +SCM +Text_item::print (SCM grob) { - SCM f = me->get_elt_property ("get-font-name"); - SCM style = me->get_elt_property ("style-sheet"); - SCM font_name = gh_call2 (f, style, properties); - String font_str = "roman"; - if (gh_string_p (font_name)) - font_str = ly_scm2string (font_name); - - SCM magnification = me->get_elt_property ("font-magnification"); - - Font_metric* metric_l = 0; - if (gh_number_p (magnification)) - metric_l = all_fonts_global_p->find_scaled (font_str, - gh_scm2int (magnification)); - else - metric_l = all_fonts_global_p->find_font (font_str); - - SCM list = gh_list (ly_symbol2scm ("text"), text, SCM_UNDEFINED); - list = fontify_atom (metric_l, list); - - return Molecule (metric_l->text_dimension (ly_scm2string (text)), list); + Grob *me = unsmob_grob (grob); + + SCM t = me->get_property ("text"); + SCM chain = Font_interface::text_font_alist_chain (me); + return interpret_markup (me->get_paper ()->self_scm (), chain, t); } -Molecule -Text_item::markup_sentence2molecule (Score_element *me, SCM markup_sentence, - SCM properties) + +/* + Ugh. Duplicated from Scheme. + */ +bool +Text_item::markup_p (SCM x) { - SCM markup = gh_car (markup_sentence); - SCM sentence = gh_cdr (markup_sentence); - SCM f = me->get_elt_property ("markup-to-properties"); - - SCM p = gh_cons (gh_call1 (f, markup), properties); + return + ly_c_string_p (x) || + (ly_c_pair_p (x) + && SCM_BOOL_F != scm_object_property (ly_car (x), ly_symbol2scm ("markup-signature"))); +} - Axis align = X_AXIS; - SCM a = scm_assoc (ly_symbol2scm ("align"), p); - if (gh_pair_p (a) && gh_number_p (gh_cdr (a))) - align = (Axis)gh_scm2int (gh_cdr (a)); +ADD_INTERFACE (Text_item,"text-interface", + "A scheme markup text, see @usermanref{Text-markup}.", + "text baseline-skip word-space"); - Molecule mol; - while (gh_pair_p (sentence)) - { - Molecule m = text2molecule (me, gh_car (sentence), p); - if (!m.empty_b ()) - mol.add_at_edge (align, align == X_AXIS ? RIGHT : DOWN, m, 0); - sentence = gh_cdr (sentence); - } - return mol; -} -MAKE_SCHEME_CALLBACK (Text_item, brew_molecule, 1); -SCM -Text_item::brew_molecule (SCM smob) -{ - Score_element *me = unsmob_element (smob); - - SCM text = me->get_elt_property ("scm-text"); - Molecule mol; - if (text == SCM_EOL) - { - SCM style = me->get_elt_property ("style"); - String st = gh_string_p (style) ? ly_scm2string (style) : ""; - SCM text = me->get_elt_property ("text"); - String t = gh_string_p (text) ? ly_scm2string (text) : ""; - - mol = me->paper_l ()->lookup_l (0)->text (st, t, me->paper_l ()); - } - else - mol = text2molecule (me, text, - gh_append2 (me->immutable_property_alist_, - me->mutable_property_alist_)); - SCM space = me->get_elt_property ("word-space"); - if (gh_number_p (space)) - { - Molecule m; - m.set_empty (false); - mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (space) - * Staff_symbol_referencer::staff_space (me)); - } - return mol.create_scheme (); -}