trans 2.83 KB
#!/usr/bin/perl
# 
#  Copyright (c) 1998-2000
#   Sergey A. Babkin.  All rights reserved.
# 
#  See the full text of the license in the COPYRIGHT file.
# 
#  Sergey A. Babkin (sab123@hotmail.com, babkin@users.sourceforge.net)
# 

#
# Script to transcode the Type1 disassembled font to other encoding
#

# calculation of UniqueID from old UID and encoding name
# we don't have unsigned integer arithmetic in Perl
# so we try to do at least something
sub newuid
{
	use integer;
	my ($u,$enc)=@_;
	my $i, $uid;

	$uid=substr($u, -6, 6);
	$u=substr($u, 0, 4);

	$uid+=0;
	for $i (split(//,$enc)) {
		$uid*=37;
		$uid+=ord($i);
		$uid+=($uid>>16) & 0xff;
		$uid&=0xffffff;
	}

	($uid % 1000000) + 4000000;
	#$u . substr(sprintf("%d",$uid), 0, 5);
}

if($#ARGV != 1) {
	printf(STDERR "Use: trans src-table dst-table <src-font >dst-font\n");
	exit 1;
}

# tables are formatted in two columns, one row per character
# name decimal-code

# Read the destination table

open(FILE,"<".$ARGV[1])
	or die "Unable to read $ARGV[2]\n";
while(<FILE>) {
	@sl=split(/\s+/);
	$dst{$sl[0]}=$sl[1];
}
close(FILE);

#read the source table and build the translation table

open(FILE,"<".$ARGV[0])
	or die "Unable to read $ARGV[0]\n";
while(<FILE>) {
	@sl=split(/\s+/);
	$trans{$sl[1]}=$dst{$sl[0]};
}
close(FILE);

# name of the encoding, for UniqueID
$encname=$ARGV[1];
$encname =~ s|^.*\/||g;
$encname =~ s|\..*$||g;

# now read the font file, skip everything upto the encoding table
# we suppose that the file was autogenerated by ttf2pt1 with my patches

while(<STDIN>) {
	if( /^\/FontName\s+(\S+)/) {
		$fontname=$1;
	}
	if( /^\/UniqueID\s+(\S+)/) {
		use integer;
		my $uid=$1;
		$_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname));
	}
	print $_;
	if(/^\/Encoding/) {
		$fontfile=1;
		last;
	}
	if(/^StartCharMetrics/) {
		$fontfile=0;
		last;
	}
}

# read the old encoding table and build the new encoding table

if($fontfile) { # .t1a
	while($row=<STDIN>) {
		if( $row !~  /^dup/) {
			last;
		}

		@sl=split(/\s+/,$row);

		$new=$trans{$sl[1]};
		if($new eq "") {
			$new=$sl[1];
			if($enc{$new} eq "") {
				$enc{$new}=$sl[2];
			}
		} else {
			$enc{$new}=$sl[2];
		}
	}

	# print new encoding table

	for $i (0..255) {
		if($enc{$i}) {
			printf("dup %d %s put\n",$i,$enc{$i});
		} else {
			printf("dup %d /.notdef put\n",$i);
		}
	}
} else { # .afm
	while($row=<STDIN>) {
		if($row !~ /^C\s+(\d+)(\s*;.*)\n/) {
			last;
		}
		$code=$1;
		$part2=$2;

		$new=$trans{$code};
		if($new eq "") {
			$new=$code;
			if($enc{$new} eq "") {
				$enc{$new}=$part2;
			}
		} else {
			$enc{$new}=$part2;
		}
	}

	# print new encoding table

	for $i (0..255) {
		if($enc{$i}) {
			printf("C %d%s\n",$i,$enc{$i});
		}
	}
}

print $row;

# now copy the rest of file

while(<STDIN>) {
	if( /^\/UniqueID\s+(\S+)/) {
		use integer;
		my $uid=$1;
		$_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname));
	}
	print;
}