Mats Bengtsson <matsb@s3.kth.se> (the ugly TeX parsing in text_dimension)
*/
+#include "font-metric.hh"
+
#include <math.h>
-#include <ctype.h>
+#include <cctype>
#include "modified-font-metric.hh"
+#include "open-type-font.hh"
+#include "stencil.hh"
#include "virtual-methods.hh"
#include "warn.hh"
-#include "stencil.hh"
+
#include "ly-smobs.icc"
-#include "font-metric.hh"
-#include "string.hh"
Real
Font_metric::design_size () const
Stencil
Font_metric::find_by_name (String s) const
{
+ s.substitute_char ('-', "M");
int idx = name_to_index (s);
Box b;
SCM expr = SCM_EOL;
if (idx >= 0)
{
- expr = scm_list_3 (ly_symbol2scm ("char"),
+ expr = scm_list_3 (ly_symbol2scm ("named-glyph"),
self_scm (),
- scm_int2num (index_to_ascii (idx)));
+ scm_makfrom0str (s.to_str0 ())
+ );
b = get_indexed_char (idx);
}
IMPLEMENT_TYPE_P (Font_metric, "ly:font-metric?");
-LY_DEFINE (ly_find_glyph_by_name, "ly:find-glyph-by-name",
+LY_DEFINE (ly_font_get_glyph, "ly:font-get-glyph",
2, 0, 0,
(SCM font, SCM name),
- "This function retrieves a Stencil for the glyph named @var{name} "
- "in "
- "@var{font}. "
- "The font must be available as an AFM file. If the glyph "
- "is not found, @code{#f} is returned. ")
+ "Return a Stencil from @var{font} for the glyph named @var{name}. "
+ "@var{font} must be available as an AFM file. If the glyph "
+ "is not available, return @code{#f}.")
{
Font_metric *fm = unsmob_metrics (font);
SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
return fm->get_ascii_char_stencil (scm_to_int (index)).smobbed_copy ();
}
-LY_DEFINE (ly_text_dimension,"ly:text-dimension",
+LY_DEFINE (ly_font_glyph_name_to_index, "ly:font-glyph-name-to-index",
+ 2, 0, 0,
+ (SCM font, SCM name),
+ "Return the index for @var{name} in @var{font}.")
+{
+ Font_metric *fm = unsmob_metrics (font);
+ SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
+ SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG2, __FUNCTION__, "string");
+
+ return scm_from_int (fm->name_to_index (ly_scm2string (name)));
+}
+
+LY_DEFINE (ly_font_index_to_charcode, "ly:font-index-to-charcode",
+ 2, 0, 0,
+ (SCM font, SCM index),
+ "Return the character code for @var{index} @var{font}.")
+{
+ Font_metric *fm = unsmob_metrics (font);
+ SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
+ SCM_ASSERT_TYPE (scm_is_integer (index), index, SCM_ARG2, __FUNCTION__, "index");
+
+ return scm_from_unsigned_integer (fm->index_to_charcode (scm_to_int (index)));
+}
+
+LY_DEFINE (ly_font_glyph_name_to_charcode, "ly:font-glyph-name-to-charcode",
+ 2, 0, 0,
+ (SCM font, SCM name),
+ "Return the character code for glyph @var{name} in @var{font}.")
+{
+ Font_metric *fm = unsmob_metrics (font);
+ SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
+ SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG2, __FUNCTION__, "string");
+#if 1
+ return scm_from_unsigned_integer (fm->index_to_charcode (fm->name_to_index (ly_scm2string (name))));
+#else
+ return scm_from_unsigned_integer (fm->glyph_name_to_charcode (ly_scm2string (name)));
+#endif
+}
+
+LY_DEFINE (ly_text_dimension, "ly:text-dimension",
2, 0, 0,
(SCM font, SCM text),
"Given the font metric in @var{font} and the string @var{text}, "
return scm_cons (ly_interval2scm (b[X_AXIS]), ly_interval2scm (b[Y_AXIS]));
}
-LY_DEFINE (ly_font_filename,"ly:font-filename",
+LY_DEFINE (ly_font_file_name, "ly:font-file-name",
1, 0, 0,
(SCM font),
"Given the font metric @var{font}, "
#include "afm.hh"
-LY_DEFINE (ly_font_name,"ly:font-name",
+LY_DEFINE (ly_font_name, "ly:font-name",
1, 0, 0,
(SCM font),
"Given the font metric @var{font}, "
SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
-
if (Modified_font_metric* mfm = dynamic_cast<Modified_font_metric*> (fm))
return ly_font_name (mfm->original_font ()->self_scm ());
else if (Adobe_font_metric* afm = dynamic_cast<Adobe_font_metric*> (fm))
- {
- return scm_makfrom0str (afm->font_info_->gfi->fontName);
- }
- else
- return SCM_BOOL_F;
+ return scm_makfrom0str (afm->font_info_->gfi->fontName);
+ return SCM_BOOL_F;
}
-
-
-LY_DEFINE (ly_font_magnification,"ly:font-magnification", 1 , 0, 0,
+LY_DEFINE (ly_font_magnification, "ly:font-magnification", 1, 0, 0,
(SCM font),
"Given the font metric @var{font}, return the "
"magnification, relative to the current outputscale.")
return scm_cdr (fm->description_);
}
-LY_DEFINE (ly_font_design_size,"ly:font-design-size", 1 , 0, 0,
+LY_DEFINE (ly_font_design_size, "ly:font-design-size", 1, 0, 0,
(SCM font),
"Given the font metric @var{font}, return the "
"design size, relative to the current outputscale.")
return i;
}
+unsigned
+Font_metric::index_to_charcode (int i) const
+{
+ return (unsigned) index_to_ascii (i);
+}
+
Stencil
Font_metric::get_ascii_char_stencil (int code) const
{
- SCM at = scm_list_3 (ly_symbol2scm ("char"),
- this->self_scm (),
+ SCM at = scm_list_3 (ly_symbol2scm ("char"), self_scm (),
scm_int2num (code));
Box b = get_ascii_char (code);
return Stencil (b, at);
Stencil
Font_metric::get_indexed_char_stencil (int code) const
{
- SCM at = scm_list_3 (ly_symbol2scm ("char"),
- self_scm (),
- scm_int2num (code));
+ int idx = index_to_ascii (code);
+ SCM at = scm_list_3 (ly_symbol2scm ("char"), self_scm (), scm_int2num (idx));
Box b = get_indexed_char (code);
return Stencil (b, at);
}
scm_int2num (code));
return scm_to_int (s);
}
+
+Offset
+Font_metric::attachment_point (String) const
+{
+ return Offset (0, 0);
+}
+
+SCM
+Font_metric::sub_fonts () const
+{
+ return SCM_EOL;
+}