package PDF::API2::Resource::CIDFont::TrueType; use base 'PDF::API2::Resource::CIDFont'; use strict; use warnings; our $VERSION = '2.043'; # VERSION use PDF::API2::Basic::PDF::Utils; use PDF::API2::Resource::CIDFont::TrueType::FontFile; use PDF::API2::Util; =head1 NAME PDF::API2::Resource::CIDFont::TrueType - TrueType font support =head1 METHODS =over =item $font = PDF::API2::Resource::CIDFont::TrueType->new $pdf, $file, %options Returns a font object. Defined Options: -encode ... specify fonts encoding for non-utf8 text. -nosubset ... disables subsetting. =cut sub new { my ($class, $pdf, $file, %opts) = @_; $opts{'-encode'} //= 'latin1'; my ($ff, $data) = PDF::API2::Resource::CIDFont::TrueType::FontFile->new($pdf, $file, %opts); $class = ref($class) if ref($class); my $self = $class->SUPER::new($pdf, $data->{'apiname'} . pdfkey()); $pdf->new_obj($self) if defined($pdf) and not $self->is_obj($pdf); $self->{' data'} = $data; $self->{'BaseFont'} = PDFName($self->fontname()); my $des = $self->descrByData(); my $de = $self->{' de'}; $de->{'FontDescriptor'} = $des; $de->{'Subtype'} = PDFName($self->iscff() ? 'CIDFontType0' : 'CIDFontType2'); $de->{'BaseFont'} = PDFName($self->fontname()); $de->{'DW'} = PDFNum($self->missingwidth()); if ($opts{'embed'}) { $des->{$self->iscff() ? 'FontFile3' : 'FontFile2'} = $ff; } unless ($self->issymbol()) { $self->encodeByName($opts{'-encode'}); $self->data->{encode} = $opts{'-encode'}; $self->data->{decode} = 'ident'; } if ($opts{'-nosubset'}) { $self->data->{'nosubset'} = 1; } $self->{' ff'} = $ff; $pdf->new_obj($ff); $self->{'-dokern'} = 1 if $opts{'-dokern'}; return $self; } sub fontfile { return $_[0]->{' ff'}; } sub fontobj { return $_[0]->data->{'obj'}; } sub wxByCId { my ($self, $g) = @_; my $t = $self->fontobj->{'hmtx'}->read->{'advance'}[$g]; if (defined $t) { return int($t * 1000 / $self->data->{'upem'}); } else { return $self->missingwidth(); } } sub haveKernPairs { my $self = shift(); return $self->fontfile->haveKernPairs(); } sub kernPairCid { my ($self, $i1, $i2) = @_; return $self->fontfile->kernPairCid($i1, $i2); } sub subsetByCId { my ($self, $g) = @_; return if $self->iscff(); return $self->fontfile->subsetByCId($g); } sub subvec { my ($self, $g) = @_; return 1 if $self->iscff(); return $self->fontfile->subvec($g); } sub glyphNum { return $_[0]->fontfile->glyphNum() } sub outobjdeep { my ($self, $fh, $pdf) = @_; my $notdefbefore = 1; my $wx = PDFArray(); $self->{' de'}->{'W'} = $wx; my $ml; foreach my $w (0 .. (scalar @{$self->data->{'g2u'}} - 1)) { if ($self->subvec($w) and $notdefbefore) { $notdefbefore = 0; $ml = PDFArray(); $wx->add_elements(PDFNum($w), $ml); $ml->add_elements(PDFNum($self->wxByCId($w))); } elsif ($self->subvec($w) and not $notdefbefore) { $ml->add_elements(PDFNum($self->wxByCId($w))); } else { $notdefbefore = 1; } } $self->SUPER::outobjdeep($fh, $pdf); } =back =cut 1;