X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffont-metric.cc;h=0eb2b2903c738e1520ba6ed14ccd6b406e422dec;hb=9d481c2337e71dd7aef16ff696c6cf497d0d8865;hp=e542a73cfef7be6909798cb7caf474593726f48c;hpb=fd7e615444cf58b38283a59b56d3457c07778397;p=lilypond.git diff --git a/lily/font-metric.cc b/lily/font-metric.cc index e542a73cfe..0eb2b2903c 100644 --- a/lily/font-metric.cc +++ b/lily/font-metric.cc @@ -1,76 +1,65 @@ -/* - font-metric.cc -- implement Font_metric - - source file of the GNU LilyPond music typesetter - - (c) 1999 Han-Wen Nienhuys - - */ +/* + This file is part of LilyPond, the GNU music typesetter. -#include -#include + Copyright (C) 1999--2014 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -#include "font-metric.hh" + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -Box -Font_metric::text_dimension (String text) const -{ - Interval ydims; - Real w=0.0; - - for (int i = 0; i < text.length_i (); i++) - { - - if (text[i]=='\\') - { - for (i++; (i < text.length_i ()) && isalpha(text[i]); i++) - ; - // ugh. - i--; // Compensate for the increment in the outer loop! - } - else - { - Character_metric const *c = get_char ((unsigned char)text[i],false); - - // Ugh, use the width of 'x' for unknown characters - if (c->dimensions()[X_AXIS].length () == 0) - c = get_char ((unsigned char)'x',false); - - w += c->dimensions()[X_AXIS].length (); - ydims.unite (c->dimensions()[Y_AXIS]); - } - } - if (ydims.empty_b ()) - ydims = Interval (0,0); + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ - return Box(Interval (0, w), ydims); -} +#include "font-metric.hh" +#include +#include +using namespace std; -Box -Scaled_font_metric::text_dimension (String t) const -{ - Real realmag = pow (1.2, magstep_i_); - Box b (orig_l_->text_dimension (t)); - - return Box(b[X_AXIS]* realmag, b[Y_AXIS]*realmag); -} +#include "dimensions.hh" +#include "modified-font-metric.hh" +#include "open-type-font.hh" +#include "stencil.hh" +#include "warn.hh" +#include "ly-smobs.icc" -Box -Character_metric::dimensions () const +Real +Font_metric::design_size () const { - return Box(Interval(0,0), Interval(0,0)); + return 1.0 * point_constant; } -Font_metric::~Font_metric () +Stencil +Font_metric::find_by_name (string s) const { - unsmobify_self (); + replace_all (&s, '-', 'M'); + int idx = name_to_index (s); + Box b; + + SCM expr = SCM_EOL; + if (idx >= 0) + { + expr = scm_list_3 (ly_symbol2scm ("named-glyph"), + self_scm (), + ly_string2scm (s)); + b = get_indexed_char_dimensions (idx); + } + + Stencil q (b, expr); + return q; } Font_metric::Font_metric () { + description_ = SCM_EOL; self_scm_ = SCM_EOL; smobify_self (); } @@ -79,57 +68,94 @@ Font_metric::Font_metric (Font_metric const &) { } -Character_metric::~Character_metric() +Font_metric::~Font_metric () { } -Character_metric const * -Font_metric::get_char (int, bool)const +size_t +Font_metric::count () const { return 0; } -Scaled_font_metric::Scaled_font_metric (Font_metric* m, int s) +Box +Font_metric::get_indexed_char_dimensions (size_t) const { - magstep_i_ = s; - orig_l_ = m; + return Box (Interval (0, 0), Interval (0, 0)); } -SCM -Font_metric::description () const +Offset +Font_metric::get_indexed_wxwy (size_t) const { - return gh_cons (ly_symbol2scm (name_str_.ch_C()), gh_int2scm (0)); + return Offset (0, 0); } +void +Font_metric::derived_mark () const +{ +} SCM -Scaled_font_metric::description () const +Font_metric::mark_smob (SCM s) { - SCM od = orig_l_->description (); - gh_set_cdr_x (od, gh_int2scm (magstep_i_)); - return od; + Font_metric *m = (Font_metric *) SCM_CELL_WORD_1 (s); + m->derived_mark (); + return m->description_; } - -void -Font_metric::do_smobify_self () +int +Font_metric::print_smob (SCM s, SCM port, scm_print_state *) { + Font_metric *m = unsmob_metrics (s); + scm_puts ("#<", port); + scm_puts (m->class_name (), port); + scm_puts (" ", port); + scm_write (m->description_, port); + scm_puts (">", port); + return 1; } +IMPLEMENT_SMOBS (Font_metric); +IMPLEMENT_DEFAULT_EQUAL_P (Font_metric); +IMPLEMENT_TYPE_P (Font_metric, "ly:font-metric?"); + SCM -Font_metric::mark_smob (SCM s) +Font_metric::font_file_name () const { - return SCM_EOL; + return scm_car (description_); } -int -Font_metric::print_smob (SCM s, SCM port, scm_print_state * ) +string +Font_metric::font_name () const { - scm_puts ("#", port); - - return 1; + string s ("unknown"); + return s; } +size_t +Font_metric::index_to_charcode (size_t i) const +{ + return i; +} +Offset +Font_metric::attachment_point (const string&) const +{ + return Offset (0, 0); +} +SCM +Font_metric::sub_fonts () const +{ + return SCM_EOL; +} +Stencil +Font_metric::text_stencil (Output_def *state, + const string&, bool) const +{ + (void) state; + + programming_error ("Cannot get a text stencil from this font"); + return Stencil (Box (), SCM_EOL); +}