/** * Main. */ int main(int argc, char* argv[]) { FT_Error error; std::string fTtf; std::string fLff; // init: fpLff = NULL; nodes = 4; std::string name = "Unknown"; double letterSpacing = 3.0; double wordSpacing = 6.75; double lineSpacingFactor = 1.0; std::string author = "Unknown"; std::string license = "Unknown"; precision = 6; // handle arguments: if (argc<2) { std::cout << "Usage: ttf2cxf <options> <ttf file> <cxf file>\n"; std::cout << " ttf file: An existing True Type Font file\n"; std::cout << " lff file: The LFF font file to create\n"; std::cout << "options are:\n"; std::cout << " -n nodes Number of nodes for quadratic and cubic splines (int)\n"; std::cout << " -a author Author of the font. Preferably full name and e-mail address\n"; std::cout << " -l letter spacing Letter spacing (float)\n"; std::cout << " -w word spacing Word spacing (float)\n"; std::cout << " -f line spacing factor Default is 1.0 (float)\n"; std::cout << " -d precision Number of decimal digits (int)\n"; std::cout << " -L license license of the font.\n"; exit(1); } for (int i=1; i<argc; ++i) { if (!strcmp(argv[i], "-n")) { ++i; nodes = atoi(argv[i]); } else if (!strcmp(argv[i], "-a")) { ++i; author = argv[i]; } else if (!strcmp(argv[i], "-l")) { ++i; letterSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-w")) { ++i; wordSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-d")) { ++i; precision = atoi(argv[i]); } else if (!strcmp(argv[i], "-f")) { ++i; lineSpacingFactor = atof(argv[i]); } else if (!strcmp(argv[i], "-L")) { ++i; license = argv[i]; } } fTtf = argv[argc-2]; fLff = argv[argc-1]; std::cout << "TTF file: " << fTtf.c_str() << "\n"; std::cout << "LFF file: " << fLff.c_str() << "\n"; // init freetype error = FT_Init_FreeType(&library); if (error) { std::cerr << "Error: FT_Init_FreeType\n"; } // load ttf font error = FT_New_Face(library, fTtf.c_str(), 0, &face); if (error==FT_Err_Unknown_File_Format) { std::cerr << "FT_New_Face: Unknown format\n"; } else if (error) { std::cerr << "FT_New_Face: Unknown error\n"; } std::cout << "family: " << face->family_name << "\n"; name = face->family_name; std::cout << "height: " << face->height << "\n"; std::cout << "ascender: " << face->ascender << "\n"; std::cout << "descender: " << face->descender << "\n"; // find out height by tracing 'A' yMax = -1000; convertGlyph(65); factor = 1.0/(1.0/9.0*yMax); std::cout << "factor: " << factor << "\n"; // write font file: fpLff = fopen(fLff.c_str(), "wt"); if (fpLff==NULL) { std::cerr << "Cannot open file " << fLff.c_str() << " for writing.\n"; exit(2); } sprintf(numFormat,"%%.%if", precision); // write font header fprintf(fpLff, "# Format: LibreCAD Font 1\n"); fprintf(fpLff, "# Creator: ttf2lff\n"); fprintf(fpLff, "# Version: 1\n"); fprintf(fpLff, "# Name: %s\n", name.c_str()); fprintf(fpLff, "# LetterSpacing: %s\n", clearZeros(letterSpacing).c_str()); fprintf(fpLff, "# WordSpacing: %s\n", clearZeros(wordSpacing).c_str()); fprintf(fpLff, "# LineSpacingFactor: %s\n", clearZeros(lineSpacingFactor).c_str()); time_t rawtime; struct tm * timeinfo; char buffer [12]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,80,"%Y-%m-%d",timeinfo); fprintf(fpLff, "# Created: %s\n", buffer); fprintf(fpLff, "# Last modified: %s\n", buffer); fprintf(fpLff, "# Author: %s\n", author.c_str()); fprintf(fpLff, "# License: %s\n", license.c_str()); fprintf(fpLff, "\n"); uint first; FT_Get_First_Char(face, &first); FT_ULong charcode; FT_UInt gindex; // iterate through glyphs charcode = FT_Get_First_Char( face, &gindex ); while (gindex != 0) { convertGlyph(charcode); charcode = FT_Get_Next_Char(face, charcode, &gindex); } return 0; }
/** * Main. */ int main(int argc, char* argv[]) { FT_Error error; std::string fTtf; std::string fCxf; // init: fpCxf = NULL; nodes = 4; name = "Unknown"; letterSpacing = 3.0; wordSpacing = 6.75; lineSpacingFactor = 1.0; author = "Unknown"; // handle arguments: if (argc<2) { std::cout << "Usage: ttf2cxf <options> <ttf file> <cxf file>\n"; std::cout << " ttf file: An existing True Type Font file\n"; std::cout << " cxf file: The CXF font file to create\n"; std::cout << "options are:\n"; std::cout << " -n nodes Number of nodes for quadratic and cubic splines (int)\n"; std::cout << " -a author Author of the font. Preferably full name and e-mail address\n"; std::cout << " -l letter spacing Letter spacing (float)\n"; std::cout << " -w word spacing Word spacing (float)\n"; std::cout << " -f line spacing factor Default is 1.0 (float)\n"; exit(1); } for (int i=1; i<argc; ++i) { if (!strcmp(argv[i], "-n")) { ++i; nodes = atoi(argv[i]); } else if (!strcmp(argv[i], "-a")) { ++i; author = argv[i]; } else if (!strcmp(argv[i], "-l")) { ++i; letterSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-w")) { ++i; wordSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-f")) { ++i; lineSpacingFactor = atof(argv[i]); } } fTtf = argv[argc-2]; fCxf = argv[argc-1]; std::cout << "TTF file: " << fTtf.c_str() << "\n"; std::cout << "CXF file: " << fCxf.c_str() << "\n"; // init freetype error = FT_Init_FreeType(&library); if (error) { std::cerr << "Error: FT_Init_FreeType\n"; } // load ttf font error = FT_New_Face(library, fTtf.c_str(), 0, &face); if (error==FT_Err_Unknown_File_Format) { std::cerr << "FT_New_Face: Unknown format\n"; } else if (error) { std::cerr << "FT_New_Face: Unknown error\n"; } std::cout << "family: " << face->family_name << "\n"; name = face->family_name; std::cout << "height: " << face->height << "\n"; std::cout << "ascender: " << face->ascender << "\n"; std::cout << "descender: " << face->descender << "\n"; // find out height by tracing 'A' yMax = -1000; convertGlyph(65); factor = 1.0/(1.0/9.0*yMax); std::cout << "factor: " << factor << "\n"; // write font file: fpCxf = fopen(fCxf.c_str(), "wt"); if (fpCxf==NULL) { std::cerr << "Cannot open file " << fCxf.c_str() << " for writing.\n"; exit(2); } // write font header fprintf(fpCxf, "# Format: QCad 2 Font\n"); fprintf(fpCxf, "# Creator: ttf2cxf\n"); fprintf(fpCxf, "# Version: 1\n"); fprintf(fpCxf, "# Name: %s\n", name.c_str()); fprintf(fpCxf, "# LetterSpacing: %f\n", letterSpacing); fprintf(fpCxf, "# WordSpacing: %f\n", wordSpacing); fprintf(fpCxf, "# LineSpacingFactor: %f\n", lineSpacingFactor); fprintf(fpCxf, "# Author: %s\n", author.c_str()); fprintf(fpCxf, "\n"); uint first; FT_Get_First_Char(face, &first); FT_ULong charcode; FT_UInt gindex; // iterate through glyphs charcode = FT_Get_First_Char( face, &gindex ); while (gindex != 0) { convertGlyph(charcode); charcode = FT_Get_Next_Char(face, charcode, &gindex); } return 0; }
/** * Main. */ int main(int argc, char* argv[]) { FT_Error error; std::string fTtf; std::string fLff; // init: fpLff = NULL; nodes = 4; std::string name = "Unknown"; double letterSpacing = 3.0; double wordSpacing = 6.75; double lineSpacingFactor = 1.0; std::string author = "Unknown"; std::string license = "Unknown"; precision = 6; int i; int ret; library = NULL; face = NULL; // handle arguments: if (argc < 3) { usage(1); /* NOTREACHED */ } for (i=1; i<argc; ++i) { if (!strcmp(argv[i], "-n")) { ++i; nodes = atoi(argv[i]); } else if (!strcmp(argv[i], "-a")) { ++i; author = argv[i]; } else if (!strcmp(argv[i], "-l")) { ++i; letterSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-w")) { ++i; wordSpacing = atof(argv[i]); } else if (!strcmp(argv[i], "-d")) { ++i; precision = atoi(argv[i]); } else if (!strcmp(argv[i], "-f")) { ++i; lineSpacingFactor = atof(argv[i]); } else if (!strcmp(argv[i], "-h")) { usage(0); /* NOTREACHED */ } else if (!strcmp(argv[i], "-L")) { ++i; license = argv[i]; } else { break; } } if((argc - i) != 2) { usage(1); /* NOTREACHED */ } fTtf = argv[i++]; fLff = argv[i]; std::cout << "TTF file: " << fTtf.c_str() << "\n"; std::cout << "LFF file: " << fLff.c_str() << "\n"; ret = 0; // init freetype error = FT_Init_FreeType(&library); if (error) { std::cerr << "FT_Init_FreeType: " << FT_StrError(error) << std::endl; ret = 1; } else { // load ttf font error = FT_New_Face(library, fTtf.c_str(), 0, &face); if (error) { std::cerr << "FT_New_Face: " << fTtf << ": " << FT_StrError(error) << std::endl; ret = 1; } else { std::cout << "Family: " << face->family_name << "\n"; std::cout << "Height: " << face->height << "\n"; std::cout << "Ascender: " << face->ascender << "\n"; std::cout << "Descender: " << face->descender << "\n"; name = face->family_name; // find out height by tracing 'A' yMax = -1000; convertGlyph(65); factor = 1.0/(1.0/9.0*yMax); std::cout << "Factor: " << factor << "\n"; // write font file: fpLff = fopen(fLff.c_str(), "wt"); if (fpLff==NULL) { std::cerr << "Can not open " << fLff.c_str() << ": " << strerror(errno) << std::endl; ret = 2; } else { snprintf(numFormat,8,"%%.%if", precision); // write font header fprintf(fpLff, "# Format: LibreCAD Font 1\n"); fprintf(fpLff, "# Creator: ttf2lff\n"); fprintf(fpLff, "# Version: 1\n"); fprintf(fpLff, "# Name: %s\n", name.c_str()); fprintf(fpLff, "# LetterSpacing: %s\n", clearZeros(letterSpacing).c_str()); fprintf(fpLff, "# WordSpacing: %s\n", clearZeros(wordSpacing).c_str()); fprintf(fpLff, "# LineSpacingFactor: %s\n", clearZeros(lineSpacingFactor).c_str()); time_t rawtime; struct tm * timeinfo; char buffer [12]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,sizeof(buffer),"%Y-%m-%d",timeinfo); fprintf(fpLff, "# Created: %s\n", buffer); fprintf(fpLff, "# Last modified: %s\n", buffer); fprintf(fpLff, "# Author: %s\n", author.c_str()); fprintf(fpLff, "# License: %s\n", license.c_str()); fprintf(fpLff, "\n"); unsigned first; FT_Get_First_Char(face, &first); FT_ULong charcode; FT_UInt gindex; // iterate through glyphs charcode = FT_Get_First_Char( face, &gindex ); while (gindex != 0) { convertGlyph(charcode); charcode = FT_Get_Next_Char(face, charcode, &gindex); } } } } if (face) { FT_Done_Face(face); } if (library) { FT_Done_Library(library); } return ret; }