mirror of
https://github.com/simonowen/apple1emu.git
synced 2024-12-26 23:29:15 +00:00
- Added lower-case characters to terminal font
- Added font image (PNG) for easy font editing, and script to convert to font.bin needed by emulator
This commit is contained in:
parent
4b1bf5d034
commit
64db2eff61
64
font.pl
Normal file
64
font.pl
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Convert PNG image to raw font binary for Apple 1 emulator
|
||||||
|
#
|
||||||
|
# Makes lots of assumptions about the input image!
|
||||||
|
|
||||||
|
use Compress::Zlib;
|
||||||
|
|
||||||
|
# Input image and output data file
|
||||||
|
my $input = 'font.png';
|
||||||
|
my $output = 'font.bin';
|
||||||
|
|
||||||
|
# Our characters are 6 pixels wide
|
||||||
|
$chrw = 6;
|
||||||
|
|
||||||
|
|
||||||
|
# Slurp the entire PNG image
|
||||||
|
open INPUT, "<$input" and binmode INPUT or die "$input: $!\n";
|
||||||
|
read INPUT, $data='', -s $input;
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
|
# Find and extract the image dimensions
|
||||||
|
$data =~ /IHDR(.{8})/s;
|
||||||
|
($w,$h) = unpack "N2", $1;
|
||||||
|
|
||||||
|
# Extract and expand the compressed image data
|
||||||
|
($data) = $data =~ /IDAT(.*).{8}IEND/s;
|
||||||
|
$data = Compress::Zlib::uncompress($data);
|
||||||
|
|
||||||
|
# Remove the type byte from the start of each line
|
||||||
|
$w_2 = $w/2;
|
||||||
|
$data =~ s/.(.{$w_2})/$1/sg;
|
||||||
|
|
||||||
|
@data = ();
|
||||||
|
|
||||||
|
# Unpack the pixel nibbles
|
||||||
|
foreach (unpack "C*", $data) {
|
||||||
|
push @data, $_>>4, $_&1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
open OUTPUT, ">$output" and binmode OUTPUT or die "$output: $!\n";
|
||||||
|
|
||||||
|
# Process all characters
|
||||||
|
foreach $chr (0..$w/$chrw-1)
|
||||||
|
{
|
||||||
|
# Process the image line by line
|
||||||
|
foreach $y (0..$h-1)
|
||||||
|
{
|
||||||
|
# Locate the pixel data for the current character
|
||||||
|
my $x = $chr*$chrw + $w*$y;
|
||||||
|
my $b = 0;
|
||||||
|
|
||||||
|
# Pack the 1bpp data into a single byte
|
||||||
|
foreach (@data[$x..$x+$chrw-1]) {
|
||||||
|
$b = ($b << 1) | $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Left-align within the byte and output it
|
||||||
|
print OUTPUT chr($b << (8-$chrw));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close OUTPUT;
|
Loading…
Reference in New Issue
Block a user