utility for creating the standard fonts in swf format
[swftools.git] / lib / example / makefonts.cc
1 /* fontwrite.c
2
3    Example for including and using fonts 
4    
5    Part of the swftools package.
6
7    Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
8  
9    This file is distributed under the GPL, see file COPYING for details 
10
11 */
12
13 #include <stdio.h>
14 #include <fcntl.h>
15 #include <math.h>
16 extern "C" {
17 #include "../rfxswf.h"
18 }
19 #include "../../pdf2swf/swfoutput.h"
20 #include "../../pdf2swf/spline.h"
21
22 #define standardEncodingSize 335
23 #define symbolEncodingSize 257
24 #define zapfDingbatsEncodingSize 270
25 #define macRomanEncodingSize 256
26
27 extern char *standardEncodingNames[standardEncodingSize];
28 extern char *symbolEncodingNames[symbolEncodingSize];
29 extern char *zapfDingbatsEncodingNames[zapfDingbatsEncodingSize];
30 extern char *macRomanEncodingNames[macRomanEncodingSize];
31
32 char*DATADIR = "/usr/local/share/swftools";
33
34 extern void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m);
35
36 SWFFONT * t1font2swffont(int i)
37 {
38     T1_LoadFont(i);
39
40     float angle = T1_GetItalicAngle(i);
41     char*fontname = T1_GetFontName(i);
42     char*fullname = T1_GetFullName(i);
43     char*familyname = T1_GetFamilyName(i);
44     float underline = T1_GetUnderlinePosition(i);
45     BBox bbox = T1_GetFontBBox(i);
46
47     char ** encoding = standardEncodingNames;
48     int encodingsize = standardEncodingSize;
49
50     printf("processing \"%s\"...\n", fullname);
51
52     if(strstr(fullname, "Dingbats")) {// Zapf Dingbats
53         encoding = zapfDingbatsEncodingNames;
54         encodingsize = zapfDingbatsEncodingSize;
55     }
56     else if(strstr(fullname, "Symbol")) {// Symbol
57         encoding = symbolEncodingNames;
58         encodingsize = zapfDingbatsEncodingSize;
59     }
60
61     SWFFONT * wfont = (SWFFONT*)malloc(sizeof(SWFFONT));
62     SWFFont * font = new SWFFont("", i, "");
63
64     wfont->version = 2;
65     wfont->name = (U8*)fontname;
66     wfont->layout = (SWFLAYOUT*)malloc(sizeof(SWFLAYOUT));
67
68     int s,num;
69     num = 0;
70     for(s=0;s<encodingsize;s++)
71     {
72         if(encoding[s]) {
73             T1_OUTLINE*outline = font->getOutline(encoding[s]);
74             if(outline && outline->link)
75                 num++;
76         }
77     }
78
79     wfont->maxascii = encodingsize;
80     wfont->numchars = num;
81     wfont->flags = /*layout*/0x80 + /*bold*/0?0:1 + /*italic*/(angle>0.05)?2:0;
82     wfont->glyph = (SWFGLYPH*)malloc(num*sizeof(SWFGLYPH));
83     memset(wfont->glyph, 0, num*sizeof(SWFGLYPH));
84     wfont->glyph2ascii = (U16*)malloc(num*sizeof(U16));
85     memset(wfont->glyph2ascii, 0, num*sizeof(U16));
86     wfont->ascii2glyph = (int*)malloc(encodingsize*sizeof(int));
87     memset(wfont->ascii2glyph, -1, encodingsize*sizeof(int));
88     wfont->layout->ascent = (U16)(underline - bbox.lly);
89     wfont->layout->descent = (U16)(bbox.ury - underline);
90     wfont->layout->leading = (U16)(wfont->layout->ascent - 
91                              wfont->layout->descent -
92                              (bbox.lly - bbox.ury));
93     wfont->layout->bounds = (SRECT*)malloc(sizeof(SRECT));
94     wfont->layout->bounds->xmin = bbox.llx;
95     wfont->layout->bounds->ymin = bbox.lly;
96     wfont->layout->bounds->xmax = bbox.urx;
97     wfont->layout->bounds->ymax = bbox.ury;
98     wfont->layout->kerningcount = 0;
99     wfont->layout->kerning = 0;
100   
101     num = 0;
102     for(s=0;s<encodingsize;s++)
103     {
104         if(encoding[s]) {
105             T1_OUTLINE*outline = font->getOutline(encoding[s]);
106             if(outline && outline->link) {
107                 wfont->ascii2glyph[s] = num;
108                 wfont->glyph2ascii[num] = s;
109                 swf_ShapeNew(&wfont->glyph[num].shape);
110                 SHAPE*shape = wfont->glyph[num].shape;
111                 wfont->glyph[num].advance = font->getCharWidth(num)/8;
112                 
113                 TAG*tag = swf_InsertTag(0,ST_DEFINESHAPE);
114
115                 swfmatrix m;
116                 m.m11 = 1;
117                 m.m22 = 1;
118                 m.m21 = 0;
119                 m.m12 = 0;
120                 m.m13 = 0;
121                 m.m23 = 0;
122
123                 swf_SetU8(tag,0);
124
125                 shape->bits.fill = 1;
126                 shape->bits.line = 0;
127                 swf_ShapeSetStyle(tag,shape,0,1,0);
128                 drawpath(tag, outline, &m);
129                 swf_ShapeSetEnd(tag);
130
131                 wfont->glyph[num].shape->data = &tag->data[1];
132                 int t;
133                 for(t=0;t<8;t++)
134                     if(tag->writeBit == (0x80>>t)) break;
135                 if(tag->writeBit == 0)
136                     t = 8;
137                 wfont->glyph[num].shape->bitlen = (tag->len-1)*8;
138                 num++;
139             }
140         }
141     }
142     return wfont;
143 }
144
145 int main(int argc, char ** argv)
146 {
147   //TODO: use tempnam here. Check if environment already contains a
148   //T1LIB_CONFIG.
149   putenv( "T1LIB_CONFIG=/tmp/t1lib.config.tmp");
150   FILE*fi = fopen("/tmp/t1lib.config.tmp", "wb");
151   fprintf(fi, "FONTDATABASE=%s/FontDataBase\n", DATADIR);
152   fprintf(fi, "ENCODING=%s:.\n", DATADIR);
153   fprintf(fi, "AFM=%s:.\n", DATADIR);
154   fprintf(fi, "TYPE1=%s:.\n", DATADIR);
155   fclose(fi);
156   /* initialize t1lib */
157   T1_SetBitmapPad( 16);
158   if ((T1_InitLib(NO_LOGFILE)==NULL)){
159       fprintf(stderr, "Initialization of t1lib failed\n");
160       exit(1);
161   }
162   unlink("/tmp/t1lib.config.tmp");
163
164   int i,num;
165   for( i=0; i<T1_Get_no_fonts(); i++)
166 //      i = 0;
167   {
168     SWFFONT * font = t1font2swffont(i);
169     
170     char filename[128];
171     sprintf(filename, "%s.swf", font->name);
172     swf_WriteFont(font, filename);
173     free(font);
174   }
175 }
176