📄 otf2bdf.c
字号:
/*
* Copyright 2005 Computing Research Labs, New Mexico State University
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef lint
#ifdef __GNUC__
static char rcsid[] __attribute__ ((unused)) = "$Id: otf2bdf.c,v 1.3 2005/11/07 23:35:24 mleisher Exp $";
#else
static char rcsid[] = "$Id: otf2bdf.c,v 1.3 2005/11/07 23:35:24 mleisher Exp $";
#endif
#endif
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#else
#include <stdlib.h>
#include <unistd.h>
#endif
#include <string.h>
#include <freetype/freetype.h>
#include FT_GLYPH_H
#include FT_SFNT_NAMES_H
#include FT_TRUETYPE_TABLES_H
/*
* Include the remapping support.
*/
#include "remap.h"
/**************************************************************************
*
* Macros.
*
**************************************************************************/
/*
* The version of otf2bdf.
*/
#define OTF2BDF_VERSION "3.0"
/*
* Set the default values used to generate a BDF font.
*/
#ifndef DEFAULT_PLATFORM_ID
#define DEFAULT_PLATFORM_ID 3
#endif
#ifndef DEFAULT_ENCODING_ID
#define DEFAULT_ENCODING_ID 1
#endif
#ifndef DEFAULT_POINT_SIZE
#define DEFAULT_POINT_SIZE 12
#endif
#ifndef DEFAULT_RESOLUTION
#define DEFAULT_RESOLUTION 100
#endif
/*
* Used as a fallback for XLFD names where the character set/encoding can not
* be determined.
*/
#ifndef DEFAULT_XLFD_CSET
#define DEFAULT_XLFD_CSET "-FontSpecific-0"
#endif
/*
* nameID macros for getting strings from the OT font.
*/
#define BDFOTF_COPYRIGHT_STRING 0
#define BDFOTF_FAMILY_STRING 1
#define BDFOTF_SUBFAMILY_STRING 2
#define BDFOTF_UNIQUEID_STRING 3
#define BDFOTF_FULLNAME_STRING 4
#define BDFOTF_VENDOR_STRING 5
#define BDFOTF_POSTSCRIPT_STRING 6
#define BDFOTF_TRADEMARK_STRING 7
/*
* String names for the string indexes. Used for error messages.
*/
static char *string_names[] = {
"\"Copyright\"",
"\"Family\"",
"\"SubFamily\"",
"\"Unique ID\"",
"\"Full Name\"",
"\"Vendor\"",
"\"Postscript Name\"",
"\"Trademark\""
};
#if 0
#define TTF_COPYRIGHT 0
#define TTF_TYPEFACE 1
#define TTF_PSNAME 6
#endif
#ifndef MAX
#define MAX(h,i) ((h) > (i) ? (h) : (i))
#endif
#ifndef MIN
#define MIN(l,o) ((l) < (o) ? (l) : (o))
#endif
/**************************************************************************
*
* General globals set from command line.
*
**************************************************************************/
/*
* The program name.
*/
static char *prog;
/*
* The flag indicating whether messages should be printed or not.
*/
static int verbose = 0;
/*
* Flags used when loading glyphs.
*/
static int load_flags = FT_LOAD_DEFAULT;
/*
* The default platform and encoding ID's.
*/
static int pid = DEFAULT_PLATFORM_ID;
static int eid = DEFAULT_ENCODING_ID;
/*
* Default point size and resolutions.
*/
static int point_size = DEFAULT_POINT_SIZE;
static int hres = DEFAULT_RESOLUTION;
static int vres = DEFAULT_RESOLUTION;
/*
* The user supplied foundry name to use in the XLFD name.
*/
static char *foundry_name = 0;
/*
* The user supplied typeface name to use in the XLFD name.
*/
static char *face_name = 0;
/*
* The user supplied weight name to use in the XLFD name.
*/
static char *weight_name = 0;
/*
* The user supplied slant name to use in the XLFD name.
*/
static char *slant_name = 0;
/*
* The user supplied width name to use in the XLFD name.
*/
static char *width_name = 0;
/*
* The user supplied additional style name to use in the XLFD name.
*/
static char *style_name = 0;
/*
* The user supplied spacing (p = proportional, c = character cell,
* m = monospace).
*/
static int spacing = 0;
/*
* The dash character to use in the names retrieved from the font. Default is
* the space.
*/
static int dashchar = ' ';
/*
* Flag, bitmask, and max code for generating a subset of the glyphs in a font.
*/
static int do_subset = 0;
static unsigned short maxcode;
static unsigned long subset[2048];
/*
* The flag that indicates the remapping table should be used to
* reencode the font.
*/
static int do_remap = 0;
/**************************************************************************
*
* Internal globals.
*
**************************************************************************/
/*
* Structure used for calculating the font bounding box as the glyphs are
* generated.
*/
typedef struct {
short minlb;
short maxlb;
short maxrb;
short maxas;
short maxds;
short rbearing;
} bbx_t;
static bbx_t bbx;
/*
* The buffer used to transfer the temporary file to the actual output file.
*/
#define OTF2BDF_IOBUFSIZ 8192
static char iobuf[OTF2BDF_IOBUFSIZ];
/*
* The Units Per Em value used in numerous places.
*/
static FT_UShort upm;
/*
* A flag indicating if a CMap was found or not.
*/
static FT_UShort nocmap;
/*
* The scaling factor needed to compute the SWIDTH (scalable width) value
* for BDF glyphs.
*/
static double swscale;
/**************************************************************************
*
* Platform and encoding table names.
*
**************************************************************************/
static char *platform_names[] = {
"Apple Unicode", "Macintosh", "ISO", "Microsoft", "Unknown"
};
static int nplatform_names = sizeof(platform_names)/sizeof(platform_names[0]);
/*
* Mac encoding names used when creating the BDF XLFD font name.
*/
static char *mac_encodings[] = {
"-MacRoman-0", "-MacJapanese-0", "-MacChinese-0", "-MacKorean-0",
"-MacArabic-0", "-MacHebrew-0", "-MacGreek-0", "-MacRussian-0",
"-MacRSymbol-0", "-MacDevanagari-0", "-MacGurmukhi-0", "-MacGujarati-0",
"-MacOriya-0", "-MacBengali-0", "-MacTamil-0", "-MacTelugu-0",
"-MacKannada-0", "-MacMalayalam-0", "-MacSinhalese-0", "-MacBurmese-0",
"-MacKhmer-0", "-MacThai-0", "-MacLaotian-0", "-MacGeorgian-0",
"-MacArmenian-0", "-MacMaldivian-0", "-MacTibetan-0", "-MacMongolian-0",
"-MacGeez-0", "-MacSlavic-0", "-MacVietnamese-0","-MacSindhi-0",
"-MacUninterp-0"
};
static int nmac_encodings = sizeof(mac_encodings)/sizeof(mac_encodings[0]);
/*
* ISO encoding names used when creating the BDF XLFD font name.
*/
static char *iso_encodings[] = {
"-ASCII-0", "-ISO10646-1", "-ISO8859-1"
};
static int niso_encodings = sizeof(iso_encodings)/sizeof(iso_encodings[0]);
/*
* Microsoft encoding names used when creating the BDF XLFD font name.
*/
static char *ms_encodings[] = {
"-Symbol-0", "-ISO10646-1", "-ShiftJIS-0", "-GB2312.1980-0", "-Big5-0",
"-KSC5601.1987-0", "-KSC5601.1992-0"
};
static int nms_encodings = sizeof(ms_encodings)/sizeof(ms_encodings[0]);
/*
* The propery names for all the XLFD properties.
*/
static char *xlfd_props[] = {
"FOUNDRY",
"FAMILY_NAME",
"WEIGHT_NAME",
"SLANT",
"SETWIDTH_NAME",
"ADD_STYLE_NAME",
"PIXEL_SIZE",
"POINT_SIZE",
"RESOLUTION_X",
"RESOLUTION_Y",
"SPACING",
"AVERAGE_WIDTH",
"CHARSET_REGISTRY",
"CHARSET_ENCODING",
};
/**************************************************************************
*
* Freetype globals.
*
**************************************************************************/
static FT_Library library;
static FT_Face face;
static FT_Size_Metrics imetrics;
static TT_HoriHeader *horizontal;
/**************************************************************************
*
* Freetype related code.
*
**************************************************************************/
/*
* A generic routine to get a name from the OT name table. This routine
* always looks for English language names and checks three possibilities:
* 1. English names with the MS Unicode encoding ID.
* 2. English names with the MS unknown encoding ID.
* 3. English names with the Apple Unicode encoding ID.
*
* The particular name ID mut be provided (e.g. nameID = 0 for copyright
* string, nameID = 6 for Postscript name, nameID = 1 for typeface name.
*
* If the `dash_to_space' flag is non-zero, all dashes (-) in the name will be
* replaced with the character passed.
*
* Returns the number of bytes added.
*/
static int
otf_get_english_string(FT_Face face, int nameID, int dash_to_space,
char *name, int name_size)
{
int j, encid;
FT_UInt i, nrec;
FT_SfntName sfntName;
unsigned char *s;
unsigned short slen;
nrec = FT_Get_Sfnt_Name_Count(face);
for (encid = 1, j = 0; j < 2; j++, encid--) {
/*
* Locate one of the MS English font names.
*/
for (i = 0; i < nrec; i++) {
FT_Get_Sfnt_Name(face, i, &sfntName);
if (sfntName.platform_id == 3 &&
sfntName.encoding_id == encid &&
sfntName.name_id == nameID &&
(sfntName.language_id == 0x0409 ||
sfntName.language_id == 0x0809 ||
sfntName.language_id == 0x0c09 ||
sfntName.language_id == 0x1009 ||
sfntName.language_id == 0x1409 ||
sfntName.language_id == 0x1809)) {
s = sfntName.string;
slen = sfntName.string_len;
break;
}
}
if (i < nrec) {
if (slen >> 1 >= name_size) {
fprintf(stderr, "%s: warning: %s string longer than buffer. Truncating to %d bytes.\n", prog, string_names[nameID], name_size);
slen = name_size << 1;
}
/*
* Found one of the MS English font names. The name is by
* definition encoded in Unicode, so copy every second byte into
* the `name' parameter, assuming there is enough space.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -