PDF-Builder

 view release on metacpan or  search on metacpan

lib/PDF/Builder/Resource/CIDFont/TrueType/FontFile.pm  view on Meta::CPAN

#$opts{'cmaps'} = '7/8; 8/7';  # invalid P/E, should use find_ms instead
#$opts{'cmaps'} = 'find_ms;   find_ms ';
#$opts{'usecmf'} = 1;

    my $font;
    # if the file is already a suitable font object, use it
    if (UNIVERSAL::isa($file, 'Font::TTF::Font')) {
	$font = $file;
    } else {
        confess "cannot find font '$file'" unless -f $file;
        $font = Font::TTF::Font->open($file);
    }
    $data->{'obj'} = $font;

    $class = ref $class if ref $class;
    my $self = $class->SUPER::new();

    $self->{'Filter'} = PDFArray(PDFName('FlateDecode'));
    $self->{' font'} = $font;
    $self->{' data'} = $data;
    
    $data->{'noembed'} = !$opts{'embed'};
    $data->{'iscff'} = (defined $font->{'CFF '})? 1: 0;

    $self->{'Subtype'} = PDFName('CIDFontType0C') if $data->{'iscff'};

    $data->{'fontfamily'} = $font->{'name'}->read()->find_name(1);
    $data->{'fontname'} = $font->{'name'}->read()->find_name(4);

    $font->{'OS/2'}->read();
    my @stretch = qw[
        Normal
        UltraCondensed
        ExtraCondensed
        Condensed
        SemiCondensed
        Normal
        SemiExpanded
        Expanded
        ExtraExpanded
        UltraExpanded
    ];
    if (defined $font->{'OS/2'}->{'usWidthClass'}) {
        $data->{'fontstretch'} = $stretch[$font->{'OS/2'}->{'usWidthClass'}] || 'Normal';
    } else {
        $data->{'fontstretch'} = 'Normal';
    }

    $data->{'fontweight'} = $font->{'OS/2'}->{'usWeightClass'};

    if (defined $font->{'OS/2'}->{'sFamilyClass'}) {
        $data->{'panose'} = pack('n', $font->{'OS/2'}->{'sFamilyClass'});

        foreach my $p (qw[bFamilyType bSerifStyle bWeight bProportion bContrast bStrokeVariation bArmStyle bLetterform bMidline bXheight]) {
	    if (defined $font->{'OS/2'}->{$p}) {
                $data->{'panose'} .= pack('C', $font->{'OS/2'}->{$p});
            }
        }
    }

    $data->{'apiname'} = join('', map { ucfirst(lc(substr($_, 0, 2))) } split m/[^A-Za-z0-9\s]+/, $data->{'fontname'});
    $data->{'fontname'} =~ s/[\x00-\x1f\s]//og;

    $data->{'altname'} = $font->{'name'}->find_name(1);
    $data->{'altname'} =~ s/[\x00-\x1f\s]//og;

    $data->{'subname'} = $font->{'name'}->find_name(2);
    $data->{'subname'} =~ s/[\x00-\x1f\s]//og;

    # TBD in PDF::API2 the following line is just find_ms()
    $font->{'cmap'}->read()->find_ms($opts{'isocmap'} || 0);
    if (defined $font->{'cmap'}->find_ms()) {
        $data->{'issymbol'} = ($font->{'cmap'}->find_ms()->{'Platform'} == 3 &&
	                      $font->{'cmap'}->read()->find_ms()->{'Encoding'} == 0) || 0;
    } else {
        $data->{'issymbol'} = 0;
    }

    $data->{'upem'} = $font->{'head'}->read()->{'unitsPerEm'};

    $data->{'fontbbox'} = [
        int($font->{'head'}->{'xMin'} * 1000 / $data->{'upem'}),
        int($font->{'head'}->{'yMin'} * 1000 / $data->{'upem'}),
        int($font->{'head'}->{'xMax'} * 1000 / $data->{'upem'}),
        int($font->{'head'}->{'yMax'} * 1000 / $data->{'upem'})
    ];

    $data->{'stemv'} = 0;
    $data->{'stemh'} = 0;

    $data->{'missingwidth'} = int($font->{'hhea'}->read()->{'advanceWidthMax'} * 1000 / $data->{'upem'}) || 1000;
    $data->{'maxwidth'} = int($font->{'hhea'}->{'advanceWidthMax'} * 1000 / $data->{'upem'});
    $data->{'ascender'} = int($font->{'hhea'}->read()->{'Ascender'} * 1000 / $data->{'upem'});
    $data->{'descender'} = int($font->{'hhea'}{'Descender'} * 1000 / $data->{'upem'});

    $data->{'flags'}  = 0;
    if (defined $font->{'OS/2'}) {
	if (defined $font->{'OS/2'}->read()->{'bProportion'}) {
            $data->{'flags'} |= 1 if $font->{'OS/2'}->read()->{'bProportion'} == 9;
	}
	if (defined $font->{'OS/2'}{'bSerifStyle'}) {
            $data->{'flags'} |= 2 unless $font->{'OS/2'}{'bSerifStyle'} > 10 && 
                                         $font->{'OS/2'}{'bSerifStyle'} < 14;
	}
	if (defined $font->{'OS/2'}{'bFamilyType'}) {
            $data->{'flags'} |= 8 if $font->{'OS/2'}{'bFamilyType'} == 2;
            $data->{'flags'} |= 32; # if $font->{'OS/2'}{'bFamilyType'} > 3;
	}
	if (defined $font->{'OS/2'}{'bLetterform'}) {
            $data->{'flags'} |= 64 if $font->{'OS/2'}{'bLetterform'} > 8;
	}
    }

    $data->{'capheight'} = $font->{'OS/2'}->{'CapHeight'} || int($data->{'fontbbox'}->[3]*0.8);
    $data->{'xheight'} = $font->{'OS/2'}->{'xHeight'} || int($data->{'fontbbox'}->[3]*0.4);

    if ($data->{'issymbol'}) {
        $data->{'e2u'} = [0xf000 .. 0xf0ff];
    } else {
        $data->{'e2u'} = [ unpack('U*', decode('cp1252', pack('C*', 0..255))) ];
    }



( run in 0.537 second using v1.01-cache-2.11-cpan-71847e10f99 )