-/*
- 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--2002 Jan Nieuwenhuizen <janneke@gnu.org>
-
+
+ (c) 1999--2006 Jan Nieuwenhuizen <janneke@gnu.org>
+
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 "warn.hh"
-#include "warn.hh"
#define format_string String_convert::form_string
-#define FIX_UNITY \
- (1 << 20)
+#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
return get_U32_fix () * info_.design_size;
}
-String
+string
Tex_font_metric_reader::get_bcpl_string ()
{
U8 length_u8 = input_.get_U8 ();
- String str = input_.get_string (length_u8);
+ string str = input_.get_string (length_u8);
return str;
}
Tex_font_metric_reader::read_header ()
{
U16 file_length = input_.get_U16 ();
- (void) file_length;
+ (void) file_length;
U16 header_length = input_.get_U16 ();
info_.first_charcode = input_.get_U16 ();
U16 italic_correction_word_count = input_.get_U16 ();
U16 lig_kern_word_count = input_.get_U16 ();
U16 kern_word_count = input_.get_U16 ();
- (void)kern_word_count;
+ (void)kern_word_count;
U16 extensible_word_count = input_.get_U16 ();
- (void)extensible_word_count;
-
+ (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)
+ /* 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 ().to_str0 (), header_length));
+ input_.name_string ().c_str (), header_length));
info_.checksum = input_.get_U32 ();
info_.design_size = get_U32_fix ();
font family and face byte probably aren't. So we don't read them. */
info_.coding_scheme = header_length > 2
? get_bcpl_string () : "unspecified";
-
}
/* Although TFM files are only usable by TeX if they have at least seven
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_string ().to_str0 (),
+ input_.name_string ().c_str (),
header_.param_word_count,
TFM_MAX_FONTDIMENS));
header_.param_word_count = TFM_MAX_FONTDIMENS;
for (Char_code i = 2; i <= header_.param_word_count; i++)
info_.parameters[i - 1] = get_U32_fix_scaled ();
-
}
/* Read every character in the TFM file, storing the result in the
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);
}
}
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_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). */
Tex_font_char_metric tfm_char;
-#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; \
- }
+#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);
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)
{
#define KERN_FLAG 128
void
-Tex_font_metric_reader::read_lig_kern_program (Array <Tfm_ligature>* ligatures, Array <Tfm_kern>* kerns)
+Tex_font_metric_reader::read_lig_kern_program (vector<Tfm_ligature> *ligatures, vector<Tfm_kern> *kerns)
{
bool end_b;
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_str0 ();
+ 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);
- kerns->push (kern_element);
-
+ kerns->push_back (kern_element);
}
else
{
Tfm_ligature ligature_element;
ligature_element.character = next_char;
ligature_element.ligature = remainder;
- ligatures->push (ligature_element);
-
+ ligatures->push_back (ligature_element);
}
- } while (!end_b);
+ }
+ while (!end_b);
}