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