# Extract bitmaps from a some bitmap fonts and check that they match the # images in the 'bdf_bitmaps.txt' file, which were extracted by hand. use strict; use warnings; use File::Spec::Functions; use Font::FreeType; my $TESTS_PER_BITMAP_FONT; BEGIN { $TESTS_PER_BITMAP_FONT = 4 * 3 }; # Two font formats tested, but we have to skip one set of tests for the FNT # format, because it doesn't have the images above char code 255. use Test::More tests => 2 * $TESTS_PER_BITMAP_FONT - 3; my ($WD, $HT) = (5, 7); my $data_dir = catdir(qw( t data )); my $bmp_filename = catfile($data_dir, 'bdf_bitmaps.txt'); my $ft = Font::FreeType->new; foreach my $fmt ('bdf', 'fnt') { # Skip BDF tests in versions of Freetype that don't have a BDF driver. if ($fmt eq 'bdf' && $ft->version lt '2.1.1') { SKIP: { skip 'BDF not supported until FreeType 2.1.1', $TESTS_PER_BITMAP_FONT; } next; } # Load the bitmap font file file. my $face = $ft->face(catfile($data_dir, "5x7.$fmt")); # Load bitmaps from a file and compare them against ones from the font. open my $bmp_file, '<', $bmp_filename or die "error opening test bitmap data file '$bmp_filename': $!"; while (<$bmp_file>) { /^([\dA-F]+)$/i or die "badly formated bitmap test file"; my $unicode = $1; my $charcode = hex $unicode; my $desc = "$fmt format font, glyph $unicode"; # Read test bitmap. my @expected; while (<$bmp_file>) { chomp; length == $WD or die "short line in bitmap test file"; # It's easier to type spaces and hashes than these characters. s/ /\x00/g; s/#/\xFF/g; push @expected, $_; last if @expected == $HT; } # FNT doesn't do Unicode, it seems, and in older versions of FreeType # char 255 is inaccessible for some reason. next if $fmt eq 'fnt' && $charcode > 254; my $glyph = $face->glyph_from_char_code($charcode); my ($bmp, $left, $top) = $glyph->bitmap; is_deeply($bmp, \@expected, "$desc: bitmap image matches"); is($left, 0, "$desc: bitmap starts 0 pixels to left of origin"); is($top, 6, "$desc: bitmap starts 6 pixels above origin"); } } # vim:ft=perl ts=4 sw=4 expandtab: