|
|
1.1 root 1: <?php
2: //
3: // BDF ファイルから必要な範囲だけ抜き出す
4: // Copyright (C) 2012 [email protected]
5: //
6:
7: /*
8: * 書式
9: * bdfcut.php [command] < in.bdf > out.bdf
10: *
11: * 解説
12: * BDF ファイルから必要な範囲だけを抜き出します。
13: * 標準入力から読み込み、標準出力に書き出します。
14: *
15: * 範囲は command で指定します。今のところ以下が使用できます。
16: *
17: * h : Unicode の BDF からひらがなのみを抜き出します。
18: * k : JISX0208 の BDF から非漢字のみを抜き出します。
19: */
20:
21: $opt = $argv[1];
22:
23: $start = -1;
24: $end = -1;
25:
26: /* オプションによって出力範囲を指定 */
27: if ($opt == "h") {
28: /* Unicode のひらがなのみ取り出す */
29: $start = 0x3041;
30: $end = 0x309f;
31: }
32: if ($opt == "k") {
33: /* JIS X 0208 の非漢字のみ取り出す */
34: $start = 0x2120;
35: $end = 0x287f;
36: }
37:
38: /* どのオプションもなければ終了 */
39: if ($start == -1) {
40: fprintf(STDERR, "usage: {$argv[0]} [command] < in.bdf > out.bdf\n");
41: fprintf(STDERR, " h: hiragana only in unicode\n");
42: fprintf(STDERR, " k: hi-kanji only in JIS X 0208\n");
43: exit(1);
44: }
45:
46: /*
47: * プロパティ部分。
48: * o TTF から縦横比を変えて変換した BDF には QUAD_WIDTH が含まれてない
49: * ので、ついでにここで追加してやる。
50: */
51: $pixel_size = -1;
52: $quad_width = -1;
53: $res_x = -1;
54: $res_y = -1;
55: while (($buf = fgets(STDIN))) {
56: if (preg_match("/^PIXEL_SIZE (\d+)/", $buf, $m)) {
57: $pixel_size = $m[1] + 0;
58:
59: } else if (preg_match("/^QUAD_WIDTH (\d+)/", $buf, $m)) {
60: $quad_width = $m[1] + 0;
61:
62: } else if (preg_match("/^RESOLUTION_X (\d+)/", $buf, $m)) {
63: $res_x = $m[1] + 0;
64:
65: } else if (preg_match("/^RESOLUTION_Y (\d+)/", $buf, $m)) {
66: $res_y = $m[1] + 0;
67:
68: } else if (preg_match("/^ENDPROPERTIES/", $buf)) {
69: /* h モードで QUAD_WIDTH がなければ作成 */
70: if ($opt == "h" && $quad_width == -1) {
71: if ($pixel_size > 0 && $res_x > 0 && $res_y > 0) {
72: $quad_width = intval($pixel_size * $res_x / $res_y);
73: print "QUAD_WIDTH {$quad_width}\n";
74: } else {
75: fprintf(STDERR, "Warning: cannot generate QUAD_WIDTH\n");
76: }
77: }
78:
79: /* ここで自身も出力して終了 */
80: print $buf;
81: break;
82: }
83: print $buf;
84: }
85:
86: /* 本体ループ */
87: $body = "";
88: $ischar = false;
89: $num = 0;
90: while (($buf = fgets(STDIN))) {
91: if ($ischar) {
92: $body .= $buf;
93:
94: /* ENDCHAR を書き出したら一旦終わり */
95: if (preg_match("/^ENDCHAR/", $buf)) {
96: $ischar = false;
97: }
98:
99: } else if (preg_match("/^STARTCHAR ([\d\w]+)/", $buf, $m)) {
100: list($code) = sscanf($m[1], "%x");
101: if ($start <= $code && $code <= $end) {
102: $body .= $buf;
103: $ischar = true;
104: $num++;
105: }
106: }
107: }
108:
109: /* 文字数とともに残りを出力 */
110: print "CHARS {$num}\n";
111: print "{$body}";
112: ?>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.