<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package Font::TTF::Vhea;

=head1 NAME

Font::TTF::Vhea - Vertical Header table

=head1 DESCRIPTION

This is a simple table with just standards specified instance variables

=head1 INSTANCE VARIABLES

    version
    Ascender
    Descender
    LineGap
    advanceHeightMax
    minTopSideBearing
    minBottomSideBearing
    yMaxExtent
    caretSlopeRise
    caretSlopeRun
    metricDataFormat
    numberOfVMetrics


=head1 METHODS

=cut

use strict;
use vars qw(@ISA %fields @field_info);

require Font::TTF::Table;
use Font::TTF::Utils;

@ISA = qw(Font::TTF::Table);
@field_info = (
    'version' =&gt; 'v',
    'Ascender' =&gt; 's',
    'Descender' =&gt; 's',
    'LineGap' =&gt; 's',
    'advanceHeightMax' =&gt; 'S',
    'minTopSideBearing' =&gt; 's',
    'minBottomSideBearing' =&gt; 's',
    'yMaxExtent' =&gt; 's',
    'caretSlopeRise' =&gt; 's',
    'caretSlopeRun' =&gt; 's',
    'metricDataFormat' =&gt; '+10s',
    'numberOfVMetrics' =&gt; 's');

sub init
{
    my ($k, $v, $c, $i);
    for ($i = 0; $i &lt; $#field_info; $i += 2)
    {
        ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]);
        next unless defined $k &amp;&amp; $k ne "";
        $fields{$k} = $v;
    }
}


=head2 $t-&gt;read

Reads the table into memory as instance variables

=cut

sub read
{
    my ($self) = @_;
    my ($dat);

    $self-&gt;SUPER::read or return $self;
    init unless defined $fields{'Ascender'};
    $self-&gt;{' INFILE'}-&gt;read($dat, 36);

    TTF_Read_Fields($self, $dat, \%fields);
    $self;
}


=head2 $t-&gt;out($fh)

Writes the table to a file either from memory or by copying.

=cut

sub out
{
    my ($self, $fh) = @_;

    return $self-&gt;SUPER::out($fh) unless $self-&gt;{' read'};

    $self-&gt;{'numberOfVMetrics'} = $self-&gt;{' PARENT'}{'vmtx'}-&gt;numMetrics || $self-&gt;{'numberOfVMetrics'};
    $fh-&gt;print(TTF_Out_Fields($self, \%fields, 36));
    $self;
}


=head2 $t-&gt;update

Updates various parameters in the hhea table from the hmtx table, assuming
the C&lt;hmtx&gt; table is dirty.

=cut

sub update
{
    my ($self) = @_;
    my ($vmtx) = $self-&gt;{' PARENT'}{'vmtx'};
    my ($glyphs);
    my ($num);
    my ($i, $maw, $mlsb, $mrsb, $mext, $aw, $lsb, $ext);

    return undef unless ($self-&gt;SUPER::update);
    return undef unless (defined $vmtx &amp;&amp; defined $self-&gt;{' PARENT'}{'loca'});
    $vmtx-&gt;read-&gt;update;
    $self-&gt;{' PARENT'}{'loca'}-&gt;read-&gt;update;
    $glyphs = $self-&gt;{' PARENT'}{'loca'}{'glyphs'};
    $num = $self-&gt;{' PARENT'}{'maxp'}{'numGlyphs'};

    for ($i = 0; $i &lt; $num; $i++)
    {
        $aw = $vmtx-&gt;{'advance'}[$i];
        $lsb = $vmtx-&gt;{'top'}[$i];
        if (defined $glyphs-&gt;[$i])
        { $ext = $lsb + $glyphs-&gt;[$i]-&gt;read-&gt;{'yMax'} - $glyphs-&gt;[$i]{'yMin'}; }
        else
        { $ext = $aw; }
        $maw = $aw if ($aw &gt; $maw);
        $mlsb = $lsb if ($lsb &lt; $mlsb or $i == 0);
        $mrsb = $aw - $ext if ($aw - $ext &lt; $mrsb or $i == 0);
        $mext = $ext if ($ext &gt; $mext);
    }
    $self-&gt;{'advanceHeightMax'} = $maw;
    $self-&gt;{'minTopSideBearing'} = $mlsb;
    $self-&gt;{'minBottomSideBearing'} = $mrsb;
    $self-&gt;{'yMaxExtent'} = $mext;
    $self-&gt;{'numberOfVMetrics'} = $vmtx-&gt;numMetrics;
    $self;
}


1;


=head1 BUGS

None known

=head1 AUTHOR

Martin Hosken Martin_Hosken@sil.org. See L&lt;Font::TTF::Font&gt; for copyright and
licensing.

=cut

</pre></body></html>