diff options
Diffstat (limited to 'fonts/utilities/mf2pt3/mf2pt3.pl')
-rwxr-xr-x | fonts/utilities/mf2pt3/mf2pt3.pl | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/fonts/utilities/mf2pt3/mf2pt3.pl b/fonts/utilities/mf2pt3/mf2pt3.pl new file mode 100755 index 0000000000..46bc574e8e --- /dev/null +++ b/fonts/utilities/mf2pt3/mf2pt3.pl @@ -0,0 +1,305 @@ +#!/usr/bin/perl +# +#(c) Copyright 1998 Apostolos Syropoulos +# apostolo@obelix.ee.duth.gr +# + $mfplain="mfplain \'\\mode=localfont; \\batchmode; "; + $notdef=pack("ai4","u",0,0,0,0); + for($i=0; $i<=255; $i++){ $BoundingBox[$i]=$notdef } + + @Encoding = ("/_a0", "/_a1", "/_a2", "/_a3", "/_a4", + "/_a5", "/_a6", "/_a7", "/_a8", + "/_a9", "/_a10", "/_a11", "/_a12", + "/_a13", "/_a14", "/_a15", "/_a16", + "/_a17", "/_a18", "/_a19", "/_a20", + "/_a21", "/_a22", "/_a23", "/_a24", + "/_a25", "/_a26", "/_a27", "/_a28", + "/_a29", "/_a30", "/_a31", "/_a32", + "/_a33", "/_a34", "/_a35", "/_a36", + "/_a37", "/_a38", "/_a39", "/_a40", + "/_a41", "/_a42", "/_a43", "/_a44", + "/_a45", "/_a46", "/_a47", "/_a48", + "/_a49", "/_a50", "/_a51", "/_a52", + "/_a53", "/_a54", "/_a55", "/_a56", + "/_a57", "/_a58", "/_a59", "/_a60", + "/_a61", "/_a62", "/_a63", "/_a64", + "/_a65", "/_a66", "/_a67", "/_a68", + "/_a69", "/_a70", "/_a71", "/_a72", + "/_a73", "/_a74", "/_a75", "/_a76", + "/_a77", "/_a78", "/_a79", "/_a80", + "/_a81", "/_a82", "/_a83", "/_a84", + "/_a85", "/_a86", "/_a87", "/_a88", + "/_a89", "/_a90", "/_a91", "/_a92", + "/_a93", "/_a94", "/_a95", "/_a96", + "/_a97", "/_a98", "/_a99", "/_a100", + "/_a101", "/_a102", "/_a103", "/_a104", + "/_a105", "/_a106", "/_a107", "/_a108", + "/_a109", "/_a110", "/_a111", "/_a112", + "/_a113", "/_a114", "/_a115", "/_a116", + "/_a117", "/_a118", "/_a119", "/_a120", + "/_a121", "/_a122", "/_a123", "/_a124", + "/_a125", "/_a126", "/_a127", "/_a128", + "/_a129", "/_a130", "/_a131", "/_a132", + "/_a133", "/_a134", "/_a135", "/_a136", + "/_a137", "/_a138", "/_a139", "/_a140", + "/_a141", "/_a142", "/_a143", "/_a144", + "/_a145", "/_a146", "/_a147", "/_a148", + "/_a149", "/_a150", "/_a151", "/_a152", + "/_a153", "/_a154", "/_a155", "/_a156", + "/_a157", "/_a158", "/_a159", "/_a160", + "/_a161", "/_a162", "/_a163", "/_a164", + "/_a165", "/_a166", "/_a167", "/_a168", + "/_a169", "/_a170", "/_a171", "/_a172", + "/_a173", "/_a174", "/_a175", "/_a176", + "/_a177", "/_a178", "/_a179", "/_a180", + "/_a181", "/_a182", "/_a183", "/_a184", + "/_a185", "/_a186", "/_a187", "/_a188", + "/_a189", "/_a190", "/_a191", "/_a192", + "/_a193", "/_a194", "/_a195", "/_a196", + "/_a197", "/_a198", "/_a199", "/_a200", + "/_a201", "/_a202", "/_a203", "/_a204", + "/_a205", "/_a206", "/_a207", "/_a208", + "/_a209", "/_a210", "/_a211", "/_a212", + "/_a213", "/_a214", "/_a215", "/_a216", + "/_a217", "/_a218", "/_a219", "/_a220", + "/_a221", "/_a222", "/_a223", "/_a224", + "/_a225", "/_a226", "/_a227", "/_a228", + "/_a229", "/_a230", "/_a231", "/_a232", + "/_a233", "/_a234", "/_a235", "/_a236", + "/_a237", "/_a238", "/_a239", "/_a240", + "/_a241", "/_a242", "/_a243", "/_a244", + "/_a245", "/_a246", "/_a247", "/_a248", + "/_a249", "/_a250", "/_a251", "/_a252", + "/_a253", "/_a254", "/_a255"); + + +$argc = @ARGV; +$design_size = -1; +$nodel = 0; +$eofill = 0; +$noID = 1; +SWITCHES: while($_ = $ARGV[0], /^-/) +{ + shift; + if(/^-d(\d+)/) + { + $design_size = $1; + } + elsif(/^-nodel$/) + { + $nodel = 1; + } + elsif(/^-eofill$/) + { + $eofill = 1; + } + elsif(/^-I(\d+)$/) + { + die "UniqueID must lie in the range 4,000,000...4,999,999\n" + if ($1 > 4999999 || $1 < 4000000); + $UniqueID = $1; + $noID = 0; + } + elsif (!@ARGV) + { + last SWITCHES; + } +} +if (!@ARGV) +{ + print <<Usage; +This ``mf2pt3'' version 1.1 +Usage: mf2pt3 [-dsize] [-nodel] [-eofill] [-IUniqueID] <METAFONT file name> +Usage +exit(0); +} +else +{ + $MFfile = $ARGV[0]; +} +if ($noID) +{ + srand(); + $UniqueID = int(999999*rand())+4000000; + +} + +if ($design_size == -1) +{ + if ($MFfile =~ /\D+(\d+)$/) + { + $design_size=$1; + } + else + { + die "$MFfile must be a PostScript font name: there is no design size.\n"; + } +} +if($design_size >100) +{ + $mag_factor=$design_size/1000; +} +else +{ + $mag_factor=$design_size/10; +} +$mag = 100 /$mag_factor; + + $MFfile = $1 if $MFfile =~ /(\w+)\.\w*/; + + + + $mfplain .= "mag=$mag; input $MFfile \'"; + system($mfplain); + if (!(-e "$MFfile.tfm")) + { + $nodel || unlink "mpout.log"; + die "$MFfile: no such font in system\n"; + } + + opendir(Dir, "."); + $pattern = "$MFfile" . "\\.\\d+"; + @EPSFs = grep(/$pattern/, readdir(Dir)); + closedir Dir; + + $Min_llx = $Min_lly = $Max_urx = $Max_ury = 0; + + $total_chars = @EPSFs+1; + foreach $file (@EPSFs) + { + open(EPSF_FILE,"$file")||die "Can't open file $file\n"; + while (<EPSF_FILE>) + { + $BBox = pack("ai4","d",$1,$2,$3,$4) + if /%%BoundingBox: (-?\d+) (-?\d+) (-?\d+) (-?\d+)/; + } + close EPSF_FILE; + $_=$file; + /$MFfile\.(\d+)/; + $BoundingBox[$1] = $BBox; + ($_, $llx, $lly, $urx, $ury) = unpack("ai4", $BBox); + $Min_llx = $llx if $llx < $Min_llx; + $Min_lly = $lly if $lly < $Min_lly; + $Max_urx = $urx if $urx > $Max_urx; + $Max_ury = $ury if $ury > $Max_ury; + } + + open(TYPE3, ">$MFfile.pt3")||die "Can't create file $MFfile.pt3\n"; + $date = localtime; + print TYPE3 <<DATA; +%!PS-Adobe-2.0 +%%Creator: mf2pt3 1.1 Copyright 1998 Apostolos Syropoulos +%%CreationDate: $date +%%EndComments +11 dict % 11 entries +begin + /FontType 3 def + /UniqueID $UniqueID def + /FontName /$MFfile def + /FontBBox [ $Min_llx $Min_lly $Max_urx $Max_ury] def + /FontMatrix [ 0.001 0 0 0.001 0 0 ] def + /Encoding 256 array def + 0 1 255 { Encoding exch /.notdef put } for +DATA + for($i=0; $i<=256; $i++) + { + $_ = unpack("ai4", $BoundingBox[$i]); + print TYPE3 "Encoding $i $Encoding[$i] put\n" if $_ eq "d"; + } + + print TYPE3 "/BoundingBoxes $total_chars dict def\n"; + print TYPE3 "BoundingBoxes begin\n"; + print TYPE3 "/.notdef { 0 0 0 0 } def\n"; + for($i=0; $i<=256; $i++) + { + ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]); + print TYPE3 "$Encoding[$i] [ $llx $lly $urx $ury ] def\n" + if $_ eq "d"; + } + print TYPE3 "end %BoundingBoxes\n"; + + + print TYPE3 "/Metrics $total_chars dict def\n"; + print TYPE3 "Metrics begin\n"; + print TYPE3 "/.notdef 0 def\n"; + for($i=0; $i<=256; $i++) + { + ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]); + $diff = $urx - $llx; + print TYPE3 "$Encoding[$i] $diff def\n" if $_ eq "d"; + } + print TYPE3 "end %Metrics\n"; + + + print TYPE3 "/CharProcs $total_chars dict def\n"; + print TYPE3 "CharProcs begin\n"; + print TYPE3 "/.notdef { } def\n"; + for($i=0; $i<=256; $i++) + { + $_ = unpack("ai4", $BoundingBox[$i]); + if ($_ eq "d") + { + open(CHAR, "$MFfile.$i")|| + die "Can't open file $MFfile.$i\n"; + $code = ""; #"100 100 scale\n"; + while (<CHAR>) + { + $code .= $_ if $_ !~ /^%/; + } + close CHAR; + $code =~ s/showpage\n*//mg; #eliminate showpage + $code =~ s/\d setgray//mg; #eliminate setgray + $code =~ s/(\d*)\.\d+/$1/mg; #chop decimal digits + print TYPE3 $Encoding[$i], " { %\n"; + if ($eofill) + { + $code =~ s/gsave fill/GSAVE FILL/mg; # save for soon restore + $code =~ s/fill//mg; # eliminate fill + $code =~ s/newpath//mg; # eliminate fill + $code =~ s/GSAVE FILL/gsave fill/mg; # restore + print TYPE3 $code, "eofill\n"; + + } + else + { + print TYPE3 $code; + } + print TYPE3 "} bind def\n"; + } + } + print TYPE3 "end %CharProcs\n"; + + print TYPE3 <<BUILDGLYPH; + /BuildGlyph { + exch + begin + dup + Metrics exch get % get x displacement + 0 % set y displacement + 2 index + BoundingBoxes + exch get aload pop + setcachedevice + CharProcs exch get + exec + fill + end + } def + currentdict +end +/$MFfile exch definefont +pop +BUILDGLYPH +close TYPE3; + + + + + if (!$nodel) + { + unlink @EPSFs; + unlink "$MFfile.log", "$MFfile.tfm"; + } + +print "\n$MFfile $MFfile <$MFfile.pt3\n"; + |