From 8d1f238d09ada2152baebdfc949b7f56c2e7bfd6 Mon Sep 17 00:00:00 2001 From: Masamichi Hosoda Date: Mon, 30 May 2016 19:02:53 +0900 Subject: [PATCH] Issue 4868/1: Add font-index for embedding OTC fonts This commit adds support font-index for OpenType/CFF Collection (OTC) fonts not only TrueType Collection (TTC) fonts. --- lily/pfb-scheme.cc | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/lily/pfb-scheme.cc b/lily/pfb-scheme.cc index 4a13515472..f708c098a0 100644 --- a/lily/pfb-scheme.cc +++ b/lily/pfb-scheme.cc @@ -1,4 +1,5 @@ +#include "international.hh" #include "program-option.hh" #include "source-file.hh" #include "memory-stream.hh" @@ -29,20 +30,50 @@ LY_DEFINE (ly_pfb_2_pfa, "ly:pfb->pfa", } LY_DEFINE (ly_otf_2_cff, "ly:otf->cff", - 1, 0, 0, (SCM otf_file_name), + 1, 1, 0, (SCM otf_file_name, SCM idx), "Convert the contents of an OTF file to a CFF file," - " returning it as a string.") + " returning it as a string. The optional" + " @var{idx} argument is useful for OpenType/CFF collections (OTC)" + " only; it specifies the font index within the OTC. The default" + " value of @var{idx} is@tie{}0.") { LY_ASSERT_TYPE (scm_is_string, otf_file_name, 1); + int i = 0; + if (!SCM_UNBNDP (idx)) + { + LY_ASSERT_TYPE (scm_is_integer, idx, 2); + i = scm_to_int (idx); + if (i < 0) + { + warning (_ ("font index must be non-negative, using index 0")); + i = 0; + } + } + string file_name = ly_scm2string (otf_file_name); debug_output ("[" + file_name); // start message on a new line - FT_Face face = open_ft_face (file_name, 0 /* index */); + FT_Face face; + /* check whether font index is valid */ + if (i > 0) + { + face = open_ft_face (file_name, -1); + if (i >= face->num_faces) + { + warning (_f ("font index %d too large for font `%s', using index 0", + i, file_name.c_str ())); + i = 0; + } + FT_Done_Face (face); + } + + face = open_ft_face (file_name, i); string table = get_otf_table (face, "CFF "); SCM asscm = scm_from_latin1_stringn ((char *) table.data (), table.length ()); + FT_Done_Face (face); debug_output ("]", false); -- 2.39.2