2 font-metric-scheme.cc -- implement Font_metric scheme bindings
4 source file of the GNU LilyPond music typesetter
6 (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "font-metric.hh"
11 #include "modified-font-metric.hh"
13 LY_DEFINE (ly_font_get_glyph, "ly:font-get-glyph",
16 "Return a Stencil from @var{font} for the glyph named @var{name}. "
17 "@var{font} must be available as an AFM file. If the glyph "
18 "is not available, return @code{#f}.")
20 Font_metric *fm = unsmob_metrics (font);
21 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
22 SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG2, __FUNCTION__, "string");
24 Stencil m = fm->find_by_name (ly_scm2string (name));
26 /* TODO: make optional argument for default if not found. */
27 return m.smobbed_copy ();
30 LY_DEFINE (ly_get_glyph, "ly:get-glyph",
32 (SCM font, SCM index),
33 "Retrieve a Stencil for the glyph numbered @var{index} "
36 Font_metric *fm = unsmob_metrics (font);
37 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
38 SCM_ASSERT_TYPE (scm_is_number (index), index, SCM_ARG2, __FUNCTION__, "number");
40 return fm->get_ascii_char_stencil (scm_to_int (index)).smobbed_copy ();
43 LY_DEFINE (ly_font_glyph_name_to_index, "ly:font-glyph-name-to-index",
46 "Return the index for @var{name} in @var{font}.")
48 Font_metric *fm = unsmob_metrics (font);
49 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
50 SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG2, __FUNCTION__, "string");
52 return scm_from_int (fm->name_to_index (ly_scm2string (name)));
55 LY_DEFINE (ly_font_index_to_charcode, "ly:font-index-to-charcode",
57 (SCM font, SCM index),
58 "Return the character code for @var{index} @var{font}.")
60 Font_metric *fm = unsmob_metrics (font);
61 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
62 SCM_ASSERT_TYPE (scm_is_integer (index), index, SCM_ARG2, __FUNCTION__, "index");
64 return scm_from_unsigned_integer (fm->index_to_charcode (scm_to_int (index)));
67 LY_DEFINE (ly_font_glyph_name_to_charcode, "ly:font-glyph-name-to-charcode",
70 "Return the character code for glyph @var{name} in @var{font}.")
72 Font_metric *fm = unsmob_metrics (font);
73 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
74 SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG2, __FUNCTION__, "string");
76 return scm_from_unsigned_integer (fm->index_to_charcode (fm->name_to_index (ly_scm2string (name))));
78 return scm_from_unsigned_integer (fm->glyph_name_to_charcode (ly_scm2string (name)));
82 LY_DEFINE (ly_text_dimension, "ly:text-dimension",
85 "Given the font metric in @var{font} and the string @var{text}, "
86 "compute the extents of that text in that font. "
87 "The return value is a pair of number-pairs.")
90 Modified_font_metric *fm = dynamic_cast<Modified_font_metric *>
91 (unsmob_metrics (font));
93 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "modified font metric");
94 SCM_ASSERT_TYPE (scm_is_string (text), text, SCM_ARG2, __FUNCTION__, "string");
95 Stencil stc (fm->text_stencil (ly_scm2string (text)));
96 return scm_cons (ly_interval2scm (stc.extent (X_AXIS)),
97 ly_interval2scm (stc.extent (Y_AXIS)));
100 LY_DEFINE (ly_font_file_name, "ly:font-file-name",
103 "Given the font metric @var{font}, "
104 "return the corresponding file name.")
106 Font_metric *fm = unsmob_metrics (font);
107 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
108 return fm->font_file_name ();
111 LY_DEFINE (ly_font_name, "ly:font-name",
114 "Given the font metric @var{font}, "
115 "return the corresponding name.")
117 Font_metric *fm = unsmob_metrics (font);
119 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
120 return scm_makfrom0str (fm->font_name ().to_str0 ());
123 LY_DEFINE (ly_font_magnification, "ly:font-magnification", 1, 0, 0,
125 "Given the font metric @var{font}, return the "
126 "magnification, relative to the current outputscale.")
128 Font_metric *fm = unsmob_metrics (font);
129 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
130 return scm_cdr (fm->description_);
133 LY_DEFINE (ly_font_design_size, "ly:font-design-size", 1, 0, 0,
135 "Given the font metric @var{font}, return the "
136 "design size, relative to the current outputscale.")
138 Font_metric *fm = unsmob_metrics (font);
139 SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
140 return scm_from_double (fm->design_size ());