1<?php
2namespace Amenadiel\JpGraph\Text;
3
4use \Amenadiel\JpGraph\Util;
5
6//=============================================================
7// CLASS TTF
8// Description: Handle TTF font names and mapping and loading of
9//              font files
10//=============================================================
11class TTF
12{
13    private $font_files;
14    private $style_names;
15
16    public function __construct()
17    {
18
19        // String names for font styles to be used in error messages
20        $this->style_names = array(
21            FS_NORMAL     => 'normal',
22            FS_BOLD       => 'bold',
23            FS_ITALIC     => 'italic',
24            FS_BOLDITALIC => 'bolditalic');
25
26        // File names for available fonts
27        $this->font_files = array(
28            FF_COURIER => array(FS_NORMAL  => 'cour.ttf',
29                FS_BOLD                    => 'courbd.ttf',
30                FS_ITALIC                  => 'couri.ttf',
31                FS_BOLDITALIC              => 'courbi.ttf'),
32            FF_GEORGIA => array(FS_NORMAL  => 'georgia.ttf',
33                FS_BOLD                    => 'georgiab.ttf',
34                FS_ITALIC                  => 'georgiai.ttf',
35                FS_BOLDITALIC              => ''),
36            FF_TREBUCHE => array(FS_NORMAL => 'trebuc.ttf',
37                FS_BOLD                    => 'trebucbd.ttf',
38                FS_ITALIC                  => 'trebucit.ttf',
39                FS_BOLDITALIC              => 'trebucbi.ttf'),
40            FF_VERDANA => array(FS_NORMAL  => 'verdana.ttf',
41                FS_BOLD                    => 'verdanab.ttf',
42                FS_ITALIC                  => 'verdanai.ttf',
43                FS_BOLDITALIC              => ''),
44            FF_TIMES => array(FS_NORMAL    => 'times.ttf',
45                FS_BOLD                    => 'timesbd.ttf',
46                FS_ITALIC                  => 'timesi.ttf',
47                FS_BOLDITALIC              => 'timesbi.ttf'),
48            FF_COMIC => array(FS_NORMAL    => 'comic.ttf',
49                FS_BOLD                    => 'comicbd.ttf',
50                FS_ITALIC                  => '',
51                FS_BOLDITALIC              => ''),
52            /*FF_ARIAL => array(FS_NORMAL => 'arial.ttf',
53            FS_BOLD => 'arialbd.ttf',
54            FS_ITALIC => 'ariali.ttf',
55            FS_BOLDITALIC => 'arialbi.ttf'),*/
56            FF_ARIAL => array(FS_NORMAL     => 'arial.ttf',
57                FS_BOLD                     => 'msttcorefonts/Arial_Black.ttf',
58                FS_ITALIC                   => 'ariali.ttf',
59                FS_BOLDITALIC               => 'arialbi.ttf'),
60            FF_VERA => array(FS_NORMAL      => 'Vera.ttf',
61                FS_BOLD                     => 'VeraBd.ttf',
62                FS_ITALIC                   => 'VeraIt.ttf',
63                FS_BOLDITALIC               => 'VeraBI.ttf'),
64            FF_VERAMONO => array(FS_NORMAL  => 'VeraMono.ttf',
65                FS_BOLD                     => 'VeraMoBd.ttf',
66                FS_ITALIC                   => 'VeraMoIt.ttf',
67                FS_BOLDITALIC               => 'VeraMoBI.ttf'),
68            FF_VERASERIF => array(FS_NORMAL => 'VeraSe.ttf',
69                FS_BOLD                     => 'VeraSeBd.ttf',
70                FS_ITALIC                   => '',
71                FS_BOLDITALIC               => ''),
72
73            /* Chinese fonts */
74            FF_SIMSUN => array(
75                FS_NORMAL     => 'simsun.ttc',
76                FS_BOLD       => 'simhei.ttf',
77                FS_ITALIC     => '',
78                FS_BOLDITALIC => ''),
79            FF_CHINESE => array(
80                FS_NORMAL     => CHINESE_TTF_FONT,
81                FS_BOLD       => '',
82                FS_ITALIC     => '',
83                FS_BOLDITALIC => ''),
84            FF_BIG5 => array(
85                FS_NORMAL     => CHINESE_TTF_FONT,
86                FS_BOLD       => '',
87                FS_ITALIC     => '',
88                FS_BOLDITALIC => ''),
89
90            /* Japanese fonts */
91            FF_MINCHO => array(
92                FS_NORMAL     => MINCHO_TTF_FONT,
93                FS_BOLD       => '',
94                FS_ITALIC     => '',
95                FS_BOLDITALIC => ''),
96
97            FF_PMINCHO => array(
98                FS_NORMAL     => PMINCHO_TTF_FONT,
99                FS_BOLD       => '',
100                FS_ITALIC     => '',
101                FS_BOLDITALIC => ''),
102
103            FF_GOTHIC => array(
104                FS_NORMAL     => GOTHIC_TTF_FONT,
105                FS_BOLD       => '',
106                FS_ITALIC     => '',
107                FS_BOLDITALIC => ''),
108
109            FF_PGOTHIC => array(
110                FS_NORMAL     => PGOTHIC_TTF_FONT,
111                FS_BOLD       => '',
112                FS_ITALIC     => '',
113                FS_BOLDITALIC => ''),
114
115            /* Hebrew fonts */
116            FF_DAVID => array(
117                FS_NORMAL     => 'DAVIDNEW.TTF',
118                FS_BOLD       => '',
119                FS_ITALIC     => '',
120                FS_BOLDITALIC => ''),
121
122            FF_MIRIAM => array(
123                FS_NORMAL     => 'MRIAMY.TTF',
124                FS_BOLD       => '',
125                FS_ITALIC     => '',
126                FS_BOLDITALIC => ''),
127
128            FF_AHRON => array(
129                FS_NORMAL     => 'ahronbd.ttf',
130                FS_BOLD       => '',
131                FS_ITALIC     => '',
132                FS_BOLDITALIC => ''),
133
134            /* Misc fonts */
135            FF_DIGITAL => array(
136                FS_NORMAL     => 'DIGIRU__.TTF',
137                FS_BOLD       => 'Digirtu_.ttf',
138                FS_ITALIC     => 'Digir___.ttf',
139                FS_BOLDITALIC => 'DIGIRT__.TTF'),
140
141            /* This is an experimental font for the speedometer development
142            FF_SPEEDO =>    array(
143            FS_NORMAL =>'Speedo.ttf',
144            FS_BOLD =>'',
145            FS_ITALIC =>'',
146            FS_BOLDITALIC =>'' ),
147             */
148
149            FF_COMPUTER => array(
150                FS_NORMAL     => 'COMPUTER.TTF',
151                FS_BOLD       => '',
152                FS_ITALIC     => '',
153                FS_BOLDITALIC => ''),
154
155            FF_CALCULATOR => array(
156                FS_NORMAL     => 'Triad_xs.ttf',
157                FS_BOLD       => '',
158                FS_ITALIC     => '',
159                FS_BOLDITALIC => ''),
160
161            /* Dejavu fonts */
162            FF_DV_SANSSERIF => array(
163                FS_NORMAL     => array('DejaVuSans.ttf'),
164                FS_BOLD       => array('DejaVuSans-Bold.ttf', 'DejaVuSansBold.ttf'),
165                FS_ITALIC     => array('DejaVuSans-Oblique.ttf', 'DejaVuSansOblique.ttf'),
166                FS_BOLDITALIC => array('DejaVuSans-BoldOblique.ttf', 'DejaVuSansBoldOblique.ttf')),
167
168            FF_DV_SANSSERIFMONO => array(
169                FS_NORMAL     => array('DejaVuSansMono.ttf', 'DejaVuMonoSans.ttf'),
170                FS_BOLD       => array('DejaVuSansMono-Bold.ttf', 'DejaVuMonoSansBold.ttf'),
171                FS_ITALIC     => array('DejaVuSansMono-Oblique.ttf', 'DejaVuMonoSansOblique.ttf'),
172                FS_BOLDITALIC => array('DejaVuSansMono-BoldOblique.ttf', 'DejaVuMonoSansBoldOblique.ttf')),
173
174            FF_DV_SANSSERIFCOND => array(
175                FS_NORMAL     => array('DejaVuSansCondensed.ttf', 'DejaVuCondensedSans.ttf'),
176                FS_BOLD       => array('DejaVuSansCondensed-Bold.ttf', 'DejaVuCondensedSansBold.ttf'),
177                FS_ITALIC     => array('DejaVuSansCondensed-Oblique.ttf', 'DejaVuCondensedSansOblique.ttf'),
178                FS_BOLDITALIC => array('DejaVuSansCondensed-BoldOblique.ttf', 'DejaVuCondensedSansBoldOblique.ttf')),
179
180            FF_DV_SERIF => array(
181                FS_NORMAL     => array('DejaVuSerif.ttf'),
182                FS_BOLD       => array('DejaVuSerif-Bold.ttf', 'DejaVuSerifBold.ttf'),
183                FS_ITALIC     => array('DejaVuSerif-Italic.ttf', 'DejaVuSerifItalic.ttf'),
184                FS_BOLDITALIC => array('DejaVuSerif-BoldItalic.ttf', 'DejaVuSerifBoldItalic.ttf')),
185
186            FF_DV_SERIFCOND => array(
187                FS_NORMAL     => array('DejaVuSerifCondensed.ttf', 'DejaVuCondensedSerif.ttf'),
188                FS_BOLD       => array('DejaVuSerifCondensed-Bold.ttf', 'DejaVuCondensedSerifBold.ttf'),
189                FS_ITALIC     => array('DejaVuSerifCondensed-Italic.ttf', 'DejaVuCondensedSerifItalic.ttf'),
190                FS_BOLDITALIC => array('DejaVuSerifCondensed-BoldItalic.ttf', 'DejaVuCondensedSerifBoldItalic.ttf')),
191
192            /* Placeholders for defined fonts */
193            FF_USERFONT1 => array(
194                FS_NORMAL     => '',
195                FS_BOLD       => '',
196                FS_ITALIC     => '',
197                FS_BOLDITALIC => ''),
198
199            FF_USERFONT2 => array(
200                FS_NORMAL     => '',
201                FS_BOLD       => '',
202                FS_ITALIC     => '',
203                FS_BOLDITALIC => ''),
204
205            FF_USERFONT3 => array(
206                FS_NORMAL     => '',
207                FS_BOLD       => '',
208                FS_ITALIC     => '',
209                FS_BOLDITALIC => ''),
210
211        );
212    }
213
214    //---------------
215    // PUBLIC METHODS
216    // Create the TTF file from the font specification
217    public function File($family, $style = FS_NORMAL)
218    {
219        $fam = @$this->font_files[$family];
220        if (!$fam) {
221            Util\JpGraphError::RaiseL(25046, $family); //("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/");
222        }
223        $ff = @$fam[$style];
224
225        // There are several optional file names. They are tried in order
226        // and the first one found is used
227        if (!is_array($ff)) {
228            $ff = array($ff);
229        }
230
231        $jpgraph_font_dir = dirname(dirname(__FILE__)) . '/fonts/';
232
233        foreach ($ff as $font_file) {
234            // All font families are guaranteed to have the normal style
235
236            if ($font_file === '') {
237                Util\JpGraphError::RaiseL(25047, $this->style_names[$style], $this->font_files[$family][FS_NORMAL]);
238            }
239            //('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.');
240            if (!$font_file) {
241                Util\JpGraphError::RaiseL(25048, $fam); //("Unknown font style specification [$fam].");
242            }
243
244            // check jpgraph/src/fonts dir
245            $jpgraph_font_file = $jpgraph_font_dir . $font_file;
246            if (file_exists($jpgraph_font_file) === true && is_readable($jpgraph_font_file) === true) {
247                $font_file = $jpgraph_font_file;
248                break;
249            }
250
251            // check OS font dir
252            if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {
253                $font_file = MBTTF_DIR . $font_file;
254            } else {
255                $font_file = TTF_DIR . $font_file;
256            }
257            if (file_exists($font_file) === true && is_readable($font_file) === true) {
258                break;
259            }
260        }
261
262        if (!file_exists($font_file)) {
263            //Util\JpGraphError::RaiseL(25049, $font_file); //("Font file \"$font_file\" is not readable or does not exist.");
264            return $this->File(FF_DV_SANSSERIF, $style);
265        }
266
267        return $font_file;
268    }
269
270    public function SetUserFont($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
271    {
272        $this->font_files[FF_USERFONT] =
273        array(FS_NORMAL   => $aNormal,
274            FS_BOLD       => $aBold,
275            FS_ITALIC     => $aItalic,
276            FS_BOLDITALIC => $aBoldIt);
277    }
278
279    public function SetUserFont1($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
280    {
281        $this->font_files[FF_USERFONT1] =
282        array(FS_NORMAL   => $aNormal,
283            FS_BOLD       => $aBold,
284            FS_ITALIC     => $aItalic,
285            FS_BOLDITALIC => $aBoldIt);
286    }
287
288    public function SetUserFont2($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
289    {
290        $this->font_files[FF_USERFONT2] =
291        array(FS_NORMAL   => $aNormal,
292            FS_BOLD       => $aBold,
293            FS_ITALIC     => $aItalic,
294            FS_BOLDITALIC => $aBoldIt);
295    }
296
297    public function SetUserFont3($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
298    {
299        $this->font_files[FF_USERFONT3] =
300        array(FS_NORMAL   => $aNormal,
301            FS_BOLD       => $aBold,
302            FS_ITALIC     => $aItalic,
303            FS_BOLDITALIC => $aBoldIt);
304    }
305} // Class
306