https://bitbucket.org/hudson/magic-lantern
Raw File
Tip revision: c326bc9a68a6bde8f07621fd89cb1cf9c67080f4 authored by a1ex on 22 October 2013, 21:31:00 UTC
Close branch 60d.
Tip revision: c326bc9
mkfont
#!/usr/bin/perl
#
# Generate a program-space font definition from a textual representation.
# For speed in representation, each 8-line character is split into
# separate bytes, stripped by the line number.
#
use warnings;
use strict;
use Getopt::Long;

my $font_width		= 8;
my $font_height		= 12;
my $font_type		= 'const unsigned';
my $font_name		= 'font';

GetOptions(
	"name=s"		=> \$font_name,
	"width=i"		=> \$font_width,
	"height=i"		=> \$font_height,
) or die "$0: Bad argument\n";


print <<"";
#include "font.h"
struct font ${font_name} = {
	.width		= $font_width,
	.height		= $font_height,
	.bitmap		= {

# Paragraph mode
$/ = "\n\n";

my $index = 0;
my $base = ord( ' ' );
my $offset = 0;

while(<>)
{
	my ($key,@rows) = split /\n/;
	my ($pos) = $key =~ /^(.) =/;

	for my $line (0..$font_height-1)
	{
		my $row = $rows[ $line ] || ( ' ' x $font_width );
		# Pad with spaces to the width of the font
		$row .= ' ' x (64 - length($row));

		my $bits = $row;
		$bits =~ s/[^ ]/1/g;
		$bits =~ s/[ ]/0/g;

		# Fix $pos for special chars
		$pos = "\\$pos" if $pos eq '\\' or $pos eq '\'';

		my ($low,$high) = unpack( "NN", pack( "B*", $bits ) );

		# Strip trailing spaces for display
		$row =~ s/ *$//;

		print "// $row\n"
			if $font_width > 32;

		printf "[ '%s' + (%2d << 7) ] = 0x%08x,%s\n",
			$pos,
			$line,
			$low,
			$font_width > 32 ? "" : " // $row",
			;

		printf "[ '%s' + ((128+%2d) << 7) ] = 0x%08x,\n",
			$pos,
			$line,
			$high,
		if $font_width > 32;
	}

	print "\n";
}


print <<"";
	},
};

__END__
back to top