diff --git a/font.bin b/font.bin index aead2f7..e632f9e 100644 Binary files a/font.bin and b/font.bin differ diff --git a/font.pl b/font.pl new file mode 100644 index 0000000..8ab1a90 --- /dev/null +++ b/font.pl @@ -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; diff --git a/font.png b/font.png new file mode 100644 index 0000000..b2d5426 Binary files /dev/null and b/font.png differ