Blame lib/Font/TTF/Glyf.pm

Packit 5d935b
package Font::TTF::Glyf;
Packit 5d935b
Packit 5d935b
=head1 NAME
Packit 5d935b
Packit 5d935b
Font::TTF::Glyf - The Glyf data table
Packit 5d935b
Packit 5d935b
=head1 DESCRIPTION
Packit 5d935b
Packit 5d935b
This is a stub table. The real data is held in the loca table. If you want to get a glyf
Packit 5d935b
look it up in the loca table as C<$f->{'loca'}{'glyphs'}[$num]>. It will not be here!
Packit 5d935b
Packit 5d935b
The difference between reading this table as opposed to the loca table is that
Packit 5d935b
reading this table will cause updated glyphs to be written out rather than just
Packit 5d935b
copying the glyph information from the input file. This causes font writing to be
Packit 5d935b
slower. So read the glyf as opposed to the loca table if you want to change glyf
Packit 5d935b
data. Read the loca table only if you are just wanting to read the glyf information.
Packit 5d935b
Packit 5d935b
This class is used when writing the glyphs though.
Packit 5d935b
Packit 5d935b
=head1 METHODS
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
Packit 5d935b
use strict;
Packit 5d935b
use vars qw(@ISA);
Packit 5d935b
@ISA = qw(Font::TTF::Table);
Packit 5d935b
Packit 5d935b
=head2 $t->read
Packit 5d935b
Packit 5d935b
Reads the C<loca> table instead!
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub read
Packit 5d935b
{
Packit 5d935b
    my ($self) = @_;
Packit 5d935b
    
Packit 5d935b
    $self->{' PARENT'}{'loca'}->read;
Packit 5d935b
    $self->{' read'} = 1;
Packit 5d935b
    $self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
# Internal function called by loca -- decompresses WOFF data if needed.
Packit 5d935b
Packit 5d935b
sub _read
Packit 5d935b
{
Packit 5d935b
	my ($self) = @_;
Packit 5d935b
    $self->SUPER::read or return $self;
Packit 5d935b
	
Packit 5d935b
	# Nothing else to do
Packit 5d935b
	$self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
=head2 $t->out($fh)
Packit 5d935b
Packit 5d935b
Writes out all the glyphs in the parent's location table, calculating a new
Packit 5d935b
output location for each one.
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
# ' match for syntax coloring
Packit 5d935b
Packit 5d935b
sub out
Packit 5d935b
{
Packit 5d935b
    my ($self, $fh) = @_;
Packit 5d935b
    my ($i, $loca, $offset, $numGlyphs);
Packit 5d935b
Packit 5d935b
    return $self->SUPER::out($fh) unless $self->{' read'};
Packit 5d935b
Packit 5d935b
    $loca = $self->{' PARENT'}{'loca'}{'glyphs'};
Packit 5d935b
    $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'};
Packit 5d935b
Packit 5d935b
    $offset = 0;
Packit 5d935b
    for ($i = 0; $i < $numGlyphs; $i++)
Packit 5d935b
    {
Packit 5d935b
        next unless defined $loca->[$i];
Packit 5d935b
        $loca->[$i]->update;
Packit 5d935b
        $loca->[$i]{' OUTLOC'} = $offset;
Packit 5d935b
        $loca->[$i]->out($fh);
Packit 5d935b
        $offset += $loca->[$i]{' OUTLEN'};
Packit 5d935b
    }
Packit 5d935b
    $self->{' PARENT'}{'head'}{'indexToLocFormat'} = ($offset >= 0x20000);
Packit 5d935b
    $self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head2 $t->out_xml($context, $depth)
Packit 5d935b
Packit 5d935b
Outputs all the glyphs in the glyph table just where they are supposed to be output!
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub out_xml
Packit 5d935b
{
Packit 5d935b
    my ($self, $context, $depth) = @_;
Packit 5d935b
    my ($fh) = $context->{'fh'};
Packit 5d935b
    my ($loca, $i, $numGlyphs);
Packit 5d935b
Packit 5d935b
    $loca = $self->{' PARENT'}{'loca'}{'glyphs'};
Packit 5d935b
    $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'};
Packit 5d935b
    
Packit 5d935b
    for ($i = 0; $i < $numGlyphs; $i++)
Packit 5d935b
    {
Packit 5d935b
        $context->{'gid'} = $i;
Packit 5d935b
        $loca->[$i]->out_xml($context, $depth) if (defined $loca->[$i]);
Packit 5d935b
    }
Packit 5d935b
Packit 5d935b
    $self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head2 $t->XML_start($context, $tag, %attrs)
Packit 5d935b
Packit 5d935b
Pass control to glyphs as they occur
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub XML_start
Packit 5d935b
{
Packit 5d935b
    my ($self) = shift;
Packit 5d935b
    my ($context, $tag, %attrs) = @_;
Packit 5d935b
Packit 5d935b
    if ($tag eq 'glyph')
Packit 5d935b
    {
Packit 5d935b
        $context->{'tree'}[-1] = Font::TTF::Glyph->new(read => 2, PARENT => $self->{' PARENT'});
Packit 5d935b
        $context->{'receiver'} = $context->{'tree'}[-1];
Packit 5d935b
    }
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head2 $t->XML_end($context, $tag, %attrs)
Packit 5d935b
Packit 5d935b
Collect up glyphs and put them into the loca table
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub XML_end
Packit 5d935b
{
Packit 5d935b
    my ($self) = shift;
Packit 5d935b
    my ($context, $tag, %attrs) = @_;
Packit 5d935b
Packit 5d935b
    if ($tag eq 'glyph')
Packit 5d935b
    {
Packit 5d935b
        unless (defined $context->{'glyphs'})
Packit 5d935b
        {
Packit 5d935b
            if (defined $self->{' PARENT'}{'loca'})
Packit 5d935b
            { $context->{'glyphs'} = $self->{' PARENT'}{'loca'}{'glyphs'}; }
Packit 5d935b
            else
Packit 5d935b
            { $context->{'glyphs'} = []; }
Packit 5d935b
        }
Packit 5d935b
        $context->{'glyphs'}[$attrs{'gid'}] = $context->{'tree'}[-1];
Packit 5d935b
        return $context;
Packit 5d935b
    } else
Packit 5d935b
    { return $self->SUPER::XML_end(@_); }
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
1;
Packit 5d935b
Packit 5d935b
=head1 BUGS
Packit 5d935b
Packit 5d935b
None known
Packit 5d935b
Packit 5d935b
=head1 AUTHOR
Packit 5d935b
Packit 5d935b
Martin Hosken L<http://scripts.sil.org/FontUtils>. 
Packit 5d935b
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
Packit 5d935b