com-tecnick-tcpdf
[ class tree: com-tecnick-tcpdf ] [ index: com-tecnick-tcpdf ] [ all elements ]

Source for file makefont.php

Documentation is available at makefont.php

  1. <?php
  2. //============================================================+
  3. // File name   : makefont.php
  4. // Begin       : 2004-12-31
  5. // Last Update : 2010-08-08
  6. // Version     : 1.2.006
  7. // License     : GNU LGPL (http://www.gnu.org/copyleft/lesser.html)
  8. //     ----------------------------------------------------------------------------
  9. //     Copyright (C) 2008-2010  Nicola Asuni - Tecnick.com S.r.l.
  10. //     
  11. // This file is part of TCPDF software library.
  12. //
  13. // TCPDF is free software: you can redistribute it and/or modify it
  14. // under the terms of the GNU Lesser General Public License as
  15. // published by the Free Software Foundation, either version 3 of the
  16. // License, or (at your option) any later version.
  17. //
  18. // TCPDF is distributed in the hope that it will be useful, but
  19. // WITHOUT ANY WARRANTY; without even the implied warranty of
  20. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  21. // See the GNU Lesser General Public License for more details.
  22. //
  23. // You should have received a copy of the GNU Lesser General Public License
  24. // along with TCPDF.  If not, see <http://www.gnu.org/licenses/>.
  25. //
  26. // See LICENSE.TXT file for more information.
  27. //  ----------------------------------------------------------------------------
  28. //
  29. // Description : Utility to generate font definition files fot TCPDF
  30. //
  31. // Authors: Nicola Asuni, Olivier Plathey, Steven Wittens
  32. //
  33. // (c) Copyright:
  34. //               Nicola Asuni
  35. //               Tecnick.com S.r.l.
  36. //               Via della Pace, 11
  37. //               09044 Quartucciu (CA)
  38. //               ITALY
  39. //               www.tecnick.com
  40. //               info@tecnick.com
  41. //============================================================+
  42.  
  43. /**
  44.  * Utility to generate font definition files fot TCPDF.
  45.  * @author Nicola Asuni, Olivier Plathey, Steven Wittens
  46.  * @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
  47.  * @package com.tecnick.tcpdf
  48.  * @link http://www.tcpdf.org
  49.  * @license http://www.gnu.org/copyleft/lesser.html LGPL
  50. */
  51.  
  52. /**
  53.  * 
  54.  * @param string $fontfile path to font file (TTF, OTF or PFB).
  55.  * @param string $fmfile font metrics file (UFM or AFM).
  56.  * @param boolean $embedded Set to false to not embed the font, true otherwise (default).
  57.  * @param string $enc Name of the encoding table to use. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats.
  58.  * @param array $patch Optional modification of the encoding
  59.  */
  60. function MakeFont($fontfile$fmfile$embedded=true$enc='cp1252'$patch=array()) {
  61.     //Generate a font definition file
  62.     ini_set('auto_detect_line_endings''1');
  63.     if (!file_exists($fontfile)) {
  64.         die('Error: file not found: '.$fontfile);
  65.     }
  66.     if (!file_exists($fmfile)) {
  67.         die('Error: file not found: '.$fmfile);
  68.     }
  69.     $cidtogidmap '';
  70.     $map array();
  71.     $diff '';
  72.     $dw 0// default width
  73.     $ffext strtolower(substr($fontfile-3));
  74.     $fmext strtolower(substr($fmfile-3));
  75.     if ($fmext == 'afm'{
  76.         if (($ffext == 'ttf'OR ($ffext == 'otf')) {
  77.             $type 'TrueType';
  78.         elseif ($ffext == 'pfb'{
  79.             $type 'Type1';
  80.         else {
  81.             die('Error: unrecognized font file extension: '.$ffext);
  82.         }
  83.         if ($enc{
  84.             $map ReadMap($enc);
  85.             foreach ($patch as $cc => $gn{
  86.                 $map[$cc$gn;
  87.             }
  88.         }
  89.         $fm ReadAFM($fmfile$map);
  90.         if (isset($widths['.notdef'])) {
  91.             $dw $widths['.notdef'];
  92.         }
  93.         if ($enc{
  94.             $diff MakeFontEncoding($map);
  95.         }
  96.         $fd MakeFontDescriptor($fmempty($map));
  97.     elseif ($fmext == 'ufm'{
  98.         $enc '';
  99.         if (($ffext == 'ttf'OR ($ffext == 'otf')) {
  100.             $type 'TrueTypeUnicode';
  101.         else {
  102.             die('Error: not a TrueType font: '.$ffext);
  103.         }
  104.         $fm ReadUFM($fmfile$cidtogidmap);
  105.         $dw $fm['MissingWidth'];
  106.         $fd MakeFontDescriptor($fmfalse);
  107.     }
  108.     //Start generation
  109.     $s '<?php'."\n";
  110.     $s .= '$type=\''.$type."';\n";
  111.     $s .= '$name=\''.$fm['FontName']."';\n";
  112.     $s .= '$desc='.$fd.";\n";
  113.     if (!isset($fm['UnderlinePosition'])) {
  114.         $fm['UnderlinePosition'= -100;
  115.     }
  116.     if (!isset($fm['UnderlineThickness'])) {
  117.         $fm['UnderlineThickness'50;
  118.     }
  119.     $s .= '$up='.$fm['UnderlinePosition'].";\n";
  120.     $s .= '$ut='.$fm['UnderlineThickness'].";\n";
  121.     if ($dw <= 0{
  122.         if (isset($fm['Widths'][32]AND ($fm['Widths'][320)) {
  123.             // assign default space width
  124.             $dw $fm['Widths'][32];
  125.         else {
  126.             $dw 600;
  127.         }
  128.     }
  129.     $s .= '$dw='.$dw.";\n";
  130.     $w MakeWidthArray($fm);
  131.     $s .= '$cw='.$w.";\n";
  132.     $s .= '$enc=\''.$enc."';\n";
  133.     $s .= '$diff=\''.$diff."';\n";
  134.     $basename substr(basename($fmfile)0-4);
  135.     if ($embedded{
  136.         //Embedded font
  137.         if (($type == 'TrueType'OR ($type == 'TrueTypeUnicode')) {
  138.             CheckTTF($fontfile);
  139.         }
  140.         $f fopen($fontfile,'rb');
  141.         if (!$f{
  142.             die('Error: Unable to open '.$fontfile);
  143.         }
  144.         $file fread($ffilesize($fontfile));
  145.         fclose($f);
  146.         if ($type == 'Type1'{
  147.             //Find first two sections and discard third one
  148.             $header (ord($file{0}== 128);
  149.             if ($header{
  150.                 //Strip first binary header
  151.                 $file substr($file6);
  152.             }
  153.             $pos strpos($file'eexec');
  154.             if (!$pos{
  155.                 die('Error: font file does not seem to be valid Type1');
  156.             }
  157.             $size1 $pos 6;
  158.             if ($header AND (ord($file{$size1}== 128)) {
  159.                 //Strip second binary header
  160.                 $file substr($file0$size1).substr($file$size1+6);
  161.             }
  162.             $pos strpos($file'00000000');
  163.             if (!$pos{
  164.                 die('Error: font file does not seem to be valid Type1');
  165.             }
  166.             $size2 $pos $size1;
  167.             $file substr($file0($size1 $size2));
  168.         }
  169.         $basename strtolower($basename);
  170.         if (function_exists('gzcompress')) {
  171.             $cmp $basename.'.z';
  172.             SaveToFile($cmpgzcompress($file9)'b');
  173.             $s .= '$file=\''.$cmp."';\n";
  174.             print "Font file compressed (".$cmp.")\n";
  175.             if (!empty($cidtogidmap)) {
  176.                 $cmp $basename.'.ctg.z';
  177.                 SaveToFile($cmpgzcompress($cidtogidmap9)'b');
  178.                 print "CIDToGIDMap created and compressed (".$cmp.")\n";
  179.                 $s .= '$ctg=\''.$cmp."';\n";
  180.             }
  181.         else {
  182.             $s .= '$file=\''.basename($fontfile)."';\n";
  183.             print "Notice: font file could not be compressed (zlib extension not available)\n";
  184.             if (!empty($cidtogidmap)) {
  185.                 $cmp $basename.'.ctg';
  186.                 $f fopen($cmp'wb');
  187.                 fwrite($f$cidtogidmap);
  188.                 fclose($f);
  189.                 print "CIDToGIDMap created (".$cmp.")\n";
  190.                 $s .= '$ctg=\''.$cmp."';\n";
  191.             }
  192.         }
  193.         if($type == 'Type1'{
  194.             $s .= '$size1='.$size1.";\n";
  195.             $s .= '$size2='.$size2.";\n";
  196.         else {
  197.             $s.='$originalsize='.filesize($fontfile).";\n";
  198.         }
  199.     else {
  200.         //Not embedded font
  201.         $s .= '$file='."'';\n";
  202.     }
  203.     $s .= '// --- EOF ---';
  204.     SaveToFile($basename.'.php',$s);
  205.     print "Font definition file generated (".$basename.".php)\n";
  206. }
  207.  
  208. /**
  209.  * Read the specified encoding map.
  210.  * @param string $enc map name (see /enc/ folder for valid names).
  211.  */
  212. function ReadMap($enc{
  213.     //Read a map file
  214.     $file dirname(__FILE__).'/enc/'.strtolower($enc).'.map';
  215.     $a file($file);
  216.     if (empty($a)) {
  217.         die('Error: encoding not found: '.$enc);
  218.     }
  219.     $cc2gn array();
  220.     foreach ($a as $l{
  221.         if ($l{0== '!'{
  222.             $e preg_split('/[ \\t]+/',rtrim($l));
  223.             $cc hexdec(substr($e[0],1));
  224.             $gn $e[2];
  225.             $cc2gn[$cc$gn;
  226.         }
  227.     }
  228.     for($i 0$i <= 255$i++{
  229.         if(!isset($cc2gn[$i])) {
  230.             $cc2gn[$i'.notdef';
  231.         }
  232.     }
  233.     return $cc2gn;
  234. }
  235.  
  236. /**
  237.  * Read UFM file
  238.  */
  239. function ReadUFM($file&$cidtogidmap{
  240.     //Prepare empty CIDToGIDMap
  241.     $cidtogidmap str_pad(''(256 256 2)"\x00");
  242.     //Read a font metric file
  243.     $a file($file);
  244.     if (empty($a)) {
  245.         die('File not found');
  246.     }
  247.     $widths array();
  248.     $fm array();
  249.     foreach($a as $l{
  250.         $e explode(' ',chop($l));
  251.         if(count($e2{
  252.             continue;
  253.         }
  254.         $code $e[0];
  255.         $param $e[1];
  256.         if($code == 'U'{
  257.             // U 827 ; WX 0 ; N squaresubnosp ; G 675 ;
  258.             //Character metrics
  259.             $cc = (int)$e[1];
  260.             if ($cc != -1{
  261.             $gn $e[7];
  262.             $w $e[4];
  263.             $glyph $e[10];
  264.             $widths[$cc$w;
  265.             if($cc == ord('X')) {
  266.                 $fm['CapXHeight'$e[13];
  267.             }
  268.             // Set GID
  269.             if (($cc >= 0AND ($cc 0xFFFFAND $glyph{
  270.                 $cidtogidmap{($cc 2)chr($glyph >> 8);
  271.                 $cidtogidmap{(($cc 21)chr($glyph 0xFF);
  272.             }
  273.         }
  274.         if((isset($gnAND ($gn == '.notdef')) AND (!isset($fm['MissingWidth']))) {
  275.             $fm['MissingWidth'$w;
  276.         }
  277.         elseif($code == 'FontName'{
  278.             $fm['FontName'$param;
  279.         elseif($code == 'Weight'{
  280.             $fm['Weight'$param;
  281.         elseif($code == 'ItalicAngle'{
  282.             $fm['ItalicAngle'= (double)$param;
  283.         elseif($code == 'Ascender'{
  284.             $fm['Ascender'= (int)$param;
  285.         elseif($code == 'Descender'{
  286.             $fm['Descender'= (int)$param;
  287.         elseif($code == 'UnderlineThickness'{
  288.             $fm['UnderlineThickness'= (int)$param;
  289.         elseif($code == 'UnderlinePosition'{
  290.             $fm['UnderlinePosition'= (int)$param;
  291.         elseif($code == 'IsFixedPitch'{
  292.             $fm['IsFixedPitch'($param == 'true');
  293.         elseif($code == 'FontBBox'{
  294.             $fm['FontBBox'array($e[1]$e[2]$e[3]$e[4]);
  295.         elseif($code == 'CapHeight'{
  296.             $fm['CapHeight'= (int)$param;
  297.         elseif($code == 'StdVW'{
  298.             $fm['StdVW'= (int)$param;
  299.         }
  300.     }
  301.     if(!isset($fm['MissingWidth'])) {
  302.         $fm['MissingWidth'600;
  303.     }
  304.     if(!isset($fm['FontName'])) {
  305.         die('FontName not found');
  306.     }
  307.     $fm['Widths'$widths;
  308.     return $fm;
  309. }
  310.  
  311. /**
  312.  * Read AFM file
  313.  */
  314. function ReadAFM($file,&$map{
  315.     //Read a font metric file
  316.     $a file($file);
  317.     if(empty($a)) {
  318.         die('File not found');
  319.     }
  320.     $widths array();
  321.     $fm array();
  322.     $fix array(
  323.         'Edot'=>'Edotaccent',
  324.         'edot'=>'edotaccent',
  325.         'Idot'=>'Idotaccent',
  326.         'Zdot'=>'Zdotaccent',
  327.         'zdot'=>'zdotaccent',
  328.         'Odblacute' => 'Ohungarumlaut',
  329.         'odblacute' => 'ohungarumlaut',
  330.         'Udblacute'=>'Uhungarumlaut',
  331.         'udblacute'=>'uhungarumlaut',
  332.         'Gcedilla'=>'Gcommaaccent'
  333.         ,'gcedilla'=>'gcommaaccent',
  334.         'Kcedilla'=>'Kcommaaccent',
  335.         'kcedilla'=>'kcommaaccent',
  336.         'Lcedilla'=>'Lcommaaccent',
  337.         'lcedilla'=>'lcommaaccent',
  338.         'Ncedilla'=>'Ncommaaccent',
  339.         'ncedilla'=>'ncommaaccent',
  340.         'Rcedilla'=>'Rcommaaccent',
  341.         'rcedilla'=>'rcommaaccent',
  342.         'Scedilla'=>'Scommaaccent',
  343.         'scedilla'=>'scommaaccent',
  344.         'Tcedilla'=>'Tcommaaccent',
  345.         'tcedilla'=>'tcommaaccent',
  346.         'Dslash'=>'Dcroat',
  347.         'dslash'=>'dcroat',
  348.         'Dmacron'=>'Dcroat',
  349.         'dmacron'=>'dcroat',
  350.         'combininggraveaccent'=>'gravecomb',
  351.         'combininghookabove'=>'hookabovecomb',
  352.         'combiningtildeaccent'=>'tildecomb',
  353.         'combiningacuteaccent'=>'acutecomb',
  354.         'combiningdotbelow'=>'dotbelowcomb',
  355.         'dongsign'=>'dong'
  356.         );
  357.     foreach($a as $l{
  358.         $e explode(' 'rtrim($l));
  359.         if (count($e2{
  360.             continue;
  361.         }
  362.         $code $e[0];
  363.         $param $e[1];
  364.         if ($code == 'C'{
  365.             //Character metrics
  366.             $cc = (int)$e[1];
  367.             $w $e[4];
  368.             $gn $e[7];
  369.             if (substr($gn-4== '20AC'{
  370.                 $gn 'Euro';
  371.             }
  372.             if (isset($fix[$gn])) {
  373.                 //Fix incorrect glyph name
  374.                 foreach ($map as $c => $n{
  375.                     if ($n == $fix[$gn]{
  376.                         $map[$c$gn;
  377.                     }
  378.                 }
  379.             }
  380.             if (empty($map)) {
  381.                 //Symbolic font: use built-in encoding
  382.                 $widths[$cc$w;
  383.             else {
  384.                 $widths[$gn$w;
  385.                 if($gn == 'X'{
  386.                     $fm['CapXHeight'$e[13];
  387.                 }
  388.             }
  389.             if($gn == '.notdef'{
  390.                 $fm['MissingWidth'$w;
  391.             }
  392.         elseif($code == 'FontName'{
  393.             $fm['FontName'$param;
  394.         elseif($code == 'Weight'{
  395.             $fm['Weight'$param;
  396.         elseif($code == 'ItalicAngle'{
  397.             $fm['ItalicAngle'= (double)$param;
  398.         elseif($code == 'Ascender'{
  399.             $fm['Ascender'= (int)$param;
  400.         elseif($code == 'Descender'{
  401.             $fm['Descender'= (int)$param;
  402.         elseif($code == 'UnderlineThickness'{
  403.             $fm['UnderlineThickness'= (int)$param;
  404.         elseif($code == 'UnderlinePosition'{
  405.             $fm['UnderlinePosition'= (int)$param;
  406.         elseif($code == 'IsFixedPitch'{
  407.             $fm['IsFixedPitch'($param == 'true');
  408.         elseif($code == 'FontBBox'{
  409.             $fm['FontBBox'array($e[1]$e[2]$e[3]$e[4]);
  410.         elseif($code == 'CapHeight'{
  411.             $fm['CapHeight'= (int)$param;
  412.         elseif($code == 'StdVW'{
  413.             $fm['StdVW'= (int)$param;
  414.         }
  415.     }
  416.     if (!isset($fm['FontName'])) {
  417.         die('FontName not found');
  418.     }
  419.     if (!empty($map)) {
  420.         if (!isset($widths['.notdef'])) {
  421.             $widths['.notdef'600;
  422.         }
  423.         if (!isset($widths['Delta']AND isset($widths['increment'])) {
  424.             $widths['Delta'$widths['increment'];
  425.         }
  426.         //Order widths according to map
  427.         for ($i 0$i <= 255$i++{
  428.             if (!isset($widths[$map[$i]])) {
  429.                 print "Warning: character ".$map[$i]." is missing\n";
  430.                 $widths[$i$widths['.notdef'];
  431.             else {
  432.                 $widths[$i$widths[$map[$i]];
  433.             }
  434.         }
  435.     }
  436.     $fm['Widths'$widths;
  437.     return $fm;
  438. }
  439.  
  440. function MakeFontDescriptor($fm$symbolic=false{
  441.     //Ascent
  442.     $asc (isset($fm['Ascender']$fm['Ascender'1000);
  443.     $fd "array('Ascent'=>".$asc;
  444.     //Descent
  445.     $desc (isset($fm['Descender']$fm['Descender': -200);
  446.     $fd .= ",'Descent'=>".$desc;
  447.     //CapHeight
  448.     if (isset($fm['CapHeight'])) {
  449.         $ch $fm['CapHeight'];
  450.     elseif (isset($fm['CapXHeight'])) {
  451.         $ch $fm['CapXHeight'];
  452.     else {
  453.         $ch $asc;
  454.     }
  455.     $fd .= ",'CapHeight'=>".$ch;
  456.     //Flags
  457.     $flags 0;
  458.     if (isset($fm['IsFixedPitch']AND $fm['IsFixedPitch']{
  459.         $flags += 1<<0;
  460.     }
  461.     if ($symbolic{
  462.         $flags += 1<<2;
  463.     else {
  464.         $flags += 1<<5;
  465.     }
  466.     if (isset($fm['ItalicAngle']AND ($fm['ItalicAngle'!= 0)) {
  467.         $flags += 1<<6;
  468.     }
  469.     $fd .= ",'Flags'=>".$flags;
  470.     //FontBBox
  471.     if (isset($fm['FontBBox'])) {
  472.         $fbb $fm['FontBBox'];
  473.     else {
  474.         $fbb array(0($desc 100)1000($asc 100));
  475.     }
  476.     $fd .= ",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
  477.     //ItalicAngle
  478.     $ia (isset($fm['ItalicAngle']$fm['ItalicAngle'0);
  479.     $fd .= ",'ItalicAngle'=>".$ia;
  480.     //StemV
  481.     if (isset($fm['StdVW'])) {
  482.         $stemv $fm['StdVW'];
  483.     elseif (isset($fm['Weight']AND preg_match('/(bold|black)/i'$fm['Weight'])) {
  484.         $stemv 120;
  485.     else {
  486.         $stemv 70;
  487.     }
  488.     $fd .= ",'StemV'=>".$stemv;
  489.     //MissingWidth
  490.     if(isset($fm['MissingWidth'])) {
  491.         $fd .= ",'MissingWidth'=>".$fm['MissingWidth'];
  492.     }
  493.     $fd .= ')';
  494.     return $fd;
  495. }
  496.  
  497. function MakeWidthArray($fm{
  498.     //Make character width array
  499.     $s 'array(';
  500.     $cw $fm['Widths'];
  501.     $els array();
  502.     $c 0;
  503.     foreach ($cw as $i => $w{
  504.         if (is_numeric($i)) {
  505.             $els[(((($c++)%10== 0"\n" '').$i.'=>'.$w;
  506.         }
  507.     }
  508.     $s .= implode(','$els);
  509.     $s .= ')';
  510.     return $s;
  511. }
  512.  
  513. function MakeFontEncoding($map{
  514.     //Build differences from reference encoding
  515.     $ref ReadMap('cp1252');
  516.     $s '';
  517.     $last 0;
  518.     for ($i 32$i <= 255$i++{
  519.         if ($map[$i!= $ref[$i]{
  520.             if ($i != $last+1{
  521.                 $s .= $i.' ';
  522.             }
  523.             $last $i;
  524.             $s .= '/'.$map[$i].' ';
  525.         }
  526.     }
  527.     return rtrim($s);
  528. }
  529.  
  530. function SaveToFile($file$s$mode='t'{
  531.     $f fopen($file'w'.$mode);
  532.     if(!$f{
  533.         die('Can\'t write to file '.$file);
  534.     }
  535.     fwrite($f$sstrlen($s));
  536.     fclose($f);
  537. }
  538.  
  539. function ReadShort($f{
  540.     $a unpack('n1n'fread($f2));
  541.     return $a['n'];
  542. }
  543.  
  544. function ReadLong($f{
  545.     $a unpack('N1N'fread($f4));
  546.     return $a['N'];
  547. }
  548.  
  549. function CheckTTF($file{
  550.     //Check if font license allows embedding
  551.     $f fopen($file'rb');
  552.     if (!$f{
  553.         die('Error: unable to open '.$file);
  554.     }
  555.     //Extract number of tables
  556.     fseek($f4SEEK_CUR);
  557.     $nb ReadShort($f);
  558.     fseek($f6SEEK_CUR);
  559.     //Seek OS/2 table
  560.     $found false;
  561.     for ($i 0$i $nb$i++{
  562.         if (fread($f4== 'OS/2'{
  563.             $found true;
  564.             break;
  565.         }
  566.         fseek($f12SEEK_CUR);
  567.     }
  568.     if (!$found{
  569.         fclose($f);
  570.         return;
  571.     }
  572.     fseek($f4SEEK_CUR);
  573.     $offset ReadLong($f);
  574.     fseek($f$offsetSEEK_SET);
  575.     //Extract fsType flags
  576.     fseek($f8SEEK_CUR);
  577.     $fsType ReadShort($f);
  578.     $rl ($fsType 0x02!= 0;
  579.     $pp ($fsType 0x04!= 0;
  580.     $e ($fsType 0x08!= 0;
  581.     fclose($f);
  582.     if($rl AND (!$ppAND (!$e)) {
  583.         print "Warning: font license does not allow embedding\n";
  584.     }
  585. }
  586.  
  587. $arg $GLOBALS['argv'];
  588. if (count($arg>= 3{
  589.     ob_start();
  590.     array_shift($arg);
  591.     if (sizeof($arg== 3{
  592.         $arg[3$arg[2];
  593.         $arg[2true;
  594.     else {
  595.         if (!isset($arg[2])) {
  596.             $arg[2true;
  597.         }
  598.         if (!isset($arg[3])) {
  599.             $arg[3'cp1252';
  600.         }
  601.     }
  602.     if (!isset($arg[4])) {
  603.         $arg[4array();
  604.     }
  605.     MakeFont($arg[0]$arg[1]$arg[2]$arg[3]$arg[4]);
  606.     $t ob_get_clean();
  607.     print preg_replace('!<BR( /)?>!i'"\n"$t);
  608. else {
  609.     print "Usage: makefont.php <ttf/otf/pfb file> <afm/ufm file> <encoding> <patch>\n";
  610. }
  611.  
  612. //============================================================+
  613. // END OF FILE                                                 
  614. //============================================================+

Documentation generated on Sun, 27 Feb 2011 16:32:36 -0800 by phpDocumentor 1.4.3