summaryrefslogtreecommitdiff
path: root/fonts/utilities/mf2pt3/mf2pt3.pl
diff options
context:
space:
mode:
Diffstat (limited to 'fonts/utilities/mf2pt3/mf2pt3.pl')
-rwxr-xr-xfonts/utilities/mf2pt3/mf2pt3.pl305
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";
+