1 | #!/usr/bin/perl
|
---|
2 | use warnings;
|
---|
3 | use strict;
|
---|
4 |
|
---|
5 | # convert from *unicode* x11 bdf files to the font description used in makefont.pl
|
---|
6 |
|
---|
7 | die "Usage: perl $0 < input.bcf > output.txt" if -t STDIN or @ARGV;
|
---|
8 |
|
---|
9 | sub handle_char {
|
---|
10 | my ($char) = @_;
|
---|
11 |
|
---|
12 | my $bitmap_data;
|
---|
13 | my $codepoint;
|
---|
14 | my ($bbx_h, $bbx_w, $bbx_x, $bbx_y);
|
---|
15 |
|
---|
16 | for ( grep { defined and length } split /\n/, $char ) {
|
---|
17 | if ( /^ENCODING (\d+)$/ ) {
|
---|
18 | $codepoint = $1;
|
---|
19 | } elsif ( /^BBX\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s*$/ ) {
|
---|
20 | ($bbx_w, $bbx_h, $bbx_x, $bbx_y) = ($1,$2,$3,$4);
|
---|
21 | } elsif ( /^BITMAP(.*)$/ ) {
|
---|
22 | $bitmap_data = $1;
|
---|
23 | } elsif ( defined $bitmap_data ) {
|
---|
24 | $bitmap_data .= "\n$_";
|
---|
25 | }
|
---|
26 | }
|
---|
27 |
|
---|
28 | die "bad char: no bitmap\n$char" unless defined $bitmap_data;
|
---|
29 | die "bad char: no codepoint\n$char" unless defined $codepoint;
|
---|
30 | die "bad char: no bounding box\n$char" unless defined $bbx_h;
|
---|
31 |
|
---|
32 | print "\nU+".unpack("H4", pack "n", $codepoint)."\n";
|
---|
33 | for my $row ( grep { defined and length } split /\s+/, $bitmap_data ) {
|
---|
34 | my $bits = unpack "B*", pack "H*", $row;
|
---|
35 | $bits = substr $bits, 0, $bbx_w; # doesn't work??
|
---|
36 | $bits =~ tr/01/.X/;
|
---|
37 | print "$bits\n";
|
---|
38 | }
|
---|
39 | }
|
---|
40 |
|
---|
41 | print "# generated with bdf2fontdescr.pl\n";
|
---|
42 |
|
---|
43 | my $char;
|
---|
44 | while ( <STDIN> ) {
|
---|
45 | tr/[\r\n]//d;
|
---|
46 |
|
---|
47 | if ( /^FONT (.+)$/ ) {
|
---|
48 | warn "Font does not appear to be an ISO10646 (Unicode) font.\n"
|
---|
49 | if !/-ISO10646-/i && !/-iso8859-1/i; # ISO8859-1 has the same codepoints
|
---|
50 | } elsif ( /^STARTCHAR/ ) {
|
---|
51 | $char = '';
|
---|
52 | } elsif ( /^ENDCHAR/ ) {
|
---|
53 | handle_char($char);
|
---|
54 | undef $char;
|
---|
55 | } elsif ( /^COMMENT (.+)$/ ) {
|
---|
56 | print "# $1\n";
|
---|
57 | } elsif ( defined $char ) {
|
---|
58 | $char .= $_."\n";
|
---|
59 | }
|
---|
60 | }
|
---|
61 |
|
---|