X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftfm-reader.cc;h=b41630113470c4bc794137e0e1407a1a95e0ad54;hb=b07ef7805ea536741e20c3d1b8fc1bc463a844ba;hp=70472b8020f3227211a55a9fc346070550f0232b;hpb=f988425624a6f6d1a48aea0ac0c1c84ff0857e56;p=lilypond.git diff --git a/lily/tfm-reader.cc b/lily/tfm-reader.cc index 70472b8020..b416301134 100644 --- a/lily/tfm-reader.cc +++ b/lily/tfm-reader.cc @@ -1,35 +1,35 @@ -/* - tfm-reader.cc -- implement Tex_font_metric_reader - +/* + tfm-reader.cc -- implement Tex_font_metric_reader + source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Jan Nieuwenhuizen - + + (c) 1999--2006 Jan Nieuwenhuizen + some code shamelessly copied from GNU fontutils-0.6/tfm/tfm_input.c - */ +*/ #include "tfm-reader.hh" + +#include "international.hh" #include "string-convert.hh" -#include "debug.hh" #include "warn.hh" -#define format_str String_convert::form_str -#define FIX_UNITY (1 << 20) +#define format_string String_convert::form_string +#define FIX_UNITY \ + (1 << 20) static const Real fix_to_real (Fix f); - -Tex_font_metric_reader::Tex_font_metric_reader (String name) +Tex_font_metric_reader::Tex_font_metric_reader (string name) : input_ (name) { - - for (int i=0; i < TFM_SIZE; i++) - ascii_to_metric_idx_.push (-1); + + for (vsize i = 0; i < TFM_SIZE; i++) + ascii_to_metric_idx_.push_back (VPOS); read_header (); read_params (); read_char_metrics (); - } static const Real @@ -42,7 +42,7 @@ fix_to_real (Fix f) /* Most quantities are fixed-point fractions. */ Real -Tex_font_metric_reader::get_U32_fix_f () +Tex_font_metric_reader::get_U32_fix () { return fix_to_real (input_.get_U32 ()); } @@ -50,16 +50,16 @@ Tex_font_metric_reader::get_U32_fix_f () /* Dimensions are a `Fix' scaled by the design size. */ Real -Tex_font_metric_reader::get_U32_fix_scaled_f () +Tex_font_metric_reader::get_U32_fix_scaled () { - return get_U32_fix_f () * info_.design_size; + return get_U32_fix () * info_.design_size; } -String -Tex_font_metric_reader::get_bcpl_str () +string +Tex_font_metric_reader::get_bcpl_string () { U8 length_u8 = input_.get_U8 (); - String str = input_.get_str (length_u8); + string str = input_.get_string (length_u8); return str; } @@ -84,35 +84,36 @@ Tex_font_metric_reader::read_header () (void)kern_word_count; U16 extensible_word_count = input_.get_U16 (); (void)extensible_word_count; - + header_.param_word_count = input_.get_U16 (); info_.parameter_count = header_.param_word_count; header_.char_info_pos = (6 + header_length) * 4; header_.width_pos = header_.char_info_pos - + (info_.last_charcode - - info_.first_charcode + 1) * 4; + + (info_.last_charcode + - info_.first_charcode + 1) * 4; header_.height_pos = header_.width_pos + width_word_count * 4; header_.depth_pos = header_.height_pos + height_word_count * 4; header_.italic_correction_pos = header_.depth_pos - + depth_word_count * 4; + + depth_word_count * 4; header_.lig_kern_pos = header_.italic_correction_pos + italic_correction_word_count * 4; header_.kern_pos = header_.lig_kern_pos + lig_kern_word_count * 4; /* We don't care about the extensible table. */ if (header_length < 2) - error (_f ("TFM header of `%s' has only %u word(s)", - input_.name_str ().ch_C (), header_length)); + /* Not using ngettext's plural feature here, as this message is + more of a programming error. */ + error (_f ("TFM header of `%s' has only %u word (s)", + input_.name_string ().c_str (), header_length)); info_.checksum = input_.get_U32 (); - info_.design_size = get_U32_fix_f (); + info_.design_size = get_U32_fix (); /* Although the coding scheme might be interesting to the caller, the font family and face byte probably aren't. So we don't read them. */ info_.coding_scheme = header_length > 2 - ? get_bcpl_str () : "unspecified"; - + ? get_bcpl_string () : "unspecified"; } /* Although TFM files are only usable by TeX if they have at least seven @@ -130,14 +131,14 @@ Tex_font_metric_reader::read_params () //brrr /* Move to the beginning of the parameter table in the file. */ - input_.seek_ch_C (-4 * header_.param_word_count); + input_.seek_str0 (-4 * header_.param_word_count); /* It's unlikely but possible that this TFM file has more fontdimens than we can deal with. */ if (header_.param_word_count > TFM_MAX_FONTDIMENS) { warning (_f ("%s: TFM file has %u parameters, which is more than the %u I can handle", - input_.name_str ().ch_C (), + input_.name_string ().c_str (), header_.param_word_count, TFM_MAX_FONTDIMENS)); header_.param_word_count = TFM_MAX_FONTDIMENS; @@ -145,11 +146,10 @@ Tex_font_metric_reader::read_params () /* The first parameter is different than all the rest, because it isn't scaled by the design size. */ - info_.parameters[(TFM_SLANT_PARAMETER) - 1] = get_U32_fix_f (); + info_.parameters[ (TFM_SLANT_PARAMETER) - 1] = get_U32_fix (); for (Char_code i = 2; i <= header_.param_word_count; i++) - info_.parameters[i - 1] = get_U32_fix_scaled_f (); - + info_.parameters[i - 1] = get_U32_fix_scaled (); } /* Read every character in the TFM file, storing the result in the @@ -161,9 +161,9 @@ Tex_font_metric_reader::read_char_metrics () for (int i = info_.first_charcode; i <= info_.last_charcode; i++) { Tex_font_char_metric tfm_char = read_char_metric (i); - if (tfm_char.exists_b_) + if (tfm_char.exists_) ascii_to_metric_idx_[tfm_char.code_] = char_metrics_.size (); - char_metrics_.push (tfm_char); + char_metrics_.push_back (tfm_char); } } @@ -180,21 +180,20 @@ Tex_font_metric_reader::read_char_metric (Char_code code) try to read it. */ if (code < info_.first_charcode || code > info_.last_charcode) return tfm_char; - + //brr /* Move to the appropriate place in the `char_info' array. */ - input_.seek_ch_C (header_.char_info_pos + (code - info_.first_charcode) * 4); + input_.seek_str0 (header_.char_info_pos + (code - info_.first_charcode) * 4); /* Read the character. */ tfm_char = read_char (); - if (tfm_char.exists_b_) + if (tfm_char.exists_) tfm_char.code_ = code; return tfm_char; } - /* We assume we are positioned at the beginning of a `char_info' word. We read that word to get the indexes into the dimension tables; then we go read the tables to get the values (if the character exists). */ @@ -218,30 +217,30 @@ Tex_font_metric_reader::read_char () Tex_font_char_metric tfm_char; -#define GET_CHAR_DIMEN(d) \ - if (d##_index != 0) \ - { \ - input_.seek_ch_C (header_.##d##_pos + d##_index*4); \ - tfm_char.d##_fix_ = input_.get_U32 (); \ - tfm_char.d##_ = fix_to_real (tfm_char.d##_fix_) \ - * info_.design_size; \ - } +#define GET_CHAR_DIMEN(d) \ + if (d##_index != 0) \ + { \ + input_.seek_str0 (header_.d##_pos + d##_index * 4); \ + tfm_char.d##_fix_ = input_.get_U32 (); \ + tfm_char.d##_ = fix_to_real (tfm_char.d##_fix_) \ + * info_.design_size; \ + } - GET_CHAR_DIMEN(width); - GET_CHAR_DIMEN(height); - GET_CHAR_DIMEN(depth); - GET_CHAR_DIMEN(italic_correction); + GET_CHAR_DIMEN (width); + GET_CHAR_DIMEN (height); + GET_CHAR_DIMEN (depth); + GET_CHAR_DIMEN (italic_correction); /* The other condition for a character existing is that it be between the first and last character codes given in the header. We've already assumed that's true (or we couldn't be positioned at a `char_info_word'). */ - tfm_char.exists_b_ = width_index != 0; + tfm_char.exists_ = width_index != 0; if (tag == 1) { - input_.seek_ch_C (header_.lig_kern_pos + remainder * 4); - read_lig_kern_program (&tfm_char.ligature_arr_, &tfm_char.kern_arr_); + input_.seek_str0 (header_.lig_kern_pos + remainder * 4); + read_lig_kern_program (&tfm_char.ligatures_, &tfm_char.kerns_); } /* We don't handle the other tags. */ @@ -256,7 +255,7 @@ Tex_font_metric_reader::read_char () #define KERN_FLAG 128 void -Tex_font_metric_reader::read_lig_kern_program (Array * ligature_arr_p, Array * kern_arr_p) +Tex_font_metric_reader::read_lig_kern_program (vector *ligatures, vector *kerns) { bool end_b; @@ -268,28 +267,26 @@ Tex_font_metric_reader::read_lig_kern_program (Array * ligature_ar bool kern_step_b = input_.get_U8 () >= KERN_FLAG; U8 remainder = input_.get_U8 (); - if (kern_step_b) { Tfm_kern kern_element; kern_element.character = next_char; - char const* old_pos = input_.pos_ch_C (); - input_.seek_ch_C (header_.kern_pos + remainder * 4); - kern_element.kern = get_U32_fix_scaled_f (); + char const *old_pos = input_.pos_str0 (); + input_.seek_str0 (header_.kern_pos + remainder * 4); + kern_element.kern = get_U32_fix_scaled (); input_.set_pos (old_pos); - kern_arr_p->push (kern_element); - + kerns->push_back (kern_element); } else { Tfm_ligature ligature_element; ligature_element.character = next_char; ligature_element.ligature = remainder; - ligature_arr_p->push (ligature_element); - + ligatures->push_back (ligature_element); } - } while (!end_b); + } + while (!end_b); }