/* makefonts.cc
- Utility for generating the standard fonts (arial, courier, etc.) in swf-format.
+ Utility for converting Type 1 fonts to SWF.
Part of the swftools package.
Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
- This file is distributed under the GPL, see file COPYING for details
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
-*/
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <stdio.h>
+#include <unistd.h>
#include <fcntl.h>
#include <math.h>
#include "../lib/rfxswf.h"
+#include "../lib/args.h"
#include "swfoutput.h"
#include "spline.h"
+static char * filenames[256];
+static int filenum;
+static char * destfilename = "output.swf";
+int all=0;
+int verbose=0;
+
+struct options_t options[] =
+{
+ {"o","output"},
+ {"v","verbose"},
+ {"V","version"},
+ {0,0}
+};
+int args_callback_option(char*name,char*val)
+{
+ if(!strcmp(name, "V")) {
+ printf("font2swf - part of %s %s\n", PACKAGE, VERSION);
+ exit(0);
+ }
+ else if(!strcmp(name, "o")) {
+ destfilename = val;
+ return 1;
+ }
+ else if(!strcmp(name, "v")) {
+ verbose ++;
+ return 0;
+ }
+ else {
+ printf("Unknown option: -%s\n", name);
+ exit(1);
+ }
+ return 0;
+}
+int args_callback_longoption(char*name,char*val)
+{
+ return args_long2shortoption(options, name, val);
+}
+void args_callback_usage(char*name)
+{
+ printf("Usage: %s file.afm [...]\n", name);
+ printf(" OR: %s all\n", name);
+ printf("\n");
+ printf("\tIf \"all\" is given instead of font names, all standard fonts\n");
+ printf("\t(Courier, Arial etc.) will be created\n");
+ printf("\n");
+ printf("Options:\n");
+ printf("\n");
+ printf("\t-h , --help\t\t Print help and exit\n");
+ printf("\t-o , --output filename\t set output filename\n");
+ printf("\t-v , --verbose\t\t Be more verbose\n");
+ printf("\t-V , --version\t\t Print program version and exit\n");
+}
+int args_callback_command(char*name,char*val)
+{
+ if(!strcmp(name, "all"))
+ all = 1;
+ else {
+ filenames[filenum++] = strdup(name);
+ }
+ return 0;
+}
+
+
#define standardEncodingSize 256
#define symbolEncodingSize 256
#define zapfDingbatsEncodingSize 256
SWFFONT * wfont = (SWFFONT*)malloc(sizeof(SWFFONT));
SWFFont * font = new SWFFont("", i, "");
+ memset(wfont, 0, sizeof(SWFFONT));
+
wfont->version = 2;
wfont->name = (U8*)strdup(fontname);
wfont->layout = (SWFLAYOUT*)malloc(sizeof(SWFLAYOUT));
{
if(encoding[s]) {
T1_OUTLINE*outline = font->getOutline(encoding[s], 0);
- if(outline && outline->link)
- num++;
+ if(outline) num++;
}
}
if(encoding[s]) {
T1_OUTLINE*outline = font->getOutline(encoding[s],0);
int width = font->getWidth(encoding[s]);
- if(outline && outline->link) {
+
+ if(outline) {
int log = 0;
wfont->ascii2glyph[s] = num;
wfont->glyph2ascii[num] = s;
swf_ShapeNew(&wfont->glyph[num].shape);
SHAPE*shape = wfont->glyph[num].shape;
+ int firstx = outline->dest.x/0xffff;
TAG*tag = swf_InsertTag(0,ST_DEFINESHAPE);
shape->bits.line = 0;
swf_ShapeSetStyle(tag,shape,0,1,0);
resetdrawer();
+
drawpath(tag, outline, &m, log);
-
+
/*uncomment this to mark the glyph sizes:
plotxy p1,p2; p1.x=0; p1.y=0; p2.x=width/8; p2.y=-width/8;
moveto(tag, p1); lineto(tag, p2); p1.x += 2; p2.x += 2;
wfont->glyph[num].shape->data = (U8*)malloc(tag->len-1);
memcpy(wfont->glyph[num].shape->data, &tag->data[1], tag->len-1);
swf_DeleteTag(tag);
-
+
/* fix bounding box */
SHAPE2*shape2;
SRECT bbox;
shape2 = swf_ShapeToShape2(shape);
if(!shape2) { fprintf(stderr, "Shape parse error\n");exit(1);}
- bbox = swf_GetShapeBoundingBox(shape2->lines);
+ bbox = swf_GetShapeBoundingBox(shape2);
swf_Shape2Free(shape2);
wfont->layout->bounds[num] = bbox;
//wfont->glyph[num].advance = (int)(width/6.4); // 128/20
wfont->glyph[num].advance = bbox.xmax/20;
+ if(!wfont->glyph[num].advance) {
+ wfont->glyph[num].advance = firstx;
+ }
num++;
}
int main(int argc, char ** argv)
{
- int all=0;
- if(argc<=1) {
- printf("Usage: %s font.afm\n", argv[0]);
- printf("OR: %s all\n", argv[0]);
- printf("\n");
- printf("\tIf \"all\" is given instead of font names, all standard fonts\n");
- printf("\t(Courier, Arial etc.) will be created\n");
- return 0;
- } else {
- if(!strcmp(argv[1],"all"))
- all=1;
+ char cwd[128];
+ getcwd(cwd, 128);
+ processargs(argc, argv);
+ if(!all && !filenum) {
+ fprintf(stderr, "You must supply a filename.\n");
+ exit(1);
}
//TODO: use tempnam here. Check if environment already contains a
//T1LIB_CONFIG.
putenv( "T1LIB_CONFIG=/tmp/t1lib.config.tmp");
FILE*fi = fopen("/tmp/t1lib.config.tmp", "wb");
- fprintf(fi, "FONTDATABASE=/tmp/FontDataBase\n", SWFTOOLS_DATADIR);
- fprintf(fi, "ENCODING=%s/fonts:.\n", SWFTOOLS_DATADIR);
- fprintf(fi, "AFM=%s/fonts:.\n", SWFTOOLS_DATADIR);
- fprintf(fi, "TYPE1=%s/fonts:.\n", SWFTOOLS_DATADIR);
+ if(all) {
+ fprintf(fi, "FONTDATABASE=/tmp/FontDataBase\n");
+ fprintf(fi, "ENCODING=%s/fonts:.\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "AFM=%s/fonts:.\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "TYPE1=%s/fonts:.\n", SWFTOOLS_DATADIR);
+ } else {
+ fprintf(fi, "FONTDATABASE=/tmp/FontDataBase\n");
+ fprintf(fi, "ENCODING=%s:.\n", cwd);
+ fprintf(fi, "AFM=%s:.\n", cwd);
+ fprintf(fi, "TYPE1=%s:.\n", cwd);
+ }
fclose(fi);
fi = fopen("/tmp/FontDataBase", "wb");
if(all) {
fprintf(fi, "14\n");
- fprintf(fi, "n021003l.afm\n"); //fixme
- fprintf(fi, "n021023l.afm\n");
- fprintf(fi, "n021004l.afm\n");
- fprintf(fi, "n021024l.afm\n");
- fprintf(fi, "n019003l.afm\n");
- fprintf(fi, "n019023l.afm\n");
- fprintf(fi, "n019004l.afm\n");
- fprintf(fi, "n019024l.afm\n");
- fprintf(fi, "n022003l.afm\n");
- fprintf(fi, "n022023l.afm\n");
- fprintf(fi, "n022004l.afm\n");
- fprintf(fi, "n022024l.afm\n");
- fprintf(fi, "s050000l.afm\n");
- fprintf(fi, "d050000l.afm\n");
+ fprintf(fi, "%s/fonts/n021003l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n021023l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n021004l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n021024l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n019003l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n019023l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n019004l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n019024l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n022003l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n022023l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n022004l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/n022024l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/s050000l.afm\n", SWFTOOLS_DATADIR);
+ fprintf(fi, "%s/fonts/d050000l.afm\n", SWFTOOLS_DATADIR);
} else {
- fprintf(fi, "%d\n",argc-1);
+ fprintf(fi, "%d\n", filenum);
int t;
- for(t=1;t<argc;t++) {
- fprintf(fi, "%s\n",argv[t]);
+ for(t=0;t<filenum;t++) {
+ fprintf(fi, "%s/%s\n", cwd, filenames[t]);
}
}
fclose(fi);
int i,num;
for( i=0; i<T1_Get_no_fonts(); i++)
-// i = 4;
{
SWFFONT * font = t1font2swffont(i);
swf_WriteFont(font, filename);
swf_FontFree(font);
}
+ unlink("/tmp/FontDataBase");
}