Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/*
* fontx2bdf -- fontx2 -> bdf font file convertor
* fontx2 形式のフォントを bdf 形式にする。
*
* コンパイルの方法:
* gcc -o fontx2bdf fontx2bdf.c
*
* 使い方:
* fontx2bdf < $fontx2形式のファイル | bdftopcf > なんとか.pcf
*
* バグ:
* bdfファイルの先頭部に設定される情報は非常にエエ加減です (^^;)。
* このプログラムは、80x86 (FreeBSD, MS-DOS, etc.) 以外の環境では
* 意図したとおりには動かないかもしれません。
*
* Copyright (c) 1995 by Dai Ishijima
*
*/
/*
* 改訂2版: Oct. 14, 1997 by Dai ISHIJIMA
* 変更点
* ・80x86 以外でも (たぶん) 使えるようになった
* ・コンパイル時に -Wall オプションをつけて、チェックを厳しくした
*/
#ifdef __TURBOC__
#define MSDOS
#endif
#ifdef _MSC_VER
#define MSDOS
#endif
#ifdef LSI_C
#define MSDOS
#define HAVE_FSETBIN
#endif
#include
#include
#include
#ifndef NO_STDLIB
#include
#endif
#ifdef MSDOS
#include
#include
#endif
#ifndef HAVE_FSETBIN
#define fsetbin(fp) setmode(fileno(fp), O_BINARY)
#endif
#define SBCS 0
#define DBCS 1
#define ID_LEN 6
#define NAM_LEN 8
#define NPROP 18
#define DESCENT 2
#define CHARS_SBCS 256
/* $fontx2 ファイルのヘッダ情報 */
typedef struct {
char id[ID_LEN];
char name[NAM_LEN];
unsigned char width;
unsigned char height;
unsigned char type;
} fontx_h;
/* 格納している文字の表 */
typedef struct {
unsigned short start;
unsigned short end;
} fontx_tbl;
/* BDFファイルの先頭部 */
void bdfheader(int width, int height, int startcode, char *name, int type)
{
int point_size;
int pixel_size;
int av_width;
pixel_size = height; /* 高さ [ドット単位] */
point_size = (height - 1) * 10; /* 高さ [ポイント x 10] */
av_width = width * 10; /* 平均幅 [ポイント x10] */
/* */
printf("STARTFONT 2.1\n");
printf("COMMENT\n");
printf("FONT -%s-Fixed-Medium-R-Normal-", name);
printf("-%d-%d", pixel_size, point_size);
if (type == DBCS) {
printf("-75-75-C-%d-JISX0208.1983-0\n", av_width);
}
else {
printf("-75-75-C-%d-JISX0201.1976-0\n", av_width);
}
printf("SIZE %d 75 75\n", width);
printf("FONTBOUNDINGBOX %d %d 0 %d\n", width, height, -DESCENT);
printf("STARTPROPERTIES %d\n", NPROP);
printf("FONTNAME_REGISTRY \"\"\n");
printf("FOUNDRY \"%s\"\n", name);
printf("FAMILY_NAME \"Fixed\"\n");
printf("WEIGHT_NAME \"Medium\"\n");
printf("SLANT \"R\"\n");
printf("SETWIDTH_NAME \"Normal\"\n");
printf("ADD_STYLE_NAME \"\"\n");
printf("PIXEL_SIZE %d\n", pixel_size);
printf("POINT_SIZE %d\n", point_size);
printf("RESOLUTION_X 75\n");
printf("RESOLUTION_Y 75\n");
printf("SPACING \"C\"\n");
printf("AVERAGE_WIDTH %d\n", av_width);
if (type == DBCS) {
printf("CHARSET_REGISTRY \"JISX0208.1983\"\n");
}
else {
printf("CHARSET_REGISTRY \"JISX0201.1976\"\n");
}
printf("CHARSET_ENCODING \"0\"\n");
printf("DEFAULT_CHAR %d\n", startcode);
printf("FONT_DESCENT %d\n", DESCENT);
printf("FONT_ASCENT %d\n", height - DESCENT);
/* printf("COPYRIGHT \"?\"\n");*/
printf("ENDPROPERTIES\n");
}
/* $fontx2ヘッダ情報の読みとり */
int readheader(FILE *fp, fontx_h *header)
{
fread(header->id, ID_LEN, 1, fp);
if (strncmp(header->id, "FONTX2", ID_LEN) != 0) {
return(1);
}
fread(header->name, NAM_LEN, 1, fp);
header->width = (unsigned char)getc(fp);
header->height = (unsigned char)getc(fp);
header->type = (unsigned char)getc(fp);
return(0);
}
/* i386 な short int を読む */
unsigned short getshort(FILE *fp)
{
int i, j;
i = (unsigned char)getc(fp);
j = (unsigned char)getc(fp);
return(i + j * 256);
}
/* 格納している文字の表を読む */
void readtbl(fontx_tbl *table, int size, FILE *fp)
{
while (size > 0) {
table->start = getshort(fp);
table->end = getshort(fp);
++table;
--size;
}
}
/* フォント名を $fontx2 から BDF へ */
void copyname(char *bdf_name, char *fontx_name)
{
int i, j;
j = i = 0;
while (i < NAM_LEN) {
bdf_name[j] = tolower(fontx_name[i]);
if (bdf_name[j] == 0) {
break;
}
if ((bdf_name[j] != '-') && (bdf_name[j] != ' ')) {
++j; /* '-' と ' ' ならスキップ */
}
++i;
}
bdf_name[j] = 0;
bdf_name[0] = toupper(bdf_name[0]);
}
/* 各文字のビットマップを書く */
void tobdf(int code, int width, int height)
{
int x, y;
printf("STARTCHAR %04x\n", code);
printf("ENCODING %d\n", code);
printf("SWIDTH %d 0\n", width * 72);
printf("DWIDTH %d 0\n", width);
printf("BBX %d %d 0 %d\n", width, height, -DESCENT);
printf("BITMAP\n");
for (y = 0; y < height; y++) {
for (x = 0; x < (width + 7) / 8; x++) {
printf("%02x", getchar());
}
printf("\n");
}
printf("ENDCHAR\n");
}
/* フォントファイルに何文字の情報があるか */
unsigned int nchars(int n_tbl, fontx_tbl *table)
{
int i;
int n;
n = 0;
for (i = 0; i < n_tbl; i++) {
n += table[i].end - table[i].start + 1;
}
return(n);
}
/* シフトJIS -> JIS 変換 */
int stoj(int code)
{
int x, y;
int hi, lo;
hi = (unsigned short)code / 256;
lo = (unsigned short)code % 256;
if (hi >= 0xe0) {
hi -= (0xe0 - 0xa0);
}
if (lo > 0x9e) {
x = (hi - 0x80) * 2 + 0x20;
y = lo + 0x20 - 0x9e;
}
else {
x = (hi - 0x80) * 2 + 0x20 - 1;
if (lo > 0x7f) {
--lo;
}
y = lo - 0x1f;
}
return(x * 256 + y);
}
void main()
{
fontx_h h;
unsigned char size;
fontx_tbl *table;
int i;
unsigned int code;
char name[10];
#ifdef __MSDOS__
fsetbin(stdin);
#endif
if (readheader(stdin, &h) != 0) {
fprintf(stderr, "not in FONTX2 format\n");
exit(1);
}
copyname(name, h.name);
if (h.type == DBCS) {
size = getc(stdin);
table = (fontx_tbl *)calloc(size, sizeof(fontx_tbl));
/* fread(table, size, sizeof(fontx_tbl), stdin);*/
readtbl(table, size, stdin);
bdfheader(h.width, h.height, stoj(table[0].start), name, DBCS);
printf("CHARS %u\n", nchars(size, table));
for (i = 0; i < size; i++) {
for (code = table[i].start; code <= table[i].end; code++) {
tobdf(stoj(code), h.width, h.height);
}
}
}
else {
bdfheader(h.width, h.height, 0, name, h.type);
printf("CHARS %u\n", 256);
for (i = 0; i < 256; i++) {
tobdf(i, h.width, h.height);
}
}
printf("ENDFONT\n");
exit(0);
}
/* Local Variables: */
/* compile-command:"gcc -o fontx2bdf fontx2bdf.c" */
/* End: */