File:  [Isaki's NoNo m68k/m88k emulator] / nono / util / mkcgrom / bdfcut.php
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:58 2026 UTC (3 months ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

<?php
//
// BDF ファイルから必要な範囲だけ抜き出す
// Copyright (C) 2012 Tetsuya Isaki
//

// 書式
//	bdfcut.php [command] < in.bdf > out.bdf
//
// 解説
//	BDF ファイルから必要な範囲だけを抜き出します。
//	標準入力から読み込み、標準出力に書き出します。
//
//	範囲は command で指定します。今のところ以下が使用できます。
//
//	  h : Unicode の BDF からひらがなのみを抜き出します。
//	  r : Unicode の BDF からひらがな、カタカナのみを抜き出します。
//	  k : JISX0208 の BDF から非漢字のみを抜き出します。

	$opt = $argv[1];

	$range = array();

	// オプションによって出力範囲を指定
	if ($opt == "h") {
		// Unicode のひらがなのみ取り出す
		$range[] = array(0x3041, 0x309f);
	} else if ($opt == "r") {
		// Unicode のひらがな、カタカナを取り出す
		$range[] = array(0x3041, 0x30fc);
		// 、。
		$range[] = array(0x3001, 0x3002);
		// 「」
		$range[] = array(0x300c, 0x300d);
	} else if ($opt == "k") {
		// JIS X 0208 の非漢字のみ取り出す
		$range[] = array(0x2120, 0x287f);
	}

	// どのオプションもなければ終了
	if (count($range) < 1) {
		fprintf(STDERR, "usage: {$argv[0]} [command] < in.bdf > out.bdf\n");
		fprintf(STDERR, "   h: hiragana only in unicode\n");
		fprintf(STDERR, "   r: hira and katakana in unicode\n");
		fprintf(STDERR, "   k: non-kanji only in JIS X 0208\n");
		exit(1);
	}

	// プロパティ部分。
	// o TTF から縦横比を変えて変換した BDF には QUAD_WIDTH が含まれてない
	//   ので、ついでにここで追加してやる。
	$pixel_size = -1;
	$quad_width = -1;
	$res_x = -1;
	$res_y = -1;
	while (($buf = fgets(STDIN))) {
		if (preg_match("/^PIXEL_SIZE (\d+)/", $buf, $m)) {
			$pixel_size = $m[1] + 0;

		} else if (preg_match("/^QUAD_WIDTH (\d+)/", $buf, $m)) {
			$quad_width = $m[1] + 0;

		} else if (preg_match("/^RESOLUTION_X (\d+)/", $buf, $m)) {
			$res_x = $m[1] + 0;

		} else if (preg_match("/^RESOLUTION_Y (\d+)/", $buf, $m)) {
			$res_y = $m[1] + 0;

		} else if (preg_match("/^ENDPROPERTIES/", $buf)) {
			// h モードで QUAD_WIDTH がなければ作成
			if ($opt == "h" && $quad_width == -1) {
				if ($pixel_size > 0 && $res_x > 0 && $res_y > 0) {
					$quad_width = intval($pixel_size * $res_x / $res_y);
					print "QUAD_WIDTH {$quad_width}\n";
				} else {
					fprintf(STDERR, "Warning: cannot generate QUAD_WIDTH\n");
				}
			}

			// ここで自身も出力して終了
			print $buf;
			break;
		}
		print $buf;
	}

	// 本体ループ
	$body = "";
	$ischar = false;
	$num = 0;
	while (($buf = fgets(STDIN))) {
		if ($ischar) {
			$body .= $buf;

			// ENDCHAR を書き出したら一旦終わり
			if (preg_match("/^ENDCHAR/", $buf)) {
				$ischar = false;
			}

		} else if (preg_match("/^STARTCHAR ([\d\w]+)/", $buf, $m)) {
			list($code) = sscanf($m[1], "%x");
			if (inrange($code)) {
				$body .= $buf;
				$ischar = true;
				$num++;
			}
		}
	}

	// 文字数とともに残りを出力
	print "CHARS {$num}\n";
	print "{$body}";
?>
<?php
function inrange($code)
{
	global $range;

	foreach ($range as $r) {
		if ($r[0] <= $code && $code <= $r[1]) {
			return true;
		}
	}
	return false;
}
?>

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.