Blame lib/Font/TTF/Prop.pm

Packit 5d935b
package Font::TTF::Prop;
Packit 5d935b
Packit 5d935b
=head1 NAME
Packit 5d935b
Packit 5d935b
Font::TTF::Prop - Glyph Properties table in a font
Packit 5d935b
Packit 5d935b
=head1 DESCRIPTION
Packit 5d935b
Packit 5d935b
=head1 INSTANCE VARIABLES
Packit 5d935b
Packit 5d935b
=over
Packit 5d935b
Packit 5d935b
=item version
Packit 5d935b
Packit 5d935b
=item default
Packit 5d935b
Packit 5d935b
=item lookup
Packit 5d935b
Packit 5d935b
Hash of property values keyed by glyph number
Packit 5d935b
Packit 5d935b
=item lookupFormat
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
use Font::TTF::Utils;
Packit 5d935b
use Font::TTF::AATutils;
Packit 5d935b
use Font::TTF::Segarr;
Packit 5d935b
Packit 5d935b
@ISA = qw(Font::TTF::Table);
Packit 5d935b
Packit 5d935b
=head2 $t->read
Packit 5d935b
Packit 5d935b
Reads the table into memory
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub read
Packit 5d935b
{
Packit 5d935b
    my ($self) = @_;
Packit 5d935b
    my ($dat, $fh);
Packit 5d935b
    my ($version, $lookupPresent, $default);
Packit 5d935b
    
Packit 5d935b
    $self->SUPER::read or return $self;
Packit 5d935b
Packit 5d935b
    $fh = $self->{' INFILE'};
Packit 5d935b
    $fh->read($dat, 8);
Packit 5d935b
    ($version, $lookupPresent, $default) = TTF_Unpack("vSS", $dat);
Packit 5d935b
Packit 5d935b
    if ($lookupPresent) {
Packit 5d935b
        my ($format, $lookup) = AAT_read_lookup($fh, 2, $self->{' LENGTH'} - 8, $default);
Packit 5d935b
        $self->{'lookup'} = $lookup;
Packit 5d935b
        $self->{'format'} = $format;
Packit 5d935b
    }
Packit 5d935b
Packit 5d935b
    $self->{'version'} = $version;
Packit 5d935b
    $self->{'default'} = $default;
Packit 5d935b
Packit 5d935b
    $self;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head2 $t->out($fh)
Packit 5d935b
Packit 5d935b
Writes the table to a file either from memory or by copying
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub out
Packit 5d935b
{
Packit 5d935b
    my ($self, $fh) = @_;
Packit 5d935b
    my ($default, $lookup);
Packit 5d935b
    
Packit 5d935b
    return $self->SUPER::out($fh) unless $self->{' read'};
Packit 5d935b
Packit 5d935b
    $default = $self->{'default'};
Packit 5d935b
    $lookup = $self->{'lookup'};
Packit 5d935b
    $fh->print(TTF_Pack("vSS", $self->{'version'}, (defined $lookup ? 1 : 0), $default));
Packit 5d935b
Packit 5d935b
    AAT_write_lookup($fh, $self->{'format'}, $lookup, 2, $default) if (defined $lookup);
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
=head2 $t->minsize()
Packit 5d935b
Packit 5d935b
Returns the minimum size this table can be. If it is smaller than this, then the table
Packit 5d935b
must be bad and should be deleted or whatever.
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub minsize
Packit 5d935b
{
Packit 5d935b
    return 8;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
=head2 $t->print($fh)
Packit 5d935b
Packit 5d935b
Prints a human-readable representation of the table
Packit 5d935b
Packit 5d935b
=cut
Packit 5d935b
Packit 5d935b
sub print
Packit 5d935b
{
Packit 5d935b
    my ($self, $fh) = @_;
Packit 5d935b
    my ($lookup);
Packit 5d935b
    
Packit 5d935b
    $self->read;
Packit 5d935b
    
Packit 5d935b
    $fh = 'STDOUT' unless defined $fh;
Packit 5d935b
Packit 5d935b
    $fh->printf("version %f\ndefault %04x # %s\n", $self->{'version'}, $self->{'default'}, meaning_($self->{'default'}));
Packit 5d935b
    $lookup = $self->{'lookup'};
Packit 5d935b
    if (defined $lookup) {
Packit 5d935b
        $fh->printf("format %d\n", $self->{'format'});
Packit 5d935b
        foreach (sort { $a <=> $b } keys %$lookup) {
Packit 5d935b
            $fh->printf("\t%d -> %04x # %s\n", $_, $lookup->{$_}, meaning_($lookup->{$_}));
Packit 5d935b
        }
Packit 5d935b
    }
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
sub meaning_
Packit 5d935b
{
Packit 5d935b
    my ($val) = @_;
Packit 5d935b
    my ($res);
Packit 5d935b
    
Packit 5d935b
    my @types = (
Packit 5d935b
        "Strong left-to-right",
Packit 5d935b
        "Strong right-to-left",
Packit 5d935b
        "Arabic letter",
Packit 5d935b
        "European number",
Packit 5d935b
        "European number separator",
Packit 5d935b
        "European number terminator",
Packit 5d935b
        "Arabic number",
Packit 5d935b
        "Common number separator",
Packit 5d935b
        "Block separator",
Packit 5d935b
        "Segment separator",
Packit 5d935b
        "Whitespace",
Packit 5d935b
        "Other neutral");
Packit 5d935b
    $res = $types[$val & 0x001f] or ("Undefined [" . ($val & 0x001f) . "]");
Packit 5d935b
    
Packit 5d935b
    $res .= ", floater" if $val & 0x8000;
Packit 5d935b
    $res .= ", hang left" if $val & 0x4000;
Packit 5d935b
    $res .= ", hang right" if $val & 0x2000;
Packit 5d935b
    $res .= ", attaches on right" if $val & 0x0080;
Packit 5d935b
    $res .= ", pair" if $val & 0x1000;
Packit 5d935b
    my $pairOffset = ($val & 0x0f00) >> 8;
Packit 5d935b
    $pairOffset = $pairOffset - 16 if $pairOffset > 7;
Packit 5d935b
    $res .= $pairOffset > 0 ? " +" . $pairOffset : $pairOffset < 0 ? " " . $pairOffset : "";
Packit 5d935b
    
Packit 5d935b
    $res;
Packit 5d935b
}
Packit 5d935b
Packit 5d935b
1;
Packit 5d935b
Packit 5d935b
Packit 5d935b
=head1 BUGS
Packit 5d935b
Packit 5d935b
None known
Packit 5d935b
Packit 5d935b
=head1 AUTHOR
Packit 5d935b
Packit 5d935b
Jonathan Kew 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