Chris@909: = 0 && $cc < 0xFFFF && $glyph) {
Chris@909: $cidtogidmap{$cc*2} = chr($glyph >> 8);
Chris@909: $cidtogidmap{$cc*2 + 1} = chr($glyph & 0xFF);
Chris@909: }
Chris@909: }
Chris@909: if($gn=='.notdef' && !isset($fm['MissingWidth']))
Chris@909: $fm['MissingWidth']=$w;
Chris@909: }
Chris@909: elseif($code=='FontName')
Chris@909: $fm['FontName']=$param;
Chris@909: elseif($code=='Weight')
Chris@909: $fm['Weight']=$param;
Chris@909: elseif($code=='ItalicAngle')
Chris@909: $fm['ItalicAngle']=(double)$param;
Chris@909: elseif($code=='Ascender')
Chris@909: $fm['Ascender']=(int)$param;
Chris@909: elseif($code=='Descender')
Chris@909: $fm['Descender']=(int)$param;
Chris@909: elseif($code=='UnderlineThickness')
Chris@909: $fm['UnderlineThickness']=(int)$param;
Chris@909: elseif($code=='UnderlinePosition')
Chris@909: $fm['UnderlinePosition']=(int)$param;
Chris@909: elseif($code=='IsFixedPitch')
Chris@909: $fm['IsFixedPitch']=($param=='true');
Chris@909: elseif($code=='FontBBox')
Chris@909: $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]);
Chris@909: elseif($code=='CapHeight')
Chris@909: $fm['CapHeight']=(int)$param;
Chris@909: elseif($code=='StdVW')
Chris@909: $fm['StdVW']=(int)$param;
Chris@909: }
Chris@909: if(!isset($fm['MissingWidth']))
Chris@909: $fm['MissingWidth']=600;
Chris@909:
Chris@909: if(!isset($fm['FontName']))
Chris@909: die('FontName not found');
Chris@909:
Chris@909: $fm['Widths']=$widths;
Chris@909:
Chris@909: return $fm;
Chris@909: }
Chris@909:
Chris@909: function MakeFontDescriptor($fm)
Chris@909: {
Chris@909: //Ascent
Chris@909: $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000);
Chris@909: $fd="{'Ascent'=>".$asc;
Chris@909: //Descent
Chris@909: $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200);
Chris@909: $fd.=",'Descent'=>".$desc;
Chris@909: //CapHeight
Chris@909: if(isset($fm['CapHeight']))
Chris@909: $ch=$fm['CapHeight'];
Chris@909: elseif(isset($fm['CapXHeight']))
Chris@909: $ch=$fm['CapXHeight'];
Chris@909: else
Chris@909: $ch=$asc;
Chris@909: $fd.=",'CapHeight'=>".$ch;
Chris@909: //Flags
Chris@909: $flags=0;
Chris@909: if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch'])
Chris@909: $flags+=1<<0;
Chris@909: $flags+=1<<5;
Chris@909: if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0)
Chris@909: $flags+=1<<6;
Chris@909: $fd.=",'Flags'=>".$flags;
Chris@909: //FontBBox
Chris@909: if(isset($fm['FontBBox']))
Chris@909: $fbb=$fm['FontBBox'];
Chris@909: else
Chris@909: $fbb=array(0,$des-100,1000,$asc+100);
Chris@909: $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
Chris@909: //ItalicAngle
Chris@909: $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0);
Chris@909: $fd.=",'ItalicAngle'=>".$ia;
Chris@909: //StemV
Chris@909: if(isset($fm['StdVW']))
Chris@909: $stemv=$fm['StdVW'];
Chris@909: elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight']))
Chris@909: $stemv=120;
Chris@909: else
Chris@909: $stemv=70;
Chris@909: $fd.=",'StemV'=>".$stemv;
Chris@909: //MissingWidth
Chris@909: if(isset($fm['MissingWidth']))
Chris@909: $fd.=",'MissingWidth'=>".$fm['MissingWidth'];
Chris@909: $fd.='}';
Chris@909: return $fd;
Chris@909: }
Chris@909:
Chris@909: function MakeWidthArray($fm)
Chris@909: {
Chris@909: //Make character width array
Chris@909: $s="{";
Chris@909: $cw=$fm['Widths'];
Chris@909: $els=array();
Chris@909: $c=0;
Chris@909: foreach ($cw as $i => $w)
Chris@909: {
Chris@909: $els[] = ((($c++)%16==0)?"\n\t":'').$i.'=>'.$w;
Chris@909: }
Chris@909: $s .= implode(', ', $els);
Chris@909: $s.='}';
Chris@909: return $s;
Chris@909: }
Chris@909:
Chris@909: function SaveToFile($file,$s,$mode='t')
Chris@909: {
Chris@909: $f=fopen($file,'w'.$mode);
Chris@909: if(!$f)
Chris@909: die('Can\'t write to file '.$file);
Chris@909: fwrite($f,$s,strlen($s));
Chris@909: fclose($f);
Chris@909: }
Chris@909:
Chris@909: function ReadShort($f)
Chris@909: {
Chris@909: $a=unpack('n1n',fread($f,2));
Chris@909: return $a['n'];
Chris@909: }
Chris@909:
Chris@909: function ReadLong($f)
Chris@909: {
Chris@909: $a=unpack('N1N',fread($f,4));
Chris@909: return $a['N'];
Chris@909: }
Chris@909:
Chris@909: function CheckTTF($file)
Chris@909: {
Chris@909: //Check if font license allows embedding
Chris@909: $f=fopen($file,'rb');
Chris@909: if(!$f)
Chris@909: die('Error: Can\'t open '.$file);
Chris@909: //Extract number of tables
Chris@909: fseek($f,4,SEEK_CUR);
Chris@909: $nb=ReadShort($f);
Chris@909: fseek($f,6,SEEK_CUR);
Chris@909: //Seek OS/2 table
Chris@909: $found=false;
Chris@909: for($i=0;$i<$nb;$i++)
Chris@909: {
Chris@909: if(fread($f,4)=='OS/2')
Chris@909: {
Chris@909: $found=true;
Chris@909: break;
Chris@909: }
Chris@909: fseek($f,12,SEEK_CUR);
Chris@909: }
Chris@909: if(!$found)
Chris@909: {
Chris@909: fclose($f);
Chris@909: return;
Chris@909: }
Chris@909: fseek($f,4,SEEK_CUR);
Chris@909: $offset=ReadLong($f);
Chris@909: fseek($f,$offset,SEEK_SET);
Chris@909: //Extract fsType flags
Chris@909: fseek($f,8,SEEK_CUR);
Chris@909: $fsType=ReadShort($f);
Chris@909: $rl=($fsType & 0x02)!=0;
Chris@909: $pp=($fsType & 0x04)!=0;
Chris@909: $e=($fsType & 0x08)!=0;
Chris@909: fclose($f);
Chris@909: if($rl and !$pp and !$e)
Chris@909: echo 'Warning: font license does not allow embedding';
Chris@909: }
Chris@909:
Chris@909: /*******************************************************************************
Chris@909: * $fontfile: path to TTF file (or empty string if not to be embedded) *
Chris@909: * $ufmfile: path to UFM file *
Chris@909: *******************************************************************************/
Chris@909: function MakeFont($fontfile,$ufmfile)
Chris@909: {
Chris@909: //Generate a font definition file
Chris@909: set_magic_quotes_runtime(0);
Chris@909: if(!file_exists($ufmfile))
Chris@909: die('Error: UFM file not found: '.$ufmfile);
Chris@909: $cidtogidmap = '';
Chris@909: $fm=ReadUFM($ufmfile, $cidtogidmap);
Chris@909: $fd=MakeFontDescriptor($fm);
Chris@909: //Find font type
Chris@909: if($fontfile)
Chris@909: {
Chris@909: $ext=strtolower(substr($fontfile,-3));
Chris@909: if($ext=='ttf')
Chris@909: $type='TrueTypeUnicode';
Chris@909: else
Chris@909: die('Error: not a truetype font: '.$ext);
Chris@909: }
Chris@909: else
Chris@909: {
Chris@909: if($type!='TrueTypeUnicode')
Chris@909: die('Error: incorrect font type: '.$type);
Chris@909: }
Chris@909: //Start generation
Chris@909: $basename=strtolower(substr(basename($ufmfile),0,-4));
Chris@909: $s='TCPDFFontDescriptor.define(\''.$basename."') do |font|\n";
Chris@909: $s.=" font[:type]='".$type."'\n";
Chris@909: $s.=" font[:name]='".$fm['FontName']."'\n";
Chris@909: $s.=" font[:desc]=".$fd."\n";
Chris@909: if(!isset($fm['UnderlinePosition']))
Chris@909: $fm['UnderlinePosition']=-100;
Chris@909: if(!isset($fm['UnderlineThickness']))
Chris@909: $fm['UnderlineThickness']=50;
Chris@909: $s.=" font[:up]=".$fm['UnderlinePosition']."\n";
Chris@909: $s.=" font[:ut]=".$fm['UnderlineThickness']."\n";
Chris@909: $s.=" font[:cw]=".MakeWidthArray($fm)."\n";
Chris@909: $s.=" font[:enc]=''\n";
Chris@909: $s.=" font[:diff]=''\n";
Chris@909: if($fontfile)
Chris@909: {
Chris@909: //Embedded font
Chris@909: if(!file_exists($fontfile))
Chris@909: die('Error: font file not found: '.$fontfile);
Chris@909: CheckTTF($fontfile);
Chris@909: $f=fopen($fontfile,'rb');
Chris@909: if(!$f)
Chris@909: die('Error: Can\'t open '.$fontfile);
Chris@909: $file=fread($f,filesize($fontfile));
Chris@909: fclose($f);
Chris@909: if(function_exists('gzcompress'))
Chris@909: {
Chris@909: $cmp=$basename.'.z';
Chris@909: SaveToFile($cmp,gzcompress($file),'b');
Chris@909: $s.=' font[:file]=\''.$cmp."'\n";
Chris@909: echo 'Font file compressed ('.$cmp.')
';
Chris@909:
Chris@909: $cmp=$basename.'.ctg.z';
Chris@909: SaveToFile($cmp,gzcompress($cidtogidmap),'b');
Chris@909: echo 'CIDToGIDMap created and compressed ('.$cmp.')
';
Chris@909: $s.=' font[:ctg]=\''.$cmp."'\n";
Chris@909: }
Chris@909: else
Chris@909: {
Chris@909: $s.='$file=\''.basename($fontfile)."'\n";
Chris@909: echo 'Notice: font file could not be compressed (gzcompress not available)
';
Chris@909:
Chris@909: $cmp=$basename.'.ctg';
Chris@909: $f = fopen($cmp, 'wb');
Chris@909: fwrite($f, $cidtogidmap);
Chris@909: fclose($f);
Chris@909: echo 'CIDToGIDMap created ('.$cmp.')
';
Chris@909: $s.=' font[:ctg]=\''.$cmp."'\n";
Chris@909: }
Chris@909: if($type=='Type1')
Chris@909: {
Chris@909: $s.=' font[:size1]='.$size1."\n";
Chris@909: $s.=' font[:size2]='.$size2."\n";
Chris@909: }
Chris@909: else
Chris@909: $s.=' font[:originalsize]='.filesize($fontfile)."\n";
Chris@909: }
Chris@909: else
Chris@909: {
Chris@909: //Not embedded font
Chris@909: $s.=' font[:file]='."''\n";
Chris@909: }
Chris@909: $s.="end\n";
Chris@909: SaveToFile($basename.'.rb',$s);
Chris@909: echo 'Font definition file generated ('.$basename.'.rb'.')
';
Chris@909: }
Chris@909:
Chris@909: $arg = $GLOBALS['argv'];
Chris@909: if (count($arg) >= 3) {
Chris@909: ob_start();
Chris@909: array_shift($arg);
Chris@909: MakeFont($arg[0], $arg[1]);
Chris@909: $t = ob_get_clean();
Chris@909: print preg_replace('!
!i', "\n", $t);
Chris@909: }
Chris@909: else {
Chris@909: print "Usage: makefontuni_ruby.php \n";
Chris@909: }
Chris@909: ?>