2 pfb.cc -- implement pfb conversion.
4 source file of the GNU LilyPond music typesetter
6 (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
13 #include "source-file.hh"
14 #include "memory-stream.hh"
16 #include "open-type-font.hh"
21 pfb2pfa (Byte const *pfb, int length)
23 char *out = new char[1];
27 while (p < pfb + length)
38 | (p[2] << 16) | (p[3] << 24);
43 out = (char *)realloc (out, olen + seglen + 1);
44 char *outp = out + olen;
45 memcpy (outp, p, seglen);
51 unsigned outlength = (seglen * 2) + (seglen / 32) + 2;
53 out = (char *)realloc (out, olen + outlength + 1);
55 char *outp = out + olen;
56 for (int i = seglen; i--;)
58 sprintf (outp, "%02x", *p++);
75 LY_DEFINE (ly_pfb_to_pfa, "ly:pfb->pfa",
76 1, 0, 0, (SCM pfb_file_name),
77 "Convert the contents of a PFB file to PFA.")
79 SCM_ASSERT_TYPE (scm_is_string (pfb_file_name), pfb_file_name,
80 SCM_ARG1, __FUNCTION__, "string");
82 String file_name = ly_scm2string (pfb_file_name);
84 char *str = gulp_file (file_name, &len);
85 char *pfa = pfb2pfa ((Byte *)str, len);
87 SCM pfa_scm = scm_makfrom0str (pfa);
93 LY_DEFINE (ly_ttf_to_pfa, "ly:ttf->pfa",
94 1, 0, 0, (SCM ttf_file_name),
95 "Convert the contents of a TTF file to Type42 PFA, returning it as "
98 SCM_ASSERT_TYPE (scm_is_string (ttf_file_name), ttf_file_name,
99 SCM_ARG1, __FUNCTION__, "string");
101 String file_name = ly_scm2string (ttf_file_name);
102 if (be_verbose_global)
103 progress_indication ("[" + file_name);
106 Memory_out_stream stream;
107 create_type42 (file_name.to_str0 (), stream.get_file ());
108 SCM asscm = scm_from_locale_stringn (stream.get_string (),
109 stream.get_length ());
111 if (be_verbose_global)
112 progress_indication ("]");
119 LY_DEFINE (ly_otf_to_cff, "ly:otf->cff",
120 1, 0, 0, (SCM otf_file_name),
121 "Convert the contents of a OTF file to CFF file, returning it as "
124 SCM_ASSERT_TYPE (scm_is_string (otf_file_name), otf_file_name,
125 SCM_ARG1, __FUNCTION__, "string");
127 String file_name = ly_scm2string (otf_file_name);
128 if (be_verbose_global)
129 progress_indication ("[" + file_name);
131 FT_Face face = open_ft_face (file_name);
132 String table = get_otf_table (face, "CFF ");
134 SCM asscm = scm_from_locale_stringn ((char*) table.get_bytes (),
137 if (be_verbose_global)
138 progress_indication ("]");