embed fonts in epub, stripped to used chars
[librarian.git] / font-optimizer / ext / Font-TTF / lib / Font / TTF / Glyf.pm
diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm
new file mode 100644 (file)
index 0000000..e0268f3
--- /dev/null
@@ -0,0 +1,158 @@
+package Font::TTF::Glyf;
+
+=head1 NAME
+
+Font::TTF::Glyf - The Glyf data table
+
+=head1 DESCRIPTION
+
+This is a stub table. The real data is held in the loca table. If you want to get a glyf
+look it up in the loca table as C<$f->{'loca'}{'glyphs'}[$num]>. It won't be here!
+
+The difference between reading this table as opposed to the loca table is that
+reading this table will cause updated glyphs to be written out rather than just
+copying the glyph information from the input file. This causes font writing to be
+slower. So read the glyf as opposed to the loca table if you want to change glyf
+data. Read the loca table only if you are just wanting to read the glyf information.
+
+This class is used when writing the glyphs though.
+
+=head1 METHODS
+
+=cut
+
+
+use strict;
+use vars qw(@ISA);
+@ISA = qw(Font::TTF::Table);
+
+=head2 $t->read
+
+Reads the C<loca> table instead!
+
+=cut
+
+sub read
+{
+    my ($self) = @_;
+    
+    $self->{' PARENT'}{'loca'}->read;
+    $self->{' read'} = 1;
+    $self;
+}
+
+
+=head2 $t->out($fh)
+
+Writes out all the glyphs in the parent's location table, calculating a new
+output location for each one.
+
+=cut
+
+sub out
+{
+    my ($self, $fh) = @_;
+    my ($i, $loca, $offset, $numGlyphs);
+
+    return $self->SUPER::out($fh) unless $self->{' read'};
+
+    $loca = $self->{' PARENT'}{'loca'}{'glyphs'};
+    $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'};
+
+    $offset = 0;
+    for ($i = 0; $i < $numGlyphs; $i++)
+    {
+        next unless defined $loca->[$i];
+        $loca->[$i]->update;
+        $loca->[$i]{' OUTLOC'} = $offset;
+        $loca->[$i]->out($fh);
+        $offset += $loca->[$i]{' OUTLEN'};
+    }
+    $self->{' PARENT'}{'head'}{'indexToLocFormat'} = ($offset >= 0x20000);
+    $self;
+}
+
+
+=head2 $t->out_xml($context, $depth)
+
+Outputs all the glyphs in the glyph table just where they are supposed to be output!
+
+=cut
+
+sub out_xml
+{
+    my ($self, $context, $depth) = @_;
+    my ($fh) = $context->{'fh'};
+    my ($loca, $i, $numGlyphs);
+
+    $loca = $self->{' PARENT'}{'loca'}{'glyphs'};
+    $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'};
+    
+    for ($i = 0; $i < $numGlyphs; $i++)
+    {
+        $context->{'gid'} = $i;
+        $loca->[$i]->out_xml($context, $depth) if (defined $loca->[$i]);
+    }
+
+    $self;
+}
+
+
+=head2 $t->XML_start($context, $tag, %attrs)
+
+Pass control to glyphs as they occur
+
+=cut
+
+sub XML_start
+{
+    my ($self) = shift;
+    my ($context, $tag, %attrs) = @_;
+
+    if ($tag eq 'glyph')
+    {
+        $context->{'tree'}[-1] = Font::TTF::Glyph->new(read => 2, PARENT => $self->{' PARENT'});
+        $context->{'receiver'} = $context->{'tree'}[-1];
+    }
+}
+
+
+=head2 $t->XML_end($context, $tag, %attrs)
+
+Collect up glyphs and put them into the loca table
+
+=cut
+
+sub XML_end
+{
+    my ($self) = shift;
+    my ($context, $tag, %attrs) = @_;
+
+    if ($tag eq 'glyph')
+    {
+        unless (defined $context->{'glyphs'})
+        {
+            if (defined $self->{' PARENT'}{'loca'})
+            { $context->{'glyphs'} = $self->{' PARENT'}{'loca'}{'glyphs'}; }
+            else
+            { $context->{'glyphs'} = []; }
+        }
+        $context->{'glyphs'}[$attrs{'gid'}] = $context->{'tree'}[-1];
+        return $context;
+    } else
+    { return $self->SUPER::XML_end(@_); }
+}
+
+1;
+
+=head1 BUGS
+
+None known
+
+=head1 AUTHOR
+
+Martin Hosken Martin_Hosken@sil.org. See L<Font::TTF::Font> for copyright and
+licensing.
+
+=cut
+