File Coverage

blib/lib/PDF/API3/Compat/API2/Resource/Font/CoreFont.pm
Criterion Covered Total %
statement 32 108 29.6
branch 0 42 0.0
condition 0 4 0.0
subroutine 11 18 61.1
pod 3 4 75.0
total 46 176 26.1


line stmt bran cond sub pod time code
1             #=======================================================================
2             # ____ ____ _____ _ ____ ___ ____
3             # | _ \| _ \| ___| _ _ / \ | _ \_ _| |___ \
4             # | |_) | | | | |_ (_) (_) / _ \ | |_) | | __) |
5             # | __/| |_| | _| _ _ / ___ \| __/| | / __/
6             # |_| |____/|_| (_) (_) /_/ \_\_| |___| |_____|
7             #
8             # A Perl Module Chain to faciliate the Creation and Modification
9             # of High-Quality "Portable Document Format (PDF)" Files.
10             #
11             # Copyright 1999-2005 Alfred Reibenschuh .
12             #
13             #=======================================================================
14             #
15             # THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR
16             # MODIFY IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC
17             # LICENSE AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; EITHER
18             # VERSION 2 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
19             #
20             # THIS FILE IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
21             # AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22             # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
23             # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24             # SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR CONTRIBUTORS
25             # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26             # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27             # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28             # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29             # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30             # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31             # ARISING IN ANY WAY OUT OF THE USE OF THIS FILE, EVEN IF
32             # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33             #
34             # SEE THE GNU LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
35             #
36             # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC
37             # LICENSE ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE
38             # FREE SOFTWARE FOUNDATION, INC., 59 TEMPLE PLACE - SUITE 330,
39             # BOSTON, MA 02111-1307, USA.
40             #
41             # $Id: CoreFont.pm,v 2.0 2005/11/16 02:18:14 areibens Exp $
42             #
43             #=======================================================================
44             package PDF::API3::Compat::API2::Resource::Font::CoreFont;
45            
46             =head1 NAME
47            
48             PDF::API3::Compat::API2::Resource::Font::CoreFont - Module for using the 14 PDF built-in Fonts.
49            
50             =head1 SYNOPSIS
51            
52             #
53             use PDF::API3::Compat::API2;
54             #
55             $pdf = PDF::API3::Compat::API2->new;
56             $cft = $pdf->corefont('Times-Roman');
57             #
58            
59             =head1 METHODS
60            
61             =over 4
62            
63             =cut
64            
65             BEGIN {
66            
67 1     1   6 use utf8;
  1         4  
  1         10  
68 1     1   36 use Encode qw(:all);
  1         2  
  1         452  
69            
70 1     1   8 use File::Basename;
  1         2  
  1         102  
71            
72 1     1   7 use vars qw( @ISA $fonts $alias $subs $encodings $VERSION );
  1         1  
  1         93  
73 1     1   695 use PDF::API3::Compat::API2::Resource::Font;
  1         5  
  1         44  
74 1     1   8 use PDF::API3::Compat::API2::Util;
  1         2  
  1         227  
75 1     1   6 use PDF::API3::Compat::API2::Basic::PDF::Utils;
  1         2  
  1         171  
76            
77 1     1   24 @ISA=qw(PDF::API3::Compat::API2::Resource::Font);
78            
79 1         31 ( $VERSION ) = sprintf '%i.%03i', split(/\./,('$Revision: 2.0 $' =~ /Revision: (\S+)\s/)[0]); # $Date: 2005/11/16 02:18:14 $
80            
81             }
82 1     1   5 no warnings qw[ deprecated recursion uninitialized ];
  1         3  
  1         75  
83            
84             =item $font = PDF::API3::Compat::API2::Resource::Font::CoreFont->new $pdf, $fontname, %options
85            
86             Returns a corefont object.
87            
88             =cut
89            
90             =pod
91            
92             Valid %options are:
93            
94             I<-encode>
95             ... changes the encoding of the font from its default.
96             See I for the supported values.
97            
98             I<-pdfname> ... changes the reference-name of the font from its default.
99             The reference-name is normally generated automatically and can be
100             retrived via $pdfname=$font->name.
101            
102             =cut
103            
104             sub _look_for_font ($)
105             {
106 0     0     my $fname=shift;
107             ## return(%{$fonts->{$fname}}) if(defined $fonts->{$fname});
108 0           eval "require PDF::API3::Compat::API2::Resource::Font::CoreFont::$fname; ";
109 0 0         unless($@)
110             {
111 1     1   6 no strict 'refs';
  1         2  
  1         1540  
112 0           my $obj = "PDF::API3::Compat::API2::Resource::Font::CoreFont::".$fname;
113 0           $fonts->{$fname} = deep_copy(${$obj."::FONTDATA"});
  0            
114 0   0       $fonts->{$fname}->{uni}||=[];
115 0           foreach my $n (0..255)
116             {
117 0 0         $fonts->{$fname}->{uni}->[$n]=uniByName($fonts->{$fname}->{char}->[$n]) unless(defined $fonts->{$fname}->{uni}->[$n]);
118             }
119 0           return(%{$fonts->{$fname}});
  0            
120             }
121             else
122             {
123 0           die "requested font '$fname' not installed ";
124             }
125             }
126            
127             #
128             # Deep copy something, thanks to Randal L. Schwartz
129             # Changed to deal w/ CODE refs, in which case it doesn't try to deep copy
130             #
131             sub deep_copy
132             {
133 0     0 0   my $this = shift;
134 0 0         if (not ref $this)
    0          
    0          
    0          
135             {
136 0           $this;
137             }
138             elsif (ref $this eq "ARRAY")
139             {
140 0           [map &deep_copy($_), @$this];
141             }
142             elsif (ref $this eq "HASH")
143             {
144 0           +{map { $_ => &deep_copy($this->{$_}) } keys %$this};
  0            
145             }
146             elsif (ref $this eq "CODE")
147             {
148             # Can't deep copy code refs
149 0           return $this;
150             }
151             else
152             {
153 0           die "what type is $_?";
154             }
155             }
156            
157             sub _look_for_fontfile ($)
158             {
159 0     0     my $fname=shift;
160 0           my $fpath=undef;
161 0           foreach my $dir (@INC)
162             {
163 0           $fpath="$dir/PDF/API3/Compat/API2/Resource/Font/CoreFont/$fname";
164 0 0         last if(-f $fpath);
165 0           $fpath=undef;
166             }
167 0           return($fpath);
168             }
169            
170             sub _look_for_fontmetricfile ($)
171             {
172 0     0     my $fname=shift;
173 0           my $fpath=undef;
174 0           foreach my $dir (@INC)
175             {
176 0           $fpath="$dir/PDF/API3/Compat/API2/Resource/Font/CoreFont/$fname.fm";
177 0 0         last if(-f $fpath);
178 0           $fpath=undef;
179             }
180 0           return($fpath);
181             }
182            
183             sub new
184             {
185 0     0 1   my ($class,$pdf,$name,@opts) = @_;
186 0           my ($self,$data);
187 0           my %opts=();
188 0 0         if(-f $name)
189             {
190 0           eval "require '$name'; ";
191 0           $name=basename($name,'.pm');
192             }
193 0           my $lookname=lc($name);
194 0           $lookname=~s/[^a-z0-9]+//gi;
195 0 0         %opts=@opts if((scalar @opts)%2 == 0);
196 0   0       $opts{-encode}||='asis';
197            
198 0 0         $lookname = defined($alias->{$lookname}) ? $alias->{$lookname} : $lookname ;
199            
200 0 0         if(defined $subs->{$lookname})
201             {
202 0           $data={_look_for_font($subs->{$lookname}->{-alias})};
203 0           foreach my $k (keys %{$subs->{$lookname}})
  0            
204             {
205 0 0         next if($k=~/^\-/);
206 0           $data->{$k}=$subs->{$lookname}->{$k};
207             }
208             }
209             else
210             {
211 0 0         unless(defined $opts{-metrics})
212             {
213 0           $data={_look_for_font($lookname)};
214             }
215             else
216             {
217 0           $data={%{$opts{-metrics}}};
  0            
218             }
219             }
220            
221 0 0         die "Undefined Font '$name($lookname)'" unless($data->{fontname});
222            
223             # we have data now here so we need to check if
224             # there is a -ttfile or -afmfile/-pfmfile/-pfbfile
225             # and proxy the call to the relevant modules
226             #
227             #if(defined $data->{-ttfile} && $data->{-ttfile}=_look_for_fontfile($data->{-ttfile}))
228             #{
229             # return(PDF::API3::Compat::API2::Resource::CIDFont::TrueType->new($pdf,$data->{-ttfile},@opts));
230             #}
231             #elsif(defined $data->{-pfbfile} && $data->{-pfbfile}=_look_for_fontfile($data->{-pfbfile}))
232             #{
233             # $data->{-afmfile}=_look_for_fontfile($data->{-afmfile});
234             # return(PDF::API3::Compat::API2::Resource::Font::Postscript->new($pdf,$data->{-pfbfile},$data->{-afmfile},@opts));
235             #}
236             #elsif(defined $data->{-gfx})
237             #{ # to be written and tested in 'Maki' first!
238             # return(PDF::API3::Compat::API2::Resource::Font::gFont->new($pdf,$data,@opts);
239             #}
240            
241 0 0         $class = ref $class if ref $class;
242 0           $self = $class->SUPER::new($pdf, $data->{apiname}.pdfkey().'~'.time());
243 0 0         $pdf->new_obj($self) unless($self->is_obj($pdf));
244 0           $self->{' data'}=$data;
245 0 0         $self->{-dokern}=1 if($opts{-dokern});
246            
247 0           $self->{'Subtype'} = PDFName($self->data->{type});
248 0           $self->{'BaseFont'} = PDFName($self->fontname);
249 0 0         if($opts{-pdfname})
250             {
251 0           $self->name($opts{-pdfname});
252             }
253            
254 0 0         unless($self->data->{iscore})
255             {
256 0           $self->{'FontDescriptor'}=$self->descrByData();
257             }
258            
259 0           $self->encodeByData($opts{-encode});
260            
261 0           return($self);
262             }
263            
264             =item $font = PDF::API3::Compat::API2::Resource::Font::CoreFont->new_api $api, $fontname, %options
265            
266             Returns a corefont object. This method is different from 'new' that
267             it needs an PDF::API3::Compat::API2-object rather than a PDF::API3::Compat::API2::PDF::File-object.
268            
269             =cut
270            
271             sub new_api
272             {
273 0     0 1   my ($class,$api,@opts)=@_;
274            
275 0           my $obj=$class->new($api->{pdf},@opts);
276            
277 0 0         $api->{pdf}->new_obj($obj) unless($obj->is_obj($api->{pdf}));
278            
279             ## $api->resource('Font',$obj->name,$obj);
280            
281 0           $api->{pdf}->out_obj($api->{pages});
282 0           return($obj);
283             }
284            
285             =item PDF::API3::Compat::API2::Resource::Font::CoreFont->loadallfonts()
286            
287             "Requires in" all fonts available as corefonts.
288            
289             =cut
290            
291             sub loadallfonts
292             {
293 0     0 1   foreach my $f (qw[
294             courier courierbold courierboldoblique courieroblique
295             georgia georgiabold georgiabolditalic georgiaitalic
296             helveticaboldoblique helveticaoblique helveticabold helvetica
297             symbol
298             timesbolditalic timesitalic timesroman timesbold
299             verdana verdanabold verdanabolditalic verdanaitalic
300             webdings
301             wingdings
302             zapfdingbats
303             ])
304             {
305 0           _look_for_font($f);
306             }
307             }
308            
309             # andalemono
310             # arialrounded
311             # bankgothic
312             # impact
313             # ozhandicraft
314             # trebuchet
315             # trebuchetbold
316             # trebuchetbolditalic
317             # trebuchetitalic
318            
319             BEGIN
320             {
321            
322 1     1   15 $alias = {
323             ## Windows Fonts with Type1 equivalence
324             'arial' => 'helvetica',
325             'arialitalic' => 'helveticaoblique',
326             'arialbold' => 'helveticabold',
327             'arialbolditalic' => 'helveticaboldoblique',
328            
329             'times' => 'timesroman',
330             'timesnewromanbolditalic' => 'timesbolditalic',
331             'timesnewromanbold' => 'timesbold',
332             'timesnewromanitalic' => 'timesitalic',
333             'timesnewroman' => 'timesroman',
334            
335             'couriernewbolditalic' => 'courierboldoblique',
336             'couriernewbold' => 'courierbold',
337             'couriernewitalic' => 'courieroblique',
338             'couriernew' => 'courier',
339             };
340            
341 1         4 $subs = {
342             #'bankgothicbold' => {
343             # 'apiname' => 'Bg2',
344             # '-alias' => 'bankgothic',
345             # 'fontname' => 'BankGothicMediumBT,Bold',
346             # 'flags' => 32+262144,
347             #},
348             #'bankgothicbolditalic' => {
349             # 'apiname' => 'Bg3',
350             # '-alias' => 'bankgothic',
351             # 'fontname' => 'BankGothicMediumBT,BoldItalic',
352             # 'italicangle' => -15,
353             # 'flags' => 96+262144,
354             #},
355             #'bankgothicitalic' => {
356             # 'apiname' => 'Bg4',
357             # '-alias' => 'bankgothic',
358             # 'fontname' => 'BankGothicMediumBT,Italic',
359             # 'italicangle' => -15,
360             # 'flags' => 96,
361             #},
362             # 'impactitalic' => {
363             # 'apiname' => 'Imp2',
364             # '-alias' => 'impact',
365             # 'fontname' => 'Impact,Italic',
366             # 'italicangle' => -12,
367             # },
368             # 'ozhandicraftbold' => {
369             # 'apiname' => 'Oz2',
370             # '-alias' => 'ozhandicraft',
371             # 'fontname' => 'OzHandicraftBT,Bold',
372             # 'italicangle' => 0,
373             # 'flags' => 32+262144,
374             # },
375             # 'ozhandicraftitalic' => {
376             # 'apiname' => 'Oz3',
377             # '-alias' => 'ozhandicraft',
378             # 'fontname' => 'OzHandicraftBT,Italic',
379             # 'italicangle' => -15,
380             # 'flags' => 96,
381             # },
382             # 'ozhandicraftbolditalic' => {
383             # 'apiname' => 'Oz4',
384             # '-alias' => 'ozhandicraft',
385             # 'fontname' => 'OzHandicraftBT,BoldItalic',
386             # 'italicangle' => -15,
387             # 'flags' => 96+262144,
388             # },
389             # 'arialroundeditalic' => {
390             # 'apiname' => 'ArRo2',
391             # '-alias' => 'arialrounded',
392             # 'fontname' => 'ArialRoundedMTBold,Italic',
393             # 'italicangle' => -15,
394             # 'flags' => 96+262144,
395             # },
396             # 'arialitalic' => {
397             # 'apiname' => 'Ar2',
398             # '-alias' => 'arial',
399             # 'fontname' => 'Arial,Italic',
400             # 'italicangle' => -15,
401             # 'flags' => 96,
402             # },
403             # 'arialbolditalic' => {
404             # 'apiname' => 'Ar3',
405             # '-alias' => 'arial',
406             # 'fontname' => 'Arial,BoldItalic',
407             # 'italicangle' => -15,
408             # 'flags' => 96+262144,
409             # },
410             # 'arialbold' => {
411             # 'apiname' => 'Ar4',
412             # '-alias' => 'arial',
413             # 'fontname' => 'Arial,Bold',
414             # 'flags' => 32+262144,
415             # },
416             };
417            
418 1         27 $fonts = { };
419            
420             }
421            
422             1;
423            
424             __END__