368 lines
8.9 KiB
Bash
368 lines
8.9 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 1998-2000
|
|
# Sergey A. Babkin. All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
#
|
|
# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
|
|
#
|
|
|
|
# Use : convert [cfgfile]
|
|
|
|
# Convert TTF fonts from source directory to Type1 fonts in the destination
|
|
# directory, converted to the specified encodings. Also generate the
|
|
# fonts.scale, fonts.dir and fonts.alias files in the destination directory.
|
|
|
|
# clean some variables so that they won't be inherited from environment
|
|
|
|
ENCDIR=
|
|
MAPDIR=
|
|
|
|
# path to the configuration file
|
|
|
|
if [ $# -eq 1 ]
|
|
then
|
|
CFGFILE=$1
|
|
else
|
|
CFGFILE=`pwd`/convert.cfg
|
|
fi
|
|
|
|
# these setting would be edited during installation
|
|
|
|
TTF2PT1_BINDIR=
|
|
TTF2PT1_LIBXDIR=
|
|
TTF2PT1_SHAREDIR=
|
|
|
|
[ -z "$TTF2PT1_BINDIR" ] && {
|
|
TTF2PT1_BINDIR=`pwd`/..
|
|
}
|
|
[ -z "$TTF2PT1_LIBXDIR" ] && {
|
|
TTF2PT1_LIBXDIR=`pwd`/..
|
|
}
|
|
[ -z "$TTF2PT1_SHAREDIR" ] && {
|
|
TTF2PT1_SHAREDIR=`pwd`/..
|
|
}
|
|
|
|
# directory from where we are started
|
|
|
|
RUNDIR=`pwd`
|
|
|
|
# paths to various utilities
|
|
|
|
T1ASM=$TTF2PT1_LIBXDIR/t1asm
|
|
[ -f $T1ASM -a -x $T1ASM ] || {
|
|
# if it's not in libxdir, use whatever t1asm the system provides
|
|
T1ASM=t1asm
|
|
}
|
|
TTF2PT1=$TTF2PT1_BINDIR/ttf2pt1
|
|
TRANS=$TTF2PT1_SHAREDIR/scripts/trans
|
|
T1FDIR=$TTF2PT1_SHAREDIR/scripts/t1fdir
|
|
FORCEISO=$TTF2PT1_SHAREDIR/scripts/forceiso
|
|
X2GS=$TTF2PT1_SHAREDIR/scripts/x2gs
|
|
SUFFIX="pfa"
|
|
|
|
MYSELF=convert
|
|
|
|
# include the configuration
|
|
|
|
if [ -r $CFGFILE ]
|
|
then {
|
|
. $CFGFILE
|
|
} else {
|
|
echo "
|
|
Can't find the configuration file
|
|
$CFGFILE
|
|
Please look at the sample file convert.cfg.sample,
|
|
copy it to convert.cfg and modify for
|
|
you actual configuration." >&2
|
|
exit 1
|
|
} fi
|
|
|
|
# path to the directory with descriptions of encodings
|
|
[ -z "$ENCDIR" ] && {
|
|
ENCDIR=$TTF2PT1_SHAREDIR/encodings
|
|
}
|
|
|
|
# directory with the external Unicode maps
|
|
[ -z "$MAPDIR" ] && {
|
|
MAPDIR=$TTF2PT1_SHAREDIR/maps
|
|
}
|
|
|
|
LOG=$DSTDIR/convert.log
|
|
|
|
# configure the ttf2pt1 options from our options
|
|
|
|
# artefact of backwards-compatibility with .cfg
|
|
[ -z "$CORRECTWIDTH" -a YES != "$DONTCORRECTWIDTH" ] && {
|
|
TTF2PT1="$TTF2PT1 -OW"
|
|
}
|
|
[ YES = "$CORRECTWIDTH" ] && {
|
|
TTF2PT1="$TTF2PT1 -OW"
|
|
}
|
|
|
|
[ YES != "$HINTSUBST" ] && {
|
|
TTF2PT1="$TTF2PT1 -Ou" # meaning changed past 3.22
|
|
}
|
|
|
|
[ YES = "$ALLGLYPHS" -a YES = "$ENFORCEISO" ] && {
|
|
echo "$MYSELF: options ALLGLYPHS and ENFORCEISO are mutually exclusive" >&2
|
|
exit 1
|
|
}
|
|
|
|
[ YES = "$ALLGLYPHS" ] && {
|
|
TTF2PT1="$TTF2PT1 -a"
|
|
}
|
|
|
|
[ YES = "$GENUID" ] && {
|
|
TTF2PT1="$TTF2PT1 -uA"
|
|
}
|
|
|
|
[ YES != "$ENFORCEISO" ] && {
|
|
FORCEISO=cat
|
|
}
|
|
|
|
[ YES = "$CREATEPFB" ] && {
|
|
T1ASM="$T1ASM -b"
|
|
SUFFIX="pfb"
|
|
}
|
|
|
|
# parse the information about the source files
|
|
|
|
eval "`echo \"$SRCDIRS\" | awk '
|
|
BEGIN { n=0; }
|
|
/^ *$/ { next; }
|
|
{
|
|
if(n>9) {
|
|
printf(\"echo \\\"Only 9 encodings are supported at once!\\\" >&2\n\");
|
|
printf(\"exit 1\\n\");
|
|
} else {
|
|
printf(\"SRCDIR%d=%s\n\",n,$1);
|
|
printf(\"SRCLANG%d=%s\n\",n,$2);
|
|
printf(\"SRCENC%d=%s\n\",n,$3);
|
|
printf(\"SRCMAP%d=%s\n\",n,$4);
|
|
n++;
|
|
}
|
|
}'`"
|
|
|
|
# check whether we have the directories
|
|
|
|
mkdir $DSTDIR 2>/dev/null >/dev/null
|
|
[ -d $DSTDIR -a -r $DSTDIR -a -w $DSTDIR -a -x $DSTDIR ] || {
|
|
echo "$MYSELF: can't access the directory $DSTDIR" >&2
|
|
exit 1
|
|
}
|
|
|
|
# go to our destination directory
|
|
|
|
cd $DSTDIR || {
|
|
echo "$MYSELF: can't chdir to $DSTDIR" >&2
|
|
exit 1
|
|
}
|
|
|
|
rm -f ./* 2>/dev/null
|
|
>$LOG
|
|
|
|
for dirno in 0 1 2 3 4 5 6 7 8 9
|
|
do {
|
|
|
|
SRCDIR=`eval "echo \\\$SRCDIR$dirno"`
|
|
SRCLANG=`eval "echo \\\$SRCLANG$dirno"`
|
|
SRCENC=`eval "echo \\\$SRCENC$dirno"`
|
|
SRCMAP=`eval "echo \\\$SRCMAP$dirno"`
|
|
DSTENC=`eval "echo \\\$DSTENC$SRCLANG"`
|
|
|
|
echo $SRCDIR
|
|
echo $SRCENC
|
|
|
|
[ -z "$SRCDIR" ] && break;
|
|
|
|
[ "`ls $SRCDIR/*.[tT][tT][fF] 2>/dev/null |wc -l`" -gt 0 ] || {
|
|
echo "$MYSELF: no TTF files in $SRCDIR" >&2
|
|
exit 1
|
|
}
|
|
|
|
# check whether we have the encoding tables
|
|
|
|
[ -n "$SRCENC" ] || {
|
|
echo "$MYSELF: you must specify some source encoding" >&2
|
|
exit 1
|
|
}
|
|
|
|
[ unknown = "$SRCLANG" -o -n "$DSTENC" ] || {
|
|
echo "$MYSELF: you must specify some destination encodings" >&2
|
|
exit 1
|
|
}
|
|
|
|
# handle aliases of the destination encodings
|
|
|
|
XDSTENC=
|
|
DSTALIAS=
|
|
|
|
[ -r $ENCDIR/$SRCLANG/encodings.alias ] && {
|
|
for i in $DSTENC
|
|
do {
|
|
TO=`awk '$1=="'$i'" { print $2; }' <$ENCDIR/$SRCLANG/encodings.alias`
|
|
if [ -n "$TO" ]
|
|
then {
|
|
[ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] && {
|
|
echo "WARNING: $SRCLANG encoding $i found as both table and alias" >&2
|
|
echo "WARNING: The alias takes precedence" >&2
|
|
}
|
|
DSTALIAS="$TO $i
|
|
$DSTALIAS"
|
|
XDSTENC="$TO
|
|
$XDSTENC"
|
|
} else {
|
|
XDSTENC="$i
|
|
$XDSTENC"
|
|
} fi
|
|
} done
|
|
DSTENC=`echo "$XDSTENC" | sort -u | tr '
|
|
' ' '`
|
|
}
|
|
|
|
[ unknown != "$SRCLANG" ] && {
|
|
for i in $SRCENC $DSTENC
|
|
do {
|
|
[ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] || {
|
|
echo "$MYSELF: can't read $ENCDIR/$SRCLANG/$i.tbl" >&2
|
|
exit 1
|
|
}
|
|
} done
|
|
}
|
|
|
|
# OK convert the files
|
|
|
|
for file in $SRCDIR/*.[tT][tT][fF]
|
|
do {
|
|
name=`echo $file | tr A-Z a-z`
|
|
name=`basename $name .ttf`
|
|
|
|
echo "Converting $name"
|
|
|
|
# generate the assembler code
|
|
|
|
echo "******* $name -> t1a ************" >>$LOG
|
|
|
|
if [ -n "$SRCMAP" ]
|
|
then {
|
|
$TTF2PT1 -L $MAPDIR/$SRCMAP $file ./$name.$SRCENC 2>>$LOG
|
|
} else {
|
|
$TTF2PT1 -l $SRCLANG $file ./$name.$SRCENC 2>>$LOG
|
|
} fi
|
|
|
|
[ -s ./$name.$SRCENC.t1a ] || {
|
|
echo "$MYSELF: can't generate Type1 assembler code for $name" >&2
|
|
continue;
|
|
}
|
|
|
|
[ -s ./$name.$SRCENC.afm ] || {
|
|
echo "$MYSELF: can't generate AFM metrics file for $name" >&2
|
|
continue;
|
|
}
|
|
|
|
mv ./$name.$SRCENC.afm ./$name.$SRCENC.xafm
|
|
|
|
psname=`$T1FDIR -g $FOUNDRY " " -f ./$name.$SRCENC.t1a \
|
|
| awk '{print substr($1,2);}'`
|
|
|
|
# now for each destination encoding generate a .pfa/b file
|
|
# and record for fonts.scale
|
|
|
|
if [ unknown != "$SRCLANG" ]
|
|
then {
|
|
for enc in $DSTENC
|
|
do {
|
|
echo "******* $name -> $enc ************" >>$LOG
|
|
|
|
sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \
|
|
| $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
|
|
| $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
|
|
[ -s ./$name.$enc.$SUFFIX ] || {
|
|
echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
|
|
continue;
|
|
}
|
|
|
|
sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
|
|
| $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
|
|
| uniq | $FORCEISO >./$name.$enc.afm
|
|
[ -s ./$name.$enc.afm ] || {
|
|
echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
|
|
}
|
|
|
|
aliases=`echo "$DSTALIAS" | grep "^$enc" | cut -d\ -f2`
|
|
echo "******* aliases: $aliases" >>$LOG
|
|
|
|
$T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc $aliases -f ./$name.$enc.$SUFFIX
|
|
echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf
|
|
} done
|
|
} else {
|
|
enc="$SRCENC"
|
|
echo "******* $name -> $enc ************" >>$LOG
|
|
|
|
sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \
|
|
| $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
|
|
[ -s ./$name.$enc.$SUFFIX ] || {
|
|
echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
|
|
continue;
|
|
}
|
|
|
|
sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
|
|
| uniq | $FORCEISO >./$name.$enc.afm
|
|
[ -s ./$name.$enc.afm ] || {
|
|
echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
|
|
}
|
|
|
|
$T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc -f ./$name.$enc.$SUFFIX
|
|
echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf
|
|
} fi
|
|
|
|
[ YES = "$REMOVET1A" ] && {
|
|
rm -f ./$name.$SRCENC.t1a
|
|
rm -f ./$name.$SRCENC.xafm
|
|
}
|
|
|
|
} done
|
|
} done
|
|
|
|
wc -l <fonts.ttf >fonts.scale
|
|
cat fonts.ttf >>fonts.scale
|
|
mkfontdir
|
|
|
|
[ YES = "$GENUID" ] && {
|
|
echo "Checking for duplicate UniqueIDs..."
|
|
for id in `find . -name "*.$SUFFIX" -exec grep UniqueID {} \; \
|
|
| cut -d" " -f2 | sort | uniq -d`
|
|
do {
|
|
echo "Warning: duplicate UniqueID $id in files:" | tee -a $LOG
|
|
find . -name "*.$SUFFIX" -exec grep -l "UniqueID $id " {} \; 2>&1 | tee -a $LOG
|
|
} done
|
|
}
|
|
|
|
[ -n "$GSDIR" ] || {
|
|
echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2
|
|
echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2
|
|
echo "$MYSELF: You can do it later by running x2gs\n" >&2
|
|
exit 0
|
|
}
|
|
|
|
echo "Installing the Ghostscript fonts"
|
|
cd $RUNDIR
|
|
$X2GS $CFGFILE || {
|
|
echo "$MYSELF: Installation of the Ghostscript fonts has failed.\n" >&2
|
|
echo "$MYSELF: You can correct the problem and run x2gs to repeat\n" >&2
|
|
exit 0
|
|
}
|