source file of the GNU LilyPond music typesetter
- (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1999--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-
-#include "modified-font-metric.hh"
-
#include <cctype>
+#include "modified-font-metric.hh"
+#include "pango-font.hh"
+#include "text-metrics.hh"
#include "warn.hh"
#include "stencil.hh"
+#include "lookup.hh"
+#include "main.hh"
-Modified_font_metric::Modified_font_metric (String input_encoding,
- Font_metric *m, Real magn)
+Modified_font_metric::Modified_font_metric (Font_metric *fm,
+ Real magnification)
{
- /* UGR, FIXME:
-
- THIS.coding_scheme == input encoding.
- ORIG.coding_scheme () == font_encoding.
-
- encoding is hairy enough by itself, should fix treacherous naming. */
-
- coding_scheme_ = input_encoding;
-
- coding_vector_ = SCM_EOL;
- coding_mapping_ = SCM_EOL;
- coding_table_ = SCM_EOL;
- coding_description_ = SCM_EOL;
-
- magnification_ = magn;
+ magnification_ = magnification;
- SCM desc = m->description_;
+ SCM desc = fm->description_;
- Real total_mag = magn * scm_to_double (scm_cdr (desc));
+ Real total_mag = magnification * scm_to_double (scm_cdr (desc));
assert (total_mag);
description_ = scm_cons (scm_car (desc), scm_make_real (total_mag));
- orig_ = m;
-
- if (coding_scheme_ != ""
- && coding_scheme_ != "TeX"
- && coding_scheme_ != "ASCII"
- && coding_scheme_ != orig_->coding_scheme ())
- {
- /* FIXME: this is broken, cannot get font encoding from font/AFM file,
- should use encoding from font-tree in fonts.scm. */
-
- coding_vector_
- = scm_call_1 (ly_scheme_function ("get-coding-vector"),
- scm_makfrom0str (coding_scheme_.to_str0 ()));
-
- if (!ly_c_vector_p (coding_vector_))
- {
- programming_error ("get-coding-vector should return vector");
- coding_vector_ = scm_c_make_vector (256, ly_symbol2scm (".notdef"));
- }
-
- coding_table_
- = scm_call_1 (ly_scheme_function ("get-coding-table"),
- scm_makfrom0str (orig_->coding_scheme ().to_str0 ()));
-
- coding_mapping_
- = scm_call_2 (ly_scheme_function ("make-encoding-mapping"),
- coding_vector_,
- coding_table_);
-
- coding_description_ = SCM_EOL;
- coding_description_
- = scm_acons (ly_symbol2scm ("input-name"),
- scm_makfrom0str (coding_scheme_.to_str0 ()),
- coding_description_);
- coding_description_
- = scm_acons (ly_symbol2scm ("input-vector"),
- coding_vector_, coding_description_);
- coding_description_
- = scm_acons (ly_symbol2scm ("output-name"),
- scm_makfrom0str (orig_->coding_scheme ().to_str0 ()),
- coding_description_);
- coding_description_
- = scm_acons (ly_symbol2scm ("output-table"),
- coding_table_,
- coding_description_);
- coding_description_
- = scm_acons (ly_symbol2scm ("char-mapping"),
- coding_mapping_,
- coding_description_);
- }
+ orig_ = fm;
}
+
SCM
-Modified_font_metric::make_scaled_font_metric (SCM coding,
- Font_metric *m, Real s)
+Modified_font_metric::make_scaled_font_metric (Font_metric *fm, Real scaling)
{
- /*
- UGH.
- */
- if (scm_is_symbol (coding))
- coding = scm_symbol_to_string (coding);
-
- String scheme = scm_is_string (coding) ? ly_scm2string (coding) : "";
-
- Modified_font_metric *sfm = new Modified_font_metric (scheme, m, s);
-
+ Modified_font_metric *sfm = new Modified_font_metric (fm, scaling);
return sfm->self_scm ();
}
return orig_->count ();
}
+Offset
+Modified_font_metric::attachment_point (String s) const
+{
+ Offset o = orig_->attachment_point (s);
+ return o * magnification_;
+}
+
Offset
Modified_font_metric::get_indexed_wxwy (int k) const
{
return orig_->name_to_index (s);
}
-int
-Modified_font_metric::index_to_ascii (int k) const
+unsigned
+Modified_font_metric::index_to_charcode (int i) const
{
- return orig_->index_to_ascii (k);
+ return orig_->index_to_charcode (i);
}
-String
-Modified_font_metric::coding_scheme () const
+int
+Modified_font_metric::index_to_ascii (int k) const
{
- return coding_scheme_;
+ return orig_->index_to_ascii (k);
}
void
Modified_font_metric::derived_mark () const
{
- scm_gc_mark (coding_vector_);
- scm_gc_mark (coding_description_);
- scm_gc_mark (coding_table_);
- scm_gc_mark (coding_mapping_);
}
/* TODO: put this klutchness behind ly:option switch. */
return Box (Interval (0, w), ydims);
}
-Box
-Modified_font_metric::text_dimension (String text)
+Stencil
+Modified_font_metric::text_stencil (String text) const
{
Box b;
- if (coding_scheme_ == "TeX")
- b = tex_kludge (text);
- else if (coding_scheme_ == "ASCII"
- || coding_scheme_ == ""
- || coding_scheme_ == orig_->coding_scheme ())
+ if (Pango_font * pf = dynamic_cast<Pango_font*> (orig_))
{
- Interval ydims;
+ Stencil stc = pf->text_stencil (text);
- Real w = 0.0;
+ Box b = stc.extent_box ();
- for (int i = 0; i < text.length (); i++)
- {
- Box b = get_ascii_char ((unsigned char)text[i]);
-
- w += b[X_AXIS].length ();
- ydims.unite (b[Y_AXIS]);
- }
- if (ydims.is_empty ())
- ydims = Interval (0, 0);
-
- b = Box(Interval(0,w), ydims);
+ b.scale (magnification_);
+ Stencil scaled(b, stc.expr());
+ return scaled;
}
- else
- {
- Interval ydims;
- Real w = 0.0;
-
- for (int i = 0; i < text.length (); i++)
- {
- SCM sym = scm_vector_ref (coding_vector_,
- scm_from_int((unsigned char) text[i]));
- Box char_box;
+ return Font_metric::text_stencil (text);
+}
- if (!scm_is_symbol (sym))
- continue;
+Box
+Modified_font_metric::text_dimension (String text) const
+{
+ SCM stext = scm_makfrom0str (text.to_str0 ());
+ Box b = lookup_tex_text_dimension (orig_, stext);
+ if (!b[Y_AXIS].is_empty ())
+ {
+ b.scale (magnification_);
+ return b;
+ }
- char const *chars = scm_i_string_chars (scm_symbol_to_string (sym));
-
- int idx = orig_->name_to_index (chars);
- if (idx >= 0)
- char_box = orig_->get_indexed_char (idx);
-
- char_box.scale (magnification_);
- if (!char_box[X_AXIS].is_empty ())
- /* length ? */
- w += char_box[X_AXIS][RIGHT];
+ if (output_backend_global == "tex")
+ {
+ b = tex_kludge (text);
+ return b;
+ }
- ydims.unite (char_box[Y_AXIS]);
- }
+ Interval ydims;
- if (ydims.is_empty ())
- ydims = Interval (0, 0);
+ Real w = 0.0;
- b = Box (Interval (0, w), ydims);
+ for (int i = 0; i < text.length (); i++)
+ {
+ Box b = get_ascii_char ((unsigned char)text[i]);
+
+ w += b[X_AXIS].length ();
+ ydims.unite (b[Y_AXIS]);
}
-
+ if (ydims.is_empty ())
+ ydims = Interval (0, 0);
+
+ b = Box(Interval(0, w), ydims);
return b;
}
return orig_;
}
-
-LY_DEFINE (ly_font_encoding_alist, "ly:font-encoding-alist",
- 1, 0, 0,
- (SCM font),
- "Given the Modified_font_metric @var{font}, return an "
- "alist. Keys are input-name, input-vector, "
- "output-name, output-table, mapping.")
+SCM
+Modified_font_metric::sub_fonts () const
{
- Modified_font_metric *fm
- = dynamic_cast<Modified_font_metric*> (unsmob_metrics (font));
-
- SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "Modified_font_metric");
- return fm->coding_description_;
+ return orig_->sub_fonts();
}
-
-LY_DEFINE (ly_font_encoding, "ly:font-encoding",
- 1, 0, 0,
- (SCM font),
- "Return encoding of @var{font}.")
+
+String
+Modified_font_metric::font_name () const
{
- Modified_font_metric *fm
- = dynamic_cast<Modified_font_metric*> (unsmob_metrics (font));
- SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "Modified_font_metric");
- return ly_symbol2scm (fm->original_font ()->coding_scheme ().to_str0 ());
+ return original_font ()->font_name();
}
-