Blame lib/Font/TTF/EBLC.pm

Packit 5d935b
package Font::TTF::EBLC;
Packit 5d935b
Packit 5d935b
=head1 NAME
Packit 5d935b
Packit 5d935b
Font::TTF::EBLC - Embeeded Bitmap Location Table
Packit 5d935b
Packit 5d935b
=head1 DESCRIPTION
Packit 5d935b
Packit 5d935b
Contains the sizes and glyph ranges of bitmaps, and the offsets to
Packit 5d935b
glyph bitmap data in indexSubTables for EBDT.
Packit 5d935b
Packit 5d935b
Possibly contains glyph metrics information.
Packit 5d935b
Packit 5d935b
=head1 INSTANCE VARIABLES
Packit 5d935b
Packit 5d935b
The information specified 'B<(R)>ead only' is read only, those
Packit 5d935b
are calculated from EBDT, when it is 'update'-ed.
Packit 5d935b
Packit 5d935b
=over 4
Packit 5d935b
Packit 5d935b
=item bitmapSizeTable
Packit 5d935b
Packit 5d935b
An array of tables of following information
Packit 5d935b
Packit 5d935b
=over 8
Packit 5d935b
Packit 5d935b
=item indexSubTableArrayOffset (R)
Packit 5d935b
Packit 5d935b
=item indexTablesSize (R)
Packit 5d935b
Packit 5d935b
=item numberOfIndexSubTables (R)
Packit 5d935b
Packit 5d935b
=item colorRef
Packit 5d935b
Packit 5d935b
=item hori
Packit 5d935b
Packit 5d935b
=item vert
Packit 5d935b
Packit 5d935b
=item startGlyphIndex (R)
Packit 5d935b
Packit 5d935b
=item endGlyphIndex (R)
Packit 5d935b
Packit 5d935b
=item ppemX
Packit 5d935b
Packit 5d935b
=item ppemY
Packit 5d935b
Packit 5d935b
=item bitDepth
Packit 5d935b
Packit 5d935b
=item flags
Packit 5d935b
Packit 5d935b
=back
Packit 5d935b
Packit 5d935b
=item indexSubTableArray (R)
Packit 5d935b
Packit 5d935b
An array which contains range information.
Packit 5d935b
Packit 5d935b
=item indexSubTable (R)
Packit 5d935b
Packit 5d935b
An array which contains offsets of EBDT table.
Packit 5d935b
Packit 5d935b
=back
Packit 5d935b
Packit 5d935b
=head1 METHODS
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
use strict;
Packit 5d935b
use vars qw(@ISA);
Packit 5d935b
require Font::TTF::Table;
Packit 5d935b
Packit 5d935b
@ISA = qw(Font::TTF::Table);
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head2 $t->read
Packit 5d935b
Packit 5d935b
Reads the location information of embedded bitmap from the TTF file into memory
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub read
Packit 5d935b
{
Packit 5d935b
    my ($self) = @_;
Packit 5d935b
Packit 5d935b
    $self->SUPER::read or return $self;
Packit 5d935b
Packit 5d935b
    my ($fh) = $self->{' INFILE'};
Packit 5d935b
    my ($i, $dat);
Packit 5d935b
    my ($indexSubTableArrayOffset,
Packit 5d935b
        $indexTablesSize,
Packit 5d935b
        $numberOfIndexSubTables,
Packit 5d935b
        $colorRef);
Packit 5d935b
    my ($startGlyphIndex,
Packit 5d935b
        $endGlyphIndex,
Packit 5d935b
        $ppemX, $ppemY,
Packit 5d935b
        $bitDepth, $flags);
Packit 5d935b
    my (@hori, @vert);
Packit 5d935b
    my ($bst, $ista, $ist);
Packit 5d935b
    my ($j);
Packit 5d935b
Packit 5d935b
Packit 5d935b
    # eblcHeader
Packit 5d935b
    $fh->read($dat, 4);
Packit 5d935b
    $self->{'version'} = unpack("N",$dat);
Packit 5d935b
Packit 5d935b
    $fh->read($dat, 4);
Packit 5d935b
    $self->{'Num'} = unpack("N",$dat);
Packit 5d935b
Packit 5d935b
    # bitmapSizeTable
Packit 5d935b
    for ($i = 0; $i < $self->{'Num'}; $i++) {
Packit 5d935b
        $fh->read($dat, 16);
Packit 5d935b
        ($indexSubTableArrayOffset, $indexTablesSize,
Packit 5d935b
         $numberOfIndexSubTables, $colorRef) = unpack("NNNN", $dat);
Packit 5d935b
        $fh->read($dat, 12); @hori = unpack("cccccccccccc", $dat);
Packit 5d935b
        $fh->read($dat, 12); @vert = unpack("cccccccccccc", $dat);
Packit 5d935b
Packit 5d935b
        $fh->read($dat, 8);
Packit 5d935b
        ($startGlyphIndex, $endGlyphIndex,
Packit 5d935b
         $ppemX, $ppemY, $bitDepth, $flags) = unpack("nnCCCC", $dat);
Packit 5d935b
Packit 5d935b
        $self->{'bitmapSizeTable'}[$i] = {
Packit 5d935b
            'indexSubTableArrayOffset' => $indexSubTableArrayOffset,
Packit 5d935b
            'indexTablesSize' => $indexTablesSize,
Packit 5d935b
            'numberOfIndexSubTables' => $numberOfIndexSubTables,
Packit 5d935b
            'colorRef' => $colorRef,
Packit 5d935b
            'hori' => [@hori],
Packit 5d935b
            'vert' => [@vert],
Packit 5d935b
            'startGlyphIndex' => $startGlyphIndex,
Packit 5d935b
            'endGlyphIndex' => $endGlyphIndex,
Packit 5d935b
            'ppemX' => $ppemX,
Packit 5d935b
            'ppemY' => $ppemY,
Packit 5d935b
            'bitDepth' => $bitDepth,
Packit 5d935b
            'flags' => $flags
Packit 5d935b
            };
Packit 5d935b
    }
Packit 5d935b
Packit 5d935b
    for ($i = 0; $i < $self->{'Num'}; $i++) {
Packit 5d935b
        my ($count, $x);
Packit 5d935b
Packit 5d935b
        $bst = $self->{'bitmapSizeTable'}[$i];
Packit 5d935b
Packit 5d935b
        for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) {
Packit 5d935b
            $ista = {};
Packit 5d935b
Packit 5d935b
            # indexSubTableArray
Packit 5d935b
            $self->{'indexSubTableArray'}[$i][$j] = $ista;
Packit 5d935b
            $fh->read($dat, 8);
Packit 5d935b
            ($ista->{'firstGlyphIndex'},
Packit 5d935b
             $ista->{'lastGlyphIndex'},
Packit 5d935b
             $ista->{'additionalOffsetToIndexSubtable'})
Packit 5d935b
                = unpack("nnN", $dat);
Packit 5d935b
        }
Packit 5d935b
Packit 5d935b
        # indexSubTable
Packit 5d935b
        # indexSubHeader
Packit 5d935b
        $fh->read($dat, 8);
Packit 5d935b
        ($bst->{'indexFormat'}, 
Packit 5d935b
         $bst->{'imageFormat'}, 
Packit 5d935b
         $bst->{'imageDataOffset'}) = unpack("nnN", $dat);
Packit 5d935b
Packit 5d935b
        die "Only indexFormat == 1 is supported" unless ($bst->{'indexFormat'} == 1);
Packit 5d935b
Packit 5d935b
        for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) {
Packit 5d935b
            $ista = $self->{'indexSubTableArray'}[$i][$j];
Packit 5d935b
            $count = $ista->{'lastGlyphIndex'} - $ista->{'firstGlyphIndex'} + 1 + 1;
Packit 5d935b
            $fh->seek($self->{' OFFSET'} + $bst->{'indexSubTableArrayOffset'}
Packit 5d935b
                      + $ista->{'additionalOffsetToIndexSubtable'} + 8, 0);
Packit 5d935b
Packit 5d935b
#           $count += 2 if $j < $bst->{'numberOfIndexSubTables'} - 1;
Packit 5d935b
Packit 5d935b
            $fh->read($dat, 4*$count);
Packit 5d935b
Packit 5d935b
            $self->{'indexSubTable'}[$i][$j] = [unpack("N*", $dat)];
Packit 5d935b
        }
Packit 5d935b
    }
Packit 5d935b
Packit 5d935b
    $self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
=head2 $t->out($fh)
Packit 5d935b
Packit 5d935b
Outputs the location information of embedded bitmap for this font.
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub out
Packit 5d935b
{
Packit 5d935b
    my ($self, $fh) = @_;
Packit 5d935b
    my ($i);
Packit 5d935b
Packit 5d935b
    return $self->SUPER::out($fh) unless $self->{' read'};
Packit 5d935b
Packit 5d935b
    my ($bst_array) = $self->{'bitmapSizeTable'};
Packit 5d935b
Packit 5d935b
    $fh->print(pack("N", 0x00020000));
Packit 5d935b
    $fh->print(pack("N", $self->{'Num'}));
Packit 5d935b
Packit 5d935b
    for ($i = 0; $i < $self->{'Num'}; $i++) {
Packit 5d935b
        my ($bst) = $bst_array->[$i];
Packit 5d935b
Packit 5d935b
        $fh->print(pack("NNNN", 
Packit 5d935b
                        $bst->{'indexSubTableArrayOffset'},
Packit 5d935b
                        $bst->{'indexTablesSize'},
Packit 5d935b
                        $bst->{'numberOfIndexSubTables'},
Packit 5d935b
                        $bst->{'colorRef'}));
Packit 5d935b
        $fh->print(pack("cccccccccccc", @{$bst->{'hori'}}));
Packit 5d935b
        $fh->print(pack("cccccccccccc", @{$bst->{'vert'}}));
Packit 5d935b
        $fh->print(pack("nnCCCC", $bst->{'startGlyphIndex'}, 
Packit 5d935b
                        $bst->{'endGlyphIndex'}, $bst->{'ppemX'},
Packit 5d935b
                        $bst->{'ppemY'}, $bst->{'bitDepth'}, $bst->{'flags'}));
Packit 5d935b
    }
Packit 5d935b
Packit 5d935b
    for ($i = 0; $i < $self->{'Num'}; $i++) {
Packit 5d935b
        my ($bst) = $bst_array->[$i];
Packit 5d935b
        my ($j);
Packit 5d935b
Packit 5d935b
        for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) {
Packit 5d935b
            my ($ista) = $self->{'indexSubTableArray'}[$i][$j];
Packit 5d935b
Packit 5d935b
            $fh->print("nnN",
Packit 5d935b
                       $ista->{'firstGlyphIndex'},
Packit 5d935b
                       $ista->{'lastGlyphIndex'},
Packit 5d935b
                       $ista->{'additionalOffsetToIndexSubtable'});
Packit 5d935b
        }
Packit 5d935b
Packit 5d935b
        $fh->print(pack("nnN", $bst->{'indexFormat'}, $bst->{'imageFormat'}, 
Packit 5d935b
                        $bst->{'imageDataOffset'}));
Packit 5d935b
Packit 5d935b
        die "Only indexFormat == 1 is supported" unless ($bst->{'indexFormat'} == 1);
Packit 5d935b
Packit 5d935b
        for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) {
Packit 5d935b
            $fh->print(pack("N*", $self->{'indexSubTable'}[$i][$j]));
Packit 5d935b
        }
Packit 5d935b
    }
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
1;
Packit 5d935b
Packit 5d935b
=head1 BUGS
Packit 5d935b
Packit 5d935b
Only indexFormat ==1 is implemented.  XML output is not supported (yet).
Packit 5d935b
Packit 5d935b
=head1 AUTHOR
Packit 5d935b
Packit 5d935b
NIIBE Yutaka L<mailto:gniibe@fsij.org>.  
Packit 5d935b
This was written at the CodeFest Akihabara 2006 hosted by FSIJ.
Packit 5d935b
Packit 5d935b
Patch sent with licensing requirements??
Packit 5d935b
Packit 5d935b
=head1 LICENSING
Packit 5d935b
Packit 5d935b
Copyright (c) 1998-2016, SIL International (http://www.sil.org) 
Packit 5d935b
Packit 5d935b
This module is released under the terms of the Artistic License 2.0. 
Packit 5d935b
For details, see the full text of the license in the file LICENSE.
Packit 5d935b
Packit 5d935b
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b