Skip to content

Instantly share code, notes, and snippets.

@andy0130tw
Created June 16, 2026 18:57
Show Gist options
  • Select an option

  • Save andy0130tw/6ab6839f10696b8ddeaac81fe64af8b3 to your computer and use it in GitHub Desktop.

Select an option

Save andy0130tw/6ab6839f10696b8ddeaac81fe64af8b3 to your computer and use it in GitHub Desktop.
= 太BDF計画 =
Programmed by NAGAO, Sadakazu
-- 目 次 ----------------------------------------------------------------------
1. 概要 ... 16(行目)
2. 仕組 ... 25
3. 使用法 ... 64
4. 使用条件 ... 80
5. その他 ... 85
-------------------------------------------------------------------------------
1. 概要
BDFフォントを、*ドット潰れがなるべく生じないように* 横に1ドット太くす
るツールです。1ドットずらしたデータと単純に OR を取るよりも、格段に可
読性が上がります。
ツール自体は Perl5 で書いてあります。
2. 仕組
単に横1ドットずらしたデータと OR を取るだけではドット潰れが生じます。
(例)
1) 元データ oo ooo o o oo
2) 右にずらす oo ooo o o oo
3) (1)or(2) ooo oooooooo ooo
~~~~ ←潰れてしまった
そこで、元データの *ドットのつながりの切目* に着目し、その切目を、
OR を取ったデータに反映させます。
切目を抽出する方法は、2通りあります。
(例1)
1) 元データ oo ooo o o oo
2) (1)の *左端* の切目 ^ ^ ^ ^ ^
3) (1)を右にずらす oo ooo o o oo
4) (1)or(3) ooo oooooooo ooo
5) (4)から(2)を除く ooo ooo o oo ooo
~~~~~ ←潰れが無くなる
(例2)
1) 元データ oo ooo o o oo
2) (1)を右にずらす oo ooo o o oo
3) (2)の *右端* の切目 ^ ^ ^ ^ ^
4) (1)or(2) ooo oooooooo ooo
5) (4)から(3)を除く ooo oooo o o ooo
~~~~~ ←潰れが無くなる
この例では分りにくいかも知れませんので、試してみてください。
また、右端と左端のどちらの切目を選ぶかによって、見た目の印象が変わって
きます。実際に見比べてみるといいでしょう。
3. 使用法
% mkbold [option...] <bdffile>
標準出力に、変換された bdf ファイルが出力されます。
option は、
-l ... 左にずらしたデータをORの対象とする (default)
-r ... 右にずらしたデータをORの対象とする
-L ... 左端の切目を用いて潰れをなくす
-R ... 右端の切目を用いて潰れをなくす (default)
※ フォント名 (-misc-fixed-... など) は変更されません。
注意してください。
4. 使用条件
改造したり、流用したり、再配布したり、自由に使ってください。
しかも無保証です。:)
5. その他
この方式は、昔のPC88用のゲーム(何だったかは忘れた)で文字表示に使われて
いた(と思われる)方法を参考にしました。「太い文字なのにちゃんと読め
る!」という驚きから、自分でその実現方法を考えたという経緯です。
-------------------------------------------------------------------------------
作者 : 永尾 制一 (ながお さだかず)
E-mail: snagao@cs.titech.ac.jp, snagao@tkb.att.ne.jp
WWW : http://gondow-www.cs.titech.ac.jp/~snagao/
#!/usr/local/bin/perl5
#
# -- makes BDF font bold
# programmed by NAGAO, Sadakazu <snagao@cs.titech.ac.jp>
# * public domain *
#
$bdir = 1; # left
$pile = 0; # right
for $opt (@ARGV) {
if ($opt =~ /^-/) { # option
$bdir = 0 if $opt eq '-r'; # right
$bdir = 1 if $opt eq '-l'; # left
$pile = 0 if $opt eq '-R'; # right
$pile = 1 if $opt eq '-L'; # left
next;
} else {
$file = $opt;
last;
}
}
die unless $file;
open F, $file || die;
while (<F>) {
if (/^BITMAP/) {
$bitmap = 1;
print;
next;
}
if (/^ENDCHAR/) {
$bitmap = 0;
print;
next;
}
if ($bitmap) {
chop;
$l = (length($_) / 2) - 1;
if ($bdir) { # left
for $i (0..$l) {
$d[$i] = hex(substr($_, $i*2, 2));
}
shl(\@bold, \@d, $l);
} else {
for $i (0..$l) { # right
$bold[$i] = hex(substr($_, $i*2, 2));
}
shr(\@d, \@bold, $l);
}
if ($pile) { # left
shl(\@tmp, \@bold, $l);
bitcalc(\@d, \@tmp, \@d, \@bold, $l);
} else { # right
shr(\@tmp, \@d, $l);
bitcalc(\@d, \@tmp, \@bold, \@d, $l);
}
# print
for $i (0..$l) {
printf "%02x", $d[$i];
}
print "\n";
next;
}
print;
}
close F;
exit 0;
sub shl {
my ($dout, $din, $size) = @_;
my $c = 0, $d, $i;
for ($i = $size; $i >= 0; $i--) {
$d = $c;
$c = ($din->[$i] & 0x80) >> 7;
$dout->[$i] = (($din->[$i] << 1) & 0xff) | $d;
}
}
sub shr {
my ($dout, $din, $size) = @_;
my $c = 0, $d, $i;
for $i (0..$size) {
$d = $c;
$c = ($din->[$i] & 0x01) << 7;
$dout->[$i] = ($din->[$i] >> 1) | $d;
}
}
sub bitcalc {
my ($out, $d1, $d2, $d3, $size) = @_;
for $i (0..$size) {
$out->[$i] = ~$d1->[$i] & $d2->[$i] | $d3->[$i];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment