X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftext-item.cc;h=f45b66e068b14e2c229e8552530cf80692a7de65;hb=402045837e7134cdf90d1fcf31768c62227a4936;hp=dda7728f25c8fbb40a1b47474bd6fd02066208f9;hpb=5a9cd72634e721d75ea49f8985a3b34adf8fe8ff;p=lilypond.git diff --git a/lily/text-item.cc b/lily/text-item.cc index dda7728f25..f45b66e068 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -3,196 +3,85 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2000 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys Jan Nieuwenhuizen */ +#include -#include "debug.hh" +#include "warn.hh" +#include "grob.hh" #include "text-item.hh" +#include "font-interface.hh" +#include "virtual-font-metric.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 - - - Properties: - - * Font: - ---* Type: - ------* Series: medium, bold - ------* Shape: upright, italic, slanted - ------* Family: roman, music, orator, typewriter - - ---* 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 (gh_string_p (markup)) { - if (!gh_pair_p (gh_car (text)) && gh_string_p (gh_car (text))) - return string2molecule (me, gh_car (text), properties); + 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 - return markup_sentence2molecule (me, text, properties); - } - return Molecule (); -} + list = fontify_atom (fm, list); -Molecule -Text_item::string2molecule (Score_element *me, SCM text, SCM properties) -{ - SCM style = scm_assoc (ly_symbol2scm ("font-style"), properties); - SCM paper = me->get_elt_property ("style-sheet"); - SCM font_name; - if (gh_pair_p (style)) - { - SCM f = me->get_elt_property ("style-to-font-name"); - font_name = gh_call2 (f, paper, gh_cdr (style)); + Box b = fm->text_dimension (ly_scm2string (markup)); + return Stencil (b, list).smobbed_copy(); } - else + else if (gh_pair_p (markup)) { - SCM f = me->get_elt_property ("properties-to-font-name"); - font_name = gh_call2 (f, paper, properties); + 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); } - - // should move fallback to scm - if (!gh_string_p (font_name)) - font_name = ly_str02scm ("cmr10"); - - SCM lookup = scm_assoc (ly_symbol2scm ("lookup"), properties); - - Molecule mol; - if (gh_pair_p (lookup) && ly_symbol2string (gh_cdr (lookup)) == "name") - mol = lookup_character (me, font_name, text); else - mol = lookup_text (me, font_name, text); - - return mol; -} - -/* - caching / use some form of Lookup without 'paper'? -*/ -Molecule -Text_item::lookup_character (Score_element *me, SCM font_name, SCM char_name) -{ - Adobe_font_metric *afm = all_fonts_global_p->find_afm (ly_scm2string (font_name)); - - if (!afm) { - warning (_f ("can't find font: `%s'", ly_scm2string (font_name))); - warning (_f ("(search path: `%s')", global_path.str ().ch_C())); - error (_ ("Aborting")); + return SCM_EOL; } - - AFM_CharMetricInfo const *metric = - afm->find_char_metric (ly_scm2string (char_name), true); - - if (!metric) - { - Molecule m; - m.set_empty (false); - return m; - } - - SCM list = gh_list (ly_symbol2scm ("char"), - gh_int2scm (metric->code), - SCM_UNDEFINED); - - list = fontify_atom (afm, list); - return Molecule (afm_bbox_to_box (metric->charBBox), list); } -Molecule -Text_item::lookup_text (Score_element *me, SCM font_name, SCM text) +MAKE_SCHEME_CALLBACK(Text_item,print,1); +SCM +Text_item::print (SCM grob) { - SCM magnification = me->get_elt_property ("font-magnification"); - Font_metric* metric = 0; - if (gh_number_p (magnification)) - metric = all_fonts_global_p->find_scaled (ly_scm2string (font_name), - gh_scm2int (magnification)); - else - metric = all_fonts_global_p->find_font (ly_scm2string (font_name)); - - SCM list = gh_list (ly_symbol2scm ("text"), text, SCM_UNDEFINED); - list = fontify_atom (metric, list); + Grob * me = unsmob_grob (grob); - return Molecule (metric->text_dimension (ly_scm2string (text)), list); + 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); } -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 + gh_string_p (x) || + (gh_pair_p (x) + && SCM_BOOL_F != scm_object_property (gh_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{Markup functions}.", + "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 (); -}