Egads
[imager.git] / lib / Imager / Font / FreeType2.pm
1 package Imager::Font::FreeType2;
2 use strict;
3 use Imager::Color;
4 use vars qw(@ISA);
5 @ISA = qw(Imager::Font);
6 sub new {
7   my $class = shift;
8   my %hsh=(color=>Imager::Color->new(255,0,0,0),
9            size=>15,
10            @_);
11
12   unless ($hsh{file}) {
13     $Imager::ERRSTR = "No font file specified";
14     return;
15   }
16   unless (-e $hsh{file}) {
17     $Imager::ERRSTR = "Font file $hsh{file} not found";
18     return;
19   }
20   unless ($Imager::formats{ft2}) {
21     $Imager::ERRSTR = "Freetype2 not supported in this build";
22     return;
23   }
24   my $id = i_ft2_new($hsh{file}, $hsh{index} || 0);
25   unless ($id) { # the low-level code may miss some error handling
26     $Imager::ERRSTR = Imager::_error_as_msg();
27     return;
28   }
29   return bless {
30                 id       => $id,
31                 aa       => $hsh{aa} || 0,
32                 file     => $hsh{file},
33                 type     => 't1',
34                 size     => $hsh{size},
35                 color    => $hsh{color},
36                 utf8     => $hsh{utf8},
37                 vlayout  => $hsh{vlayout},
38                }, $class;
39 }
40
41 sub _draw {
42   my $self = shift;
43   my %input = @_;
44   if (exists $input{channel}) {
45     i_ft2_cp($self->{id}, $input{image}{IMG}, $input{x}, $input{'y'},
46              $input{channel}, $input{size}, $input{sizew} || 0,
47              $input{string}, , $input{align}, $input{aa}, $input{vlayout},
48              $input{utf8});
49   } else {
50     i_ft2_text($self->{id}, $input{image}{IMG}, 
51                $input{x}, $input{'y'}, 
52                $input{color}, $input{size}, $input{sizew} || 0,
53                $input{string}, $input{align}, $input{aa}, $input{vlayout},
54                $input{utf8});
55   }
56 }
57
58 sub _bounding_box {
59   my $self = shift;
60   my %input = @_;
61   return i_ft2_bbox($self->{id}, $input{size}, $input{sizew}, $input{string});
62 }
63
64 sub dpi {
65   my $self = shift;
66   my @old = i_ft2_getdpi($self->{id});
67   if (@_) {
68     my %hsh = @_;
69     my $result;
70     unless ($hsh{xdpi} && $hsh{ydpi}) {
71       if ($hsh{dpi}) {
72         $hsh{xdpi} = $hsh{ydpi} = $hsh{dpi};
73       }
74       else {
75         $Imager::ERRSTR = "dpi method requires xdpi and ydpi or just dpi";
76         return;
77       }
78       i_ft2_setdpi($self->{id}, $hsh{xdpi}, $hsh{ydpi}) or return;
79     }
80   }
81   
82   return @old;
83 }
84
85 sub hinting {
86   my ($self, %opts) = @_;
87
88   i_ft2_sethinting($self->{id}, $opts{hinting} || 0);
89 }
90
91 sub _transform {
92   my $self = shift;
93
94   my %hsh = @_;
95   my $matrix = $hsh{matrix} or return undef;
96
97   return i_ft2_settransform($self->{id}, $matrix)
98 }
99
100 sub utf8 {
101   return 1;
102 }
103
104 1;
105
106 __END__
107
108 =head1 NAME
109
110   Imager::Font::FreeType2 - low-level functions for FreeType2 text output
111
112 =head1 DESCRIPTION
113
114 Imager::Font creates a Imager::Font::FreeType2 object when asked to.
115
116 See Imager::Font to see how to use this type.
117
118 This class provides low-level functions that require the caller to
119 perform data validation.
120
121 This driver supports:
122
123 =over
124
125 =item transform()
126
127 =item dpi()
128
129 =item draw()
130
131 The following parameters:
132
133 =over
134
135 =item utf8
136
137 =item vlayour
138
139 =item sizew
140
141 =back
142
143 =back
144
145 =head2 Special behaviors
146
147 If you call transform() to set a transformation matrix, hinting will
148 be switched off.  This prevents sudden jumps in the size of the text
149 caused by the hinting when the transformation is the identity matrix.
150 If for some reason you want hinting enabled, use
151 $font->hinting(hinting=>1) to re-enable hinting.  This will need to be
152 called after I<each> call to transform().
153
154 =head1 AUTHOR
155
156 Addi, Tony
157
158 =cut