| 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 |
|
|---|