#include "all-font-metrics.hh"
+#include "string-convert.hh"
#include "international.hh"
#include "main.hh"
#include "open-type-font.hh"
Index_to_charcode_map const *
-All_font_metrics::get_index_to_charcode_map (string filename, FT_Face face)
+All_font_metrics::get_index_to_charcode_map (string filename,
+ int face_index,
+ FT_Face face)
{
- if (filename_charcode_maps_map_.find (filename)
+ string key = filename + String_convert::int_string (face_index);
+ if (filename_charcode_maps_map_.find (key)
== filename_charcode_maps_map_.end ())
- filename_charcode_maps_map_[filename] = make_index_to_charcode_map (face);
+ filename_charcode_maps_map_[key] = make_index_to_charcode_map (face);
- return &filename_charcode_maps_map_[filename];
+ return &filename_charcode_maps_map_[key];
}
font = FcNameUnparse (fs->fonts[j]);
if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &str) == FcResultMatch)
retval += String_convert::form_string ("FILE %s\n", str);
+ if (FcPatternGetString (fs->fonts[j], FC_INDEX, 0, &str) == FcResultMatch)
+ retval += String_convert::form_string ("INDEX %s\n", str);
if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &str) == FcResultMatch)
retval += String_convert::form_string ("family %s\n ", str);
if (FcPatternGetString (fs->fonts[j],
All_font_metrics (All_font_metrics const &);
public:
- Index_to_charcode_map const *get_index_to_charcode_map (string filename, FT_Face face);
+ Index_to_charcode_map const *get_index_to_charcode_map (string filename,
+ int face_index,
+ FT_Face face);
All_font_metrics (string search_path);
~All_font_metrics ();
string description_string () const;
SCM font_file_name () const;
- void register_font_file (string, string);
+ void register_font_file (string, string, int);
Stencil text_stencil (string, bool tight) const;
Stencil pango_item_string_stencil (PangoItem const *, string, bool tight) const;
LY_DEFINE (ly_pango_font_physical_fonts, "ly:pango-font-physical-fonts",
1, 0, 0,
(SCM f),
- "Return alist of @code{(PSNAME . FILENAME)} tuples.")
+ "Return alist of @code{(ps-name file-name font-index)} lists"
+ " for Pango font@tie{}@var{f}.")
{
Pango_font *pf = dynamic_cast<Pango_font *> (unsmob_metrics (f));
void
Pango_font::register_font_file (string filename,
- string ps_name)
+ string ps_name,
+ int face_index)
{
scm_hash_set_x (physical_font_tab_,
ly_string2scm (ps_name),
- ly_string2scm (filename));
+ scm_list_2 (ly_string2scm (filename),
+ scm_from_int (face_index)));
}
void
PANGO_RBEARING (logical_rect)),
Interval (-PANGO_DESCENT (*which_rect),
PANGO_ASCENT (*which_rect)));
-
b.scale (scale_);
+
char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
FcPattern *fcpat = fcfont->font_pattern;
+
FcChar8 *file_name_as_ptr = 0;
FcPatternGetString (fcpat, FC_FILE, 0, &file_name_as_ptr);
+ // due to a bug in FreeType 2.3.7 and earlier we can't use
+ // ftface->face_index; it is always zero for some font formats,
+ // in particular TTCs which we are interested in
+ int face_index = 0;
+ FcPatternGetInteger (fcpat, FC_INDEX, 0, &face_index);
+
string file_name;
if (file_name_as_ptr)
// Normalize file name.
Index_to_charcode_map const *cmap = 0;
bool has_glyph_names = ftface->face_flags & FT_FACE_FLAG_GLYPH_NAMES;
if (!has_glyph_names)
- cmap = all_fonts_global->get_index_to_charcode_map (file_name, ftface);
+ cmap = all_fonts_global->get_index_to_charcode_map (
+ file_name, face_index, ftface);
bool is_ttf = string (FT_Get_X11_Font_Format (ftface)) == "TrueType";
bool cid_keyed = false;
+
for (int i = 0; i < pgs->num_glyphs; i++)
{
PangoGlyphInfo *pgi = pgs->glyphs + i;
if (glyph_name[0] == '\0')
{
// CID entry
-
cid_keyed = true;
char_id = scm_from_uint32 (pg);
}
if (ps_name.length ())
{
- ((Pango_font *) this)->register_font_file (file_name, ps_name);
+ ((Pango_font *) this)->register_font_file (file_name,
+ ps_name,
+ face_index);
pango_fc_font_unlock_face (fcfont);
SCM expr = scm_list_5 (ly_symbol2scm ("glyph-string"),
name filename)))
embed))
- (define (font-file-as-ps-string name file-name)
+ (define (font-file-as-ps-string name file-name font-index)
(let* ((downcase-file-name (string-downcase file-name)))
(cond
((and file-name (string-endswith downcase-file-name ".pfa"))
((and file-name (string-endswith downcase-file-name ".ttf"))
(ly:ttf->pfa file-name))
((and file-name (string-endswith downcase-file-name ".ttc"))
- (ly:ttf->pfa file-name))
+ (ly:ttf->pfa file-name font-index))
((and file-name (string-endswith downcase-file-name ".otf"))
(ps-embed-cff (ly:otf->cff file-name) name 0))
(else
(or (string-endswith bare-file-name ".dfont")
(= (stat:size (stat bare-file-name)) 0))))
- (define (load-font font-name-filename)
- (let* ((font (car font-name-filename))
- (name (cadr font-name-filename))
- (file-name (caddr font-name-filename))
+ (define (load-font font-psname-filename-fontindex)
+ (let* ((font (list-ref font-psname-filename-fontindex 0))
+ (name (list-ref font-psname-filename-fontindex 1))
+ (file-name (list-ref font-psname-filename-fontindex 2))
+ (font-index (list-ref font-psname-filename-fontindex 3))
(bare-file-name (ly:find-file file-name)))
(cons name
(cond ((mac-font? bare-file-name)
name
0))
(bare-file-name (font-file-as-ps-string
- name bare-file-name))
+ name bare-file-name font-index))
(else
(ly:warning (_ "do not know how to embed font ~s ~s ~s")
name file-name font))))))
(cond ((string? (ly:font-file-name font))
(list (list font
(ly:font-name font)
- (ly:font-file-name font))))
+ (ly:font-file-name font)
+ #f)))
((ly:pango-font? font)
- (map (lambda (name-psname-pair)
+ (map (lambda (psname-filename-fontindex)
(list #f
- (car name-psname-pair)
- (cdr name-psname-pair)))
+ (list-ref psname-filename-fontindex 0)
+ (list-ref psname-filename-fontindex 1)
+ (list-ref psname-filename-fontindex 2)))
(ly:pango-font-physical-fonts font)))
(else
(ly:font-sub-fonts font))))