Merge remote branch 'origin' into release/unstable
[lilypond/patrick.git] / lily / pfb.cc
blobba31e175138abc8b5051d7d339fc4e5f7c229b2f
1 /*
2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2004--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
20 #include <cstdlib>
21 #include <cstdio>
22 #include <cstring>
23 using namespace std;
25 #include "program-option.hh"
26 #include "source-file.hh"
27 #include "memory-stream.hh"
28 #include "open-type-font.hh"
29 #include "main.hh"
30 #include "warn.hh"
32 char *
33 pfb2pfa (Byte const *pfb, int length)
35 char *out = (char*) malloc(sizeof(char));
36 int olen = 0;
38 Byte const *p = pfb;
39 while (p < pfb + length)
41 if (*p++ != 128)
42 break;
44 Byte type = *p++;
45 if (type == 3)
46 break;
48 unsigned seglen
49 = p[0] | (p[1] << 8)
50 | (p[2] << 16) | (p[3] << 24);
52 p += 4;
53 if (type == 1)
55 out = (char *)realloc (out, olen + seglen + 1);
56 char *outp = out + olen;
57 memcpy (outp, p, seglen);
58 olen += seglen;
59 p += seglen;
61 else if (type == 2)
63 unsigned outlength = (seglen * 2) + (seglen / 32) + 2;
65 out = (char *)realloc (out, olen + outlength + 1);
67 char *outp = out + olen;
68 for (int i = seglen; i--;)
70 sprintf (outp, "%02x", *p++);
71 outp += 2;
72 if (! (i % 32))
73 *outp++ = '\n';
76 olen = outp - out;
79 out[olen] = 0;
81 return out;