|
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 |
|