From a929ba9b205c9756f1c0d3c261185e3bacf7fdad Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sun, 25 Jun 2000 06:47:11 +0000 Subject: [PATCH] applying formatting again --- config/modules.mk | 2 +- config/unix/config.guess | 324 ++++++-- config/unix/config.sub | 163 +++- config/win32/w32-lcc.mk | 3 +- docs/tutorial/index.html | 32 +- src/base/ftextend.c | 1 + src/base/ftglyph.c | 4 +- src/base/ftmm.c | 6 +- src/base/ftobjs.c | 918 ++++++++++++---------- src/base/ftoutln.c | 23 +- src/cff/t2driver.c | 44 +- src/cff/t2gload.c | 16 +- src/cff/t2objs.c | 11 +- src/cid/cidgload.c | 28 +- src/cid/cidobjs.c | 10 +- src/cid/cidparse.c | 4 +- src/cid/cidriver.c | 56 +- src/psnames/psdriver.h | 10 +- src/psnames/psmodule.c | 174 ++-- src/psnames/psmodule.h | 6 +- src/sfnt/sfdriver.c | 12 +- src/sfnt/sfdriver.h | 2 +- src/sfnt/ttcmap.c | 4 +- src/sfnt/ttload.c | 32 +- src/sfnt/ttpost.c | 2 +- src/sfnt/ttsbit.c | 16 +- src/truetype/ttdriver.c | 58 +- src/truetype/ttgload.c | 123 +-- src/truetype/ttinterp.c | 20 +- src/truetype/ttobjs.c | 23 +- src/type1/t1afm.h | 76 +- src/type1/t1driver.c | 355 ++++----- src/type1/t1driver.h | 38 +- src/type1/t1gload.c | 1615 ++++++++++++++++++++------------------ src/type1/t1gload.h | 377 +++------ src/type1/t1hinter.c | 1188 ++++++++++++++-------------- 36 files changed, 3094 insertions(+), 2682 deletions(-) diff --git a/config/modules.mk b/config/modules.mk index 8215e2df5..110ee8128 100644 --- a/config/modules.mk +++ b/config/modules.mk @@ -51,7 +51,7 @@ make_module_list: clean_module_list # ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),) OPEN_MODULE := @echo # - CLOSE_MODULE := >> $(subst /,\,$(FT_MODULE_LIST)) + CLOSE_MODULE := >> $(subst $(SEP),$(HOSTSEP),$(FT_MODULE_LIST)) else OPEN_MODULE := @echo " CLOSE_MODULE := " >> $(FT_MODULE_LIST) diff --git a/config/unix/config.guess b/config/unix/config.guess index e1b587170..499496436 100644 --- a/config/unix/config.guess +++ b/config/unix/config.guess @@ -1,8 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 # Free Software Foundation, Inc. -# + +version='2000-06-13' + # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or @@ -23,8 +25,7 @@ # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . -# The master version of this file is at the FSF in /home/gd/gnu/lib. -# Please send patches to . +# Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and @@ -37,6 +38,46 @@ # (but try to keep the structure clean). # +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of this system. + +Operation modes: + -h, --help print this help, then exit + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$help" + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + # Use $HOST_CC if defined. $CC may point to a cross-compiler if test x"$CC_FOR_BUILD" = x; then if test x"$HOST_CC" != x; then @@ -68,6 +109,43 @@ trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # Netbsd (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-cbm ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format. + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -77,41 +155,51 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text .globl main + .align 4 .ent main main: - .frame \$30,0,\$26,0 - .prologue 0 - .long 0x47e03d80 # implver $0 - lda \$2,259 - .long 0x47e20c21 # amask $2,$1 - srl \$1,8,\$2 - sll \$2,2,\$2 - sll \$0,3,\$0 - addl \$1,\$0,\$0 - addl \$2,\$0,\$0 - ret \$31,(\$26),1 + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit .end main EOF $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then - ./$dummy - case "$?" in - 7) + case `./$dummy` in + 0-0) UNAME_MACHINE="alpha" ;; - 15) + 1-0) UNAME_MACHINE="alphaev5" ;; - 14) + 1-1) UNAME_MACHINE="alphaev56" ;; - 10) + 1-101) UNAME_MACHINE="alphapca56" ;; - 16) + 2-303) UNAME_MACHINE="alphaev6" ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; esac fi rm -f $dummy.s $dummy @@ -129,9 +217,6 @@ EOF Amiga*:UNIX_System_V:4.0:*) echo m68k-cbm-sysv4 exit 0;; - amiga:NetBSD:*:*) - echo m68k-cbm-netbsd${UNAME_RELEASE} - exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -162,9 +247,6 @@ EOF arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; - arm32:NetBSD:*:*) - echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; SR2?01:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; @@ -221,15 +303,12 @@ EOF aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; - atari*:NetBSD:*:*) - echo m68k-atari-netbsd${UNAME_RELEASE} - exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor + # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not @@ -253,15 +332,9 @@ EOF *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; - sun3*:NetBSD:*:*) - echo m68k-sun-netbsd${UNAME_RELEASE} - exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; - mac68k:NetBSD:*:*) - echo m68k-apple-netbsd${UNAME_RELEASE} - exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -274,9 +347,6 @@ EOF powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; - macppc:NetBSD:*:*) - echo powerpc-apple-netbsd${UNAME_RELEASE} - exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; @@ -292,6 +362,7 @@ EOF mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus +#include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { @@ -331,7 +402,7 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110] + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] @@ -408,7 +479,7 @@ EOF ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) @@ -429,6 +500,8 @@ EOF 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE #include #include @@ -553,10 +626,13 @@ EOF -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ exit 0 ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos @@ -569,13 +645,10 @@ EOF F301:UNIX_System_V:*:*) echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` exit 0 ;; - hp3[0-9][05]:NetBSD:*:*) - echo m68k-hp-netbsd${UNAME_RELEASE} - exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; - i?86:BSD/386:*:* | i?86:BSD/OS:*:*) + i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) @@ -585,17 +658,8 @@ EOF echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) - if test -x /usr/bin/objformat; then - if test "elf" = "`/usr/bin/objformat`"; then - echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` - exit 0 - fi - fi echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; - *:NetBSD:*:*) - echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` - exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; @@ -623,6 +687,9 @@ EOF *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; *:Linux:*:*) # The BFD linker knows what the default object file format is, so @@ -644,6 +711,10 @@ EOF echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; + elf_i?86) + echo "${UNAME_MACHINE}-pc-linux" + exit 0 + ;; i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 @@ -657,7 +728,7 @@ EOF exit 0 ;; elf32arm*) - echo "${UNAME_MACHINE}-unknown-linux-gnu" + echo "${UNAME_MACHINE}-unknown-linux-gnuoldld" exit 0 ;; armelf_linux*) @@ -668,7 +739,7 @@ EOF echo "${UNAME_MACHINE}-unknown-linux-gnuaout" exit 0 ;; - elf32ppc) + elf32ppc | elf32ppclinux) # Determine Lib Version cat >$dummy.c < @@ -695,51 +766,65 @@ EOF if test "$?" = 0 ; then LIBC="libc1" fi - fi + fi rm -f $dummy.c $dummy echo powerpc-unknown-linux-gnu${LIBC} exit 0 ;; + shelf_linux) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; esac if test "${UNAME_MACHINE}" = "alpha" ; then - sed 's/^ //' <$dummy.s - .globl main - .ent main - main: - .frame \$30,0,\$26,0 - .prologue 0 - .long 0x47e03d80 # implver $0 - lda \$2,259 - .long 0x47e20c21 # amask $2,$1 - srl \$1,8,\$2 - sll \$2,2,\$2 - sll \$0,3,\$0 - addl \$1,\$0,\$0 - addl \$2,\$0,\$0 - ret \$31,(\$26),1 - .end main + cat <$dummy.s + .data + \$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main + main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main EOF LIBC="" $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then - ./$dummy - case "$?" in - 7) + case `./$dummy` in + 0-0) UNAME_MACHINE="alpha" ;; - 15) + 1-0) UNAME_MACHINE="alphaev5" ;; - 14) + 1-1) UNAME_MACHINE="alphaev56" ;; - 10) + 1-101) UNAME_MACHINE="alphapca56" ;; - 16) + 2-303) UNAME_MACHINE="alphaev6" ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; esac objdump --private-headers $dummy | \ @@ -753,6 +838,7 @@ EOF elif test "${UNAME_MACHINE}" = "mips" ; then cat >$dummy.c < /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { @@ -768,6 +854,8 @@ EOF EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy + elif test "${UNAME_MACHINE}" = "s390"; then + echo s390-ibm-linux && exit 0 else # Either a pre-BFD a.out linker (linux-gnuoldld) # or one that does not give us useful --help. @@ -789,6 +877,7 @@ EOF cat >$dummy.c < #ifdef __cplusplus +#include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { @@ -860,7 +949,11 @@ EOF echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; + i?86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; pc:*:*:*) + # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp @@ -974,8 +1067,26 @@ EOF *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; *:QNX:*:4*) - echo i386-qnx-qnx${UNAME_VERSION} + echo i386-pc-qnx + exit 0 ;; + NSR-W:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; esac @@ -1116,6 +1227,47 @@ then esac fi -#echo '(Unable to guess system type)' 1>&2 +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess version = $version + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/unix/config.sub b/config/unix/config.sub index 28426bb8f..6e5f1a80c 100644 --- a/config/unix/config.sub +++ b/config/unix/config.sub @@ -1,6 +1,10 @@ #! /bin/sh # Configuration validation subroutine script, version 1.1. -# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. + +version='2000-06-20' + # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. @@ -25,6 +29,8 @@ # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. +# Please send patches to . +# # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. @@ -45,30 +51,61 @@ # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. -if [ x$1 = x ] -then - echo Configuration name missing. 1>&2 - echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 - echo "or $0 ALIAS" 1>&2 - echo where ALIAS is a recognized configuration type. 1>&2 - exit 1 -fi +me=`echo "$0" | sed -e 's,.*/,,'` -# First pass through any local machine types. -case $1 in - *local*) - echo $1 - exit 0 - ;; - *) - ;; +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - linux-gnu*) + nto-qnx* | linux-gnu*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -94,7 +131,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple) + -apple | -axis) os= basic_machine=$1 ;; @@ -169,15 +206,19 @@ case $basic_machine in tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ - | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ - | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | sh[34] \ + | powerpc | powerpcle \ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ | mips64vr5000 | miprs64vr5000el | mcore \ | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ - | thumb | d10v | fr30) + | thumb | d10v | fr30 | avr) basic_machine=$basic_machine-unknown ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) @@ -186,7 +227,7 @@ case $basic_machine in # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. - i[34567]86) + i[234567]86) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. @@ -196,13 +237,16 @@ case $basic_machine in ;; # Recognize the basic CPU types with company name. # FIXME: clean up the formatting here. - vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ | xmp-* | ymp-* \ - | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ - | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | clipper-* | orion-* \ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ @@ -210,9 +254,10 @@ case $basic_machine in | mips64el-* | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ | mipstx39-* | mipstx39el-* | mcore-* \ - | f301-* | armv*-* | t3e-* \ + | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ - | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* ) + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ + | bs2000-* | tic54x-* | c54x-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. @@ -310,6 +355,9 @@ case $basic_machine in crds | unos) basic_machine=m68k-crds ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; da30 | da30-*) basic_machine=m68k-da30 ;; @@ -464,9 +512,6 @@ case $basic_machine in basic_machine=i386-unknown os=-mingw32 ;; - i386-qnx | qnx) - basic_machine=i386-qnx - ;; iris | iris4d) basic_machine=mips-sgi case $os in @@ -513,6 +558,10 @@ case $basic_machine in mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; monitor) basic_machine=m68k-rom68k os=-coff @@ -585,6 +634,9 @@ case $basic_machine in np1) basic_machine=np1-gould ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -617,7 +669,7 @@ case $basic_machine in pentium | p5 | k5 | k6 | nexen) basic_machine=i586-pc ;; - pentiumpro | p6 | 6x86) + pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) @@ -626,7 +678,7 @@ case $basic_machine in pentium-* | p5-* | k5-* | k6-* | nexen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - pentiumpro-* | p6-* | 6x86-*) + pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) @@ -729,6 +781,10 @@ case $basic_machine in sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; symmetry) basic_machine=i386-sequent os=-dynix @@ -737,6 +793,10 @@ case $basic_machine in basic_machine=t3e-cray os=-unicos ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; tx39) basic_machine=mipstx39-unknown ;; @@ -838,6 +898,9 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; + sh3 | sh4) + base_machine=sh-unknown + ;; sparc | sparcv9) basic_machine=sparc-sun ;; @@ -918,12 +981,25 @@ case $os in | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*) + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit*) # Remember, each alternative MUST END IN *, to match a version number. ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mon960* | -lnews*) + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` @@ -940,6 +1016,9 @@ case $os in -opened*) os=-openedition ;; + -wince*) + os=-wince + ;; -osfrose*) os=-osfrose ;; @@ -964,6 +1043,9 @@ case $os in -ns2 ) os=-nextstep2 ;; + -nsk) + os=-nsk + ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` @@ -977,9 +1059,6 @@ case $os in -oss*) os=-sysv3 ;; - -qnx) - os=-qnx4 - ;; -svr4) os=-sysv4 ;; @@ -1230,3 +1309,11 @@ case $basic_machine in esac echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/win32/w32-lcc.mk b/config/win32/w32-lcc.mk index f042d2382..1ac7b8250 100644 --- a/config/win32/w32-lcc.mk +++ b/config/win32/w32-lcc.mk @@ -119,7 +119,8 @@ ifdef BUILD_FREETYPE # librarian library_file {list of object files} # $(FT_LIBRARY): $(OBJECTS_LIST) - lcclib /out:$(subst /,\\,$@) $(subst /,\\,$(OBJECTS_LIST)) + lcclib /out:$(subst $(SEP),$(HOSTSEP),$@) \ + $(subst $(SEP),$(HOSTSEP),$(OBJECTS_LIST)) endif diff --git a/docs/tutorial/index.html b/docs/tutorial/index.html index a9e04edf7..b09b696f8 100644 --- a/docs/tutorial/index.html +++ b/docs/tutorial/index.html @@ -94,7 +94,7 @@
  • Load each modules that FreeType knows about in the library. This means that by default, your new library object is able - to handle TrueType, Type 1, CID-keyed & OpenType/CFF fonts + to handle TrueType, Type 1, CID-keyed & OpenType/CFF fonts gracefully.

  • @@ -240,7 +240,8 @@ FreeType 2 reference manual in order to learn how to use it.

    Note that providing a custom stream might also be used to access a - TrueType font embedded in a Postscript Type42 wrapper..

    + TrueType font embedded in a Postscript Type 42 wrapper.

    +

    @@ -487,27 +488,26 @@
  • If there is a glyph image in another format (e.g. a vectorial - outline), load it in the glyph slot. Then, scale it to the - current size, unless the FT_LOAD_NO_SCALE flag is - set.

    + outline), load it in the glyph slot. Then, scale it to the + current size, unless the FT_LOAD_NO_SCALE flag is + set.

  • -

    If the glyph image was loaded and scaled, try to grid-fit it (which - dramatically improves its quality) unless the flag +

    If the glyph image was loaded and scaled, try to grid-fit it + (which dramatically improves its quality) unless the flag FT_LOAD_NO_HINTING is set.

  • -
  • -

    If the glyph image is scalable, transform it through the current - transform (that can be set with FT_Set_Transform).

    +

    If the glyph image is scalable, transform it through the + current transform (which can be set with + FT_Set_Transform()).

  • -
  • -

    Finally, if the FT_LOAD_RENDER flag is set, convert the - glyph image into a bitmap. By default, this means a 1-bit - monochrome bitmap, unless FT_LOAD_ANTI_ALIAS is set, - where an 8-bit 256-gray-levels anti-aliased bitmap is generated. -

    +

    Finally, if the FT_LOAD_RENDER flag is set, convert + the glyph image into a bitmap. By default, this means a 1-bit + monochrome bitmap, unless FT_LOAD_ANTI_ALIAS is set, + in which case an 8-bit 256-gray-levels anti-aliased bitmap is + generated.

  • diff --git a/src/base/ftextend.c b/src/base/ftextend.c index 7b4f22283..0ac950156 100644 --- a/src/base/ftextend.c +++ b/src/base/ftextend.c @@ -143,6 +143,7 @@ FT_Int n = registry->num_extensions; FT_Extension_Class* cur = registry->classes + n; + if ( n >= FT_MAX_EXTENSIONS ) return FT_Err_Too_Many_Extensions; diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c index 33f09b502..472143cf2 100644 --- a/src/base/ftglyph.c +++ b/src/base/ftglyph.c @@ -210,8 +210,8 @@ /* transform the outline -- note that the original metrics are NOT */ /* transformed by this, only the outline points themselves... */ FT_Outline_Translate( &face->glyph->outline, - origin_x, - origin_y ); + origin_x, + origin_y ); /* compute the size in pixels of the outline */ FT_Outline_Get_CBox( &face->glyph->outline, &cbox ); diff --git a/src/base/ftmm.c b/src/base/ftmm.c index 4f6457261..a8c6871f1 100644 --- a/src/base/ftmm.c +++ b/src/base/ftmm.c @@ -48,7 +48,7 @@ func = (FT_Get_MM_Func)driver->root.clazz->get_interface( - FT_MODULE(driver), "get_mm" ); + FT_MODULE( driver ), "get_mm" ); if ( func ) error = func( face, master ); } @@ -77,7 +77,7 @@ func = (FT_Set_MM_Design_Func)driver->root.clazz->get_interface( - FT_MODULE(driver), "set_mm_design" ); + FT_MODULE( driver ), "set_mm_design" ); if ( func ) error = func( face, num_coords, coords ); } @@ -106,7 +106,7 @@ func = (FT_Set_MM_Blend_Func)driver->root.clazz->get_interface( - FT_MODULE(driver), "set_mm_blend" ); + FT_MODULE( driver ), "set_mm_blend" ); if ( func ) error = func( face, num_coords, coords ); } diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index f8889add2..843bf0f2b 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -23,6 +23,8 @@ #include +#include /* for strcmp() */ + /*************************************************************************/ /*************************************************************************/ @@ -325,38 +327,43 @@ /*************************************************************************/ /*************************************************************************/ - /************************************************************************** - * - * The glyph loader is a simple object which is used to load a set of - * glyphs easily. It is critical for the correct loading of composites. - * - * Ideally, one can see it as a stack of abstract "glyph" objects. - * - * loader.base is really the bottom of the stack. It describes a - * single glyph image made of the juxtaposition of several - * glyphs (those 'in the stack') - * - * loader.current describes the top of the stack, on which a new - * glyph can be loaded. - * - * Rewind clears the stack - * Prepare means set up "loader.current" for addition of a new glyph image - * Add means add the 'current' glyph image to the 'base' one, and - * prepare for another one.. - * - * the glyph loader is now a base object. Each driver used to re-implement - * it in one way or the other, which wasted code and energy.. - * - *************************************************************************/ - /* create a new glyph loader */ - BASE_FUNC(FT_Error) FT_GlyphLoader_New( FT_Memory memory, - FT_GlyphLoader* *aloader ) + /*************************************************************************/ + /* */ + /* The glyph loader is a simple object which is used to load a set of */ + /* glyphs easily. It is critical for the correct loading of composites. */ + /* */ + /* Ideally, one can see it as a stack of abstract `glyph' objects. */ + /* */ + /* loader.base Is really the bottom of the stack. It describes a */ + /* single glyph image made of the juxtaposition of */ + /* several glyphs (those `in the stack'). */ + /* */ + /* loader.current Describes the top of the stack, on which a new */ + /* glyph can be loaded. */ + /* */ + /* Rewind Clears the stack. */ + /* Prepare Set up `loader.current' for addition of a new glyph */ + /* image. */ + /* Add Add the `current' glyph image to the `base' one, */ + /* and prepare for another one. */ + /* */ + /* The glyph loader is now a base object. Each driver used to */ + /* re-implement it in one way or the other, which wasted code and */ + /* energy. */ + /* */ + /*************************************************************************/ + + + /* create a new glyph loader */ + BASE_FUNC( FT_Error ) FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader** aloader ) { FT_GlyphLoader* loader; FT_Error error; - if (!ALLOC(loader, sizeof(*loader))) + + if ( !ALLOC( loader, sizeof ( *loader ) ) ) { loader->memory = memory; *aloader = loader; @@ -365,12 +372,13 @@ } - /* rewind the glyph loader - reset counters to 0 */ - BASE_FUNC(void) FT_GlyphLoader_Rewind( FT_GlyphLoader* loader ) + /* rewind the glyph loader - reset counters to 0 */ + BASE_FUNC( void ) FT_GlyphLoader_Rewind( FT_GlyphLoader* loader ) { FT_GlyphLoad* base = &loader->base; FT_GlyphLoad* current = &loader->current; + base->outline.n_points = 0; base->outline.n_contours = 0; base->num_subglyphs = 0; @@ -379,11 +387,13 @@ } - /* reset the glyph loader, frees all allocated tables and starts from zero */ - BASE_FUNC(void) FT_GlyphLoader_Reset( FT_GlyphLoader* loader ) + /* reset the glyph loader, frees all allocated tables */ + /* and starts from zero */ + BASE_FUNC( void ) FT_GlyphLoader_Reset( FT_GlyphLoader* loader ) { FT_Memory memory = loader->memory; + FREE( loader->base.outline.points ); FREE( loader->base.outline.tags ); FREE( loader->base.outline.contours ); @@ -398,69 +408,73 @@ } - /* delete a glyph loader */ - BASE_FUNC(void) FT_GlyphLoader_Done( FT_GlyphLoader* loader ) + /* delete a glyph loader */ + BASE_FUNC( void ) FT_GlyphLoader_Done( FT_GlyphLoader* loader ) { - if (loader) + if ( loader ) { FT_Memory memory = loader->memory; + FT_GlyphLoader_Reset(loader); FREE( loader ); } } - /* re-adjust the 'current' outline fields */ - static void FT_GlyphLoader_Adjust_Points( FT_GlyphLoader* loader ) + /* re-adjust the `current' outline fields */ + static void FT_GlyphLoader_Adjust_Points( FT_GlyphLoader* loader ) { FT_Outline* base = &loader->base.outline; FT_Outline* current = &loader->current.outline; + current->points = base->points + base->n_points; current->tags = base->tags + base->n_points; current->contours = base->contours + base->n_contours; /* handle extra points table - if any */ - if (loader->use_extra) - loader->current.extra_points = loader->base.extra_points + base->n_points; + if ( loader->use_extra ) + loader->current.extra_points = + loader->base.extra_points + base->n_points; } - - BASE_FUNC(FT_Error) FT_GlyphLoader_Create_Extra( FT_GlyphLoader* loader ) + BASE_FUNC( FT_Error ) FT_GlyphLoader_Create_Extra( + FT_GlyphLoader* loader ) { FT_Error error; FT_Memory memory = loader->memory; + if ( !ALLOC_ARRAY( loader->base.extra_points, loader->max_points, FT_Vector ) ) { loader->use_extra = 1; - FT_GlyphLoader_Adjust_Points(loader); + FT_GlyphLoader_Adjust_Points( loader ); } return error; } - - - /* re-adjust the 'current' subglyphs field */ - static void FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader* loader ) + /* re-adjust the `current' subglyphs field */ + static void FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader* loader ) { FT_GlyphLoad* base = &loader->base; FT_GlyphLoad* current = &loader->current; + current->subglyphs = base->subglyphs + base->num_subglyphs; } - /* ensure that we can add n_points and n_contours to our glyph. this */ - /* function reallocates its outline tables if necessary. Note that */ - /* it DOESN'T change the number of points within the loader !! */ - BASE_FUNC(FT_Error) FT_GlyphLoader_Check_Points( FT_GlyphLoader* loader, - FT_UInt n_points, - FT_UInt n_contours ) + /* Ensure that we can add `n_points' and `n_contours' to our glyph. this */ + /* function reallocates its outline tables if necessary. Note that it */ + /* DOESN'T change the number of points within the loader! */ + BASE_FUNC( FT_Error ) FT_GlyphLoader_Check_Points( + FT_GlyphLoader* loader, + FT_UInt n_points, + FT_UInt n_contours ) { FT_Memory memory = loader->memory; FT_Error error = FT_Err_Ok; @@ -470,18 +484,21 @@ FT_UInt new_max; + /* check points & tags */ new_max = base->n_points + current->n_points + n_points; - if (new_max > loader->max_points) + if ( new_max > loader->max_points ) { - new_max = (new_max+7) & -8; - if ( REALLOC_ARRAY( base->points, base->n_points, new_max, FT_Vector ) || - REALLOC_ARRAY( base->tags, base->n_points, new_max, FT_Byte ) ) + new_max = ( new_max + 7 ) & -8; + if ( REALLOC_ARRAY( base->points, base->n_points, + new_max, FT_Vector ) || + REALLOC_ARRAY( base->tags, base->n_points, + new_max, FT_Byte ) ) goto Exit; if ( loader->use_extra && - REALLOC_ARRAY( loader->base.extra_points, base->n_points, new_max, - FT_Vector ) ) + REALLOC_ARRAY( loader->base.extra_points, base->n_points, + new_max, FT_Vector ) ) goto Exit; adjust = 1; @@ -491,17 +508,18 @@ /* check contours */ new_max = base->n_contours + current->n_contours + n_contours; - if (new_max > loader->max_contours) + if ( new_max > loader->max_contours ) { - new_max = (new_max+3) & -4; - if (REALLOC_ARRAY( base->contours, base->n_contours, new_max, FT_Short )) + new_max = ( new_max + 3 ) & -4; + if ( REALLOC_ARRAY( base->contours, base->n_contours, + new_max, FT_Short ) ) goto Exit; adjust = 1; loader->max_contours = new_max; } - if (adjust) + if ( adjust ) FT_GlyphLoader_Adjust_Points( loader ); Exit: @@ -509,11 +527,12 @@ } - /* ensure that we can add n_subglyphs to our glyph. this function */ - /* reallocates its subglyphs table if necessary. Note that it DOES */ - /* NOT change the number of subglyphs within the loader !! */ - BASE_FUNC(FT_Error) FT_GlyphLoader_Check_Subglyphs( FT_GlyphLoader* loader, - FT_UInt n_subs ) + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + BASE_FUNC( FT_Error ) FT_GlyphLoader_Check_Subglyphs( + FT_GlyphLoader* loader, + FT_UInt n_subs ) { FT_Memory memory = loader->memory; FT_Error error = FT_Err_Ok; @@ -522,12 +541,13 @@ FT_GlyphLoad* base = &loader->base; FT_GlyphLoad* current = &loader->current; + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; - if (new_max > loader->max_subglyphs) + if ( new_max > loader->max_subglyphs ) { - new_max = (new_max+1) & -2; - if (REALLOC_ARRAY( base->subglyphs, base->num_subglyphs, - new_max, FT_SubGlyph )) + new_max = ( new_max + 1 ) & -2; + if ( REALLOC_ARRAY( base->subglyphs, base->num_subglyphs, + new_max, FT_SubGlyph ) ) goto Exit; loader->max_subglyphs = new_max; @@ -540,11 +560,12 @@ } - /* prepare loader for the addition of a new glyph on top of the base one */ - BASE_FUNC(void) FT_GlyphLoader_Prepare( FT_GlyphLoader* loader ) + /* prepare loader for the addition of a new glyph on top of the base one */ + BASE_FUNC( void ) FT_GlyphLoader_Prepare( FT_GlyphLoader* loader ) { FT_GlyphLoad* current = &loader->current; + current->outline.n_points = 0; current->outline.n_contours = 0; current->num_subglyphs = 0; @@ -554,8 +575,8 @@ } - /* add current glyph to the base image - and prepare for another */ - BASE_FUNC(void) FT_GlyphLoader_Add( FT_GlyphLoader* loader ) + /* add current glyph to the base image - and prepare for another */ + BASE_FUNC( void ) FT_GlyphLoader_Add( FT_GlyphLoader* loader ) { FT_GlyphLoad* base = &loader->base; FT_GlyphLoad* current = &loader->current; @@ -564,6 +585,7 @@ FT_UInt n_base_points = base->outline.n_points; FT_UInt n; + base->outline.n_points += current->outline.n_points; base->outline.n_contours += current->outline.n_contours; base->num_subglyphs += current->num_subglyphs; @@ -577,38 +599,44 @@ } - BASE_FUNC(FT_Error) FT_GlyphLoader_Copy_Points( FT_GlyphLoader* target, - FT_GlyphLoader* source ) + BASE_FUNC( FT_Error ) FT_GlyphLoader_Copy_Points( + FT_GlyphLoader* target, + FT_GlyphLoader* source ) { FT_Error error; FT_UInt num_points = source->base.outline.n_points; FT_UInt num_contours = source->base.outline.n_contours; + error = FT_GlyphLoader_Check_Points( target, num_points, num_contours ); - if (!error) + if ( !error ) { FT_Outline* out = &target->base.outline; FT_Outline* in = &source->base.outline; + - MEM_Copy( out->points, in->points, num_points * sizeof(FT_Vector) ); - MEM_Copy( out->tags, in->tags, num_points * sizeof(char) ); - MEM_Copy( out->contours, in->contours, num_contours * sizeof(short) ); + MEM_Copy( out->points, in->points, + num_points * sizeof ( FT_Vector ) ); + MEM_Copy( out->tags, in->tags, + num_points * sizeof ( char ) ); + MEM_Copy( out->contours, in->contours, + num_contours * sizeof ( short ) ); - /* do we need to copy the extra points ? */ - if (target->use_extra && source->use_extra) + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) MEM_Copy( target->base.extra_points, source->base.extra_points, - num_points * sizeof(FT_Vector) ); + num_points * sizeof ( FT_Vector ) ); out->n_points = num_points; out->n_contours = num_contours; FT_GlyphLoader_Adjust_Points( target ); } + return error; } - /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -628,22 +656,23 @@ FT_Memory memory = driver->root.memory; FT_Error error = FT_Err_Ok; - if (FT_DRIVER_USES_OUTLINES(driver)) + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) error = FT_GlyphLoader_New( memory, &slot->loader ); - if (!error && clazz->init_slot) + if ( !error && clazz->init_slot ) error = clazz->init_slot( slot ); return error; } - static void ft_glyphslot_clear( FT_GlyphSlot slot ) + static void ft_glyphslot_clear( FT_GlyphSlot slot ) { /* clear all public fields in the glyph slot */ - MEM_Set( &slot->metrics, 0, sizeof(slot->metrics) ); - MEM_Set( &slot->outline, 0, sizeof(slot->outline) ); - MEM_Set( &slot->bitmap, 0, sizeof(slot->bitmap) ); + MEM_Set( &slot->metrics, 0, sizeof ( slot->metrics ) ); + MEM_Set( &slot->outline, 0, sizeof ( slot->outline ) ); + MEM_Set( &slot->bitmap, 0, sizeof ( slot->bitmap ) ); slot->bitmap_left = 0; slot->bitmap_top = 0; @@ -659,30 +688,29 @@ } - static void ft_glyphslot_done( FT_GlyphSlot slot ) + static void ft_glyphslot_done( FT_GlyphSlot slot ) { FT_Driver driver = slot->face->driver; FT_Driver_Class* clazz = driver->clazz; FT_Memory memory = driver->root.memory; + /* free bitmap buffer if needed */ if ( slot->flags & ft_glyph_own_bitmap ) FREE( slot->bitmap.buffer ); /* free glyph loader */ - if (FT_DRIVER_USES_OUTLINES(driver)) + if ( FT_DRIVER_USES_OUTLINES( driver ) ) { FT_GlyphLoader_Done( slot->loader ); slot->loader = 0; } - if (clazz->done_slot) + if ( clazz->done_slot ) clazz->done_slot( slot ); } - - /*************************************************************************/ /* */ /* */ @@ -703,15 +731,15 @@ /* */ /* FreeType error code. 0 means success. */ /* */ - FT_EXPORT_FUNC( FT_Error ) FT_New_GlyphSlot( FT_Face face, FT_GlyphSlot* aslot ) { - FT_Error error; - FT_Driver driver; - FT_Driver_Class* clazz; - FT_Memory memory; - FT_GlyphSlot slot; + FT_Error error; + FT_Driver driver; + FT_Driver_Class* clazz; + FT_Memory memory; + FT_GlyphSlot slot; + *aslot = 0; @@ -728,7 +756,7 @@ slot->face = face; error = ft_glyphslot_init( slot ); - if (error) + if ( error ) { ft_glyphslot_done( slot ); FREE( slot ); @@ -766,15 +794,17 @@ FT_GlyphSlot* parent; FT_GlyphSlot cur; + /* Remove slot from its parent face's list */ parent = &slot->face->glyph; cur = *parent; + while ( cur ) { if ( cur == slot ) { *parent = cur->next; - ft_glyphslot_done(slot); + ft_glyphslot_done( slot ); FREE( slot ); break; } @@ -784,9 +814,8 @@ } - - /* forward declaration */ - static FT_Renderer ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + /* forward declaration */ + static FT_Renderer ft_lookup_glyph_renderer( FT_GlyphSlot slot ); /*************************************************************************/ @@ -796,8 +825,8 @@ /* */ /* */ /* A function used to set the transformation that is applied to glyph */ - /* images just before they're converted to bitmaps in a glyph slot */ - /* when FT_Render_Glyph is called.. */ + /* images just before they are converted to bitmaps in a glyph slot */ + /* when FT_Render_Glyph() is called. */ /* */ /* */ /* face :: A handle to the source face object. */ @@ -882,10 +911,9 @@ /* transformed with the information passed to a previous call to */ /* FT_Set_Transform. */ /* */ - /* Note that this also transforms the "face.glyph.advance" field, */ - /* but **NOT** the values in "face.glyph.metrics".. */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ /* */ - FT_EXPORT_FUNC( FT_Error ) FT_Load_Glyph( FT_Face face, FT_UInt glyph_index, FT_Int load_flags ) @@ -894,6 +922,7 @@ FT_Driver driver; FT_GlyphSlot slot; + if ( !face || !face->size || !face->glyph ) return FT_Err_Invalid_Face_Handle; @@ -913,10 +942,11 @@ face->size, glyph_index, load_flags ); - if (error) goto Exit; + if ( error ) + goto Exit; /* compute the advance */ - if (load_flags & FT_LOAD_VERTICAL_LAYOUT) + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) { slot->advance.x = 0; slot->advance.y = slot->metrics.vertAdvance; @@ -928,12 +958,13 @@ } /* now, transform the glyph image when needed */ - if (face->transform_flags) + if ( face->transform_flags ) { /* get renderer */ FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); - if (renderer) + + if ( renderer ) error = renderer->clazz->transform_glyph( renderer, slot, &face->transform_matrix, &face->transform_delta ); @@ -953,7 +984,7 @@ /* */ /* */ /* A function used to load a single glyph within a given glyph slot, */ - /* for a given size, according to its character code ! */ + /* for a given size, according to its character code. */ /* */ /* */ /* face :: A handle to a target face object where the glyph */ @@ -967,21 +998,22 @@ /* glyph loading process (e.g., whether the outline */ /* should be scaled, whether to load bitmaps or not, */ /* whether to hint the outline, etc). */ + /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ /* If the face has no current charmap, or if the character code */ /* is not defined in the charmap, this function will return an */ - /* error.. */ + /* error. */ /* */ /* If the glyph image is not a bitmap, and if the bit flag */ /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ /* transformed with the information passed to a previous call to */ - /* FT_Set_Transform. */ + /* FT_Set_Transform(). */ /* */ - /* Note that this also transforms the "face.glyph.advance" field, */ - /* but **NOT** the values in "face.glyph.metrics".. */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ /* */ FT_EXPORT_FUNC( FT_Error ) FT_Load_Char( FT_Face face, FT_ULong char_code, @@ -989,11 +1021,12 @@ { FT_UInt glyph_index; + if ( !face ) return FT_Err_Invalid_Face_Handle; glyph_index = (FT_UInt)char_code; - if (face->charmap) + if ( face->charmap ) glyph_index = FT_Get_Char_Index( face, char_code ); return glyph_index ? FT_Load_Glyph( face, glyph_index, load_flags ) @@ -1001,8 +1034,6 @@ } - - /* destructor for sizes list */ static void destroy_size( FT_Memory memory, @@ -1010,11 +1041,11 @@ FT_Driver driver ) { /* finalize client-specific data */ - if (size->generic.finalizer) + if ( size->generic.finalizer ) size->generic.finalizer( size ); /* finalize format-specific stuff */ - if (driver->clazz->done_size) + if ( driver->clazz->done_size ) driver->clazz->done_size( size ); FREE( size ); @@ -1029,6 +1060,7 @@ { FT_Driver_Class* clazz = driver->clazz; + /* Discard glyph slots for this face */ /* Beware! FT_Done_GlyphSlot() changes the field `face->slot' */ while ( face->glyph ) @@ -1046,11 +1078,11 @@ face->generic.finalizer( face ); /* finalize format-specific stuff */ - if (clazz->done_face) - clazz->done_face(face); + if ( clazz->done_face ) + clazz->done_face( face ); /* close the stream for this face if needed */ - if ( (face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM) == 0 ) + if ( ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) == 0 ) ft_done_stream( &face->stream ); /* get rid of it */ @@ -1066,14 +1098,11 @@ driver ); /* see if we need to drop the driver's glyph loader */ - if (FT_DRIVER_USES_OUTLINES(driver)) + if ( FT_DRIVER_USES_OUTLINES( driver ) ) FT_GlyphLoader_Done( driver->glyph_loader ); - - } - /*************************************************************************/ /* */ /* */ @@ -1095,6 +1124,7 @@ FT_Face face = 0; FT_Error error; + clazz = driver->clazz; memory = driver->root.memory; @@ -1173,6 +1203,7 @@ { FT_Open_Args args; + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ if ( !pathname ) return FT_Err_Invalid_Argument; @@ -1232,6 +1263,7 @@ { FT_Open_Args args; + /* test for valid `library' and `face' delayed to FT_Open_Face() */ if ( !file_base ) return FT_Err_Invalid_Argument; @@ -1315,14 +1347,15 @@ /* it. Otherwise, we'll scan the list of registered drivers. */ if ( args->flags & ft_open_driver && args->driver ) { - driver = FT_DRIVER(args->driver); + driver = FT_DRIVER( args->driver ); /* not all modules are drivers, so check... */ - if ( FT_MODULE_IS_DRIVER(driver) ) + if ( FT_MODULE_IS_DRIVER( driver ) ) { FT_Int num_params = 0; FT_Parameter* params = 0; + if ( args->flags & ft_open_params ) { num_params = args->num_params; @@ -1346,15 +1379,17 @@ FT_Module* cur = library->modules; FT_Module* limit = cur + library->num_modules; + for ( ; cur < limit; cur++ ) { /* not all modules are font drivers, so check... */ - if ( FT_MODULE_IS_DRIVER(cur[0]) ) + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) { FT_Int num_params = 0; FT_Parameter* params = 0; - driver = FT_DRIVER(cur[0]); + + driver = FT_DRIVER( cur[0] ); if ( args->flags & ft_open_params ) { @@ -1525,6 +1560,7 @@ FT_Driver_Class* clazz; + /* test for valid `parameters' delayed to ft_new_input_stream() */ if ( !face ) @@ -1543,11 +1579,11 @@ error = FT_Err_Unimplemented_Feature; clazz = driver->clazz; - if (clazz->attach_file) + if ( clazz->attach_file ) error = clazz->attach_file( face, stream ); /* close the attached stream */ - if ( !parameters->stream || (parameters->flags & ft_open_stream) ) + if ( !parameters->stream || ( parameters->flags & ft_open_stream ) ) ft_done_stream( &stream ); Exit: @@ -1572,10 +1608,11 @@ /* */ FT_EXPORT_FUNC( FT_Error ) FT_Done_Face( FT_Face face ) { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_ListNode node; + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + error = FT_Err_Invalid_Face_Handle; if ( face && face->driver ) @@ -1628,6 +1665,7 @@ FT_Size size = 0; FT_ListNode node = 0; + *asize = 0; if ( !face || !asize || !face->driver ) @@ -1644,7 +1682,7 @@ size->face = face; - if (clazz->init_size) + if ( clazz->init_size ) error = clazz->init_size( size ); /* in case of success, add to the face's list */ @@ -1725,6 +1763,24 @@ } + static void ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + metrics->ascender = ( FT_MulFix( face->ascender, + metrics->y_scale ) + 32 ) & -64; + + metrics->descender = ( FT_MulFix( face->descender, + metrics->y_scale ) + 32 ) & -64; + + metrics->height = ( FT_MulFix( face->height, + metrics->y_scale ) + 32 ) & -64; + + metrics->max_advance = ( FT_MulFix( face->max_advance_width, + metrics->x_scale ) + 32 ) & -64; + } + + /*************************************************************************/ /* */ /* */ @@ -1759,27 +1815,6 @@ /* When dealing with fixed-size faces (i.e., non-scalable formats), */ /* use the function FT_Set_Pixel_Sizes(). */ /* */ - - static void ft_recompute_scaled_metrics( FT_Face face, - FT_Size_Metrics* metrics ) - { - /* Compute root ascender, descender, test height, and max_advance */ - metrics->ascender = ( FT_MulFix( face->ascender, - metrics->y_scale ) + 32 ) & -64; - - metrics->descender = ( FT_MulFix( face->descender, - metrics->y_scale ) + 32 ) & -64; - - metrics->height = ( FT_MulFix( face->height, - metrics->y_scale ) + 32 ) & -64; - - metrics->max_advance = ( FT_MulFix( face->max_advance_width, - metrics->x_scale ) + 32 ) & -64; - } - - - - FT_EXPORT_FUNC( FT_Error ) FT_Set_Char_Size( FT_Face face, FT_F26Dot6 char_width, FT_F26Dot6 char_height, @@ -1838,7 +1873,7 @@ ft_recompute_scaled_metrics( face, metrics ); - if (clazz->set_char_sizes) + if ( clazz->set_char_sizes ) error = clazz->set_char_sizes( face->size, char_width, char_height, @@ -1913,7 +1948,7 @@ ft_recompute_scaled_metrics( face, metrics ); - if (clazz->set_pixel_sizes) + if ( clazz->set_pixel_sizes ) error = clazz->set_pixel_sizes( face->size, pixel_width, pixel_height ); @@ -1972,9 +2007,9 @@ if ( driver->clazz->get_kerning ) { error = driver->clazz->get_kerning( face, - left_glyph, - right_glyph, - kerning ); + left_glyph, + right_glyph, + kerning ); } else { @@ -2156,7 +2191,7 @@ driver = face->driver; func = (FT_Get_Sfnt_Table_Func)driver->root.clazz->get_interface( - FT_MODULE(driver), "get_sfnt" ); + FT_MODULE( driver ), "get_sfnt" ); if ( func ) table = func( face, tag ); @@ -2180,28 +2215,30 @@ /* lookup a renderer by glyph format in the library's list */ static FT_Renderer ft_lookup_renderer( FT_Library library, FT_Glyph_Format format, - FT_ListNode *node ) + FT_ListNode* node ) { FT_ListNode cur = library->renderers.head; FT_Renderer result = 0; + - if (node) + if ( node ) *node = 0; - while (cur) + while ( cur ) { - FT_Renderer renderer = FT_RENDERER(cur->data); + FT_Renderer renderer = FT_RENDERER( cur->data ); - if (renderer->glyph_format == format) + + if ( renderer->glyph_format == format ) { - if (node) + if ( node ) *node = cur; result = renderer; break; } - } + return result; } @@ -2209,10 +2246,11 @@ static FT_Renderer ft_lookup_glyph_renderer( FT_GlyphSlot slot ) { FT_Face face = slot->face; - FT_Library library = FT_FACE_LIBRARY(face); + FT_Library library = FT_FACE_LIBRARY( face ); FT_Renderer result = library->cur_renderer; + - if (!result || result->glyph_format != slot->format) + if ( !result || result->glyph_format != slot->format ) result = ft_lookup_renderer( library, slot->format, 0 ); return result; @@ -2235,13 +2273,14 @@ FT_Error error; FT_ListNode node; - if (ALLOC(node,sizeof(*node))) + if ( ALLOC( node, sizeof ( *node ) ) ) goto Exit; { - FT_Renderer render = FT_RENDERER(module); + FT_Renderer render = FT_RENDERER( module ); FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + render->clazz = clazz; render->glyph_format = clazz->glyph_format; @@ -2250,7 +2289,8 @@ clazz->raster_class->raster_new ) { error = clazz->raster_class->raster_new( memory, &render->raster ); - if (error) goto Fail; + if ( error ) + goto Fail; render->raster_render = clazz->raster_class->raster_render; render->render = clazz->render_glyph; @@ -2264,8 +2304,8 @@ } Fail: - if (error) - FREE(node); + if ( error ) + FREE( node ); Exit: return error; @@ -2278,13 +2318,15 @@ FT_Memory memory = library->memory; FT_ListNode node; + node = FT_List_Find( &library->renderers, module ); - if (node) + if ( node ) { - FT_Renderer render = FT_RENDERER(module); + FT_Renderer render = FT_RENDERER( module ); + /* release raster object, if any */ - if (render->raster) + if ( render->raster ) render->clazz->raster_class->raster_done( render->raster ); /* remove from list */ @@ -2296,74 +2338,73 @@ } - - /************************************************************************* - * - * - * FT_Get_Renderer - * - * - * retrieves the current renderer for a given glyph format. - * - * - * library :: handle to library object - * format :: glyph format - * - * - * renderer handle. 0 if none found. - * - * - * An error will be returned if a module already exists by that - * name, or if the module requires a version of freetype that is - * too great - * - * To add a new renderer, simply use FT_Add_Module. To retrieve - * a renderer by its name, use FT_Get_Module - * - *************************************************************************/ - - FT_EXPORT_FUNC(FT_Renderer) FT_Get_Renderer( FT_Library library, - FT_Glyph_Format format ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Renderer */ + /* */ + /* */ + /* Retrieves the current renderer for a given glyph format. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* */ + /* A renderer handle. 0 if none found. */ + /* */ + /* */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use FT_Add_Module(). To retrieve a */ + /* renderer by its name, use FT_Get_Module(). */ + /* + FT_EXPORT_FUNC( FT_Renderer ) FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) { return ft_lookup_renderer( library, format, 0 ); } - /************************************************************************* - * - * - * FT_Set_Renderer - * - * - * Sets the current renderer to use, and set additional mode - * - * - * library :: handle to library object - * renderer :: handle to renderer object - * num_params :: number of additional parameters - * params :: additional parameters - * - * - * Error code. 0 means success. - * - * - * in case of success, the renderer will be used to convert glyph - * images in the renderer's known format into bitmaps. - * - * This doesn't change the current renderer for other formats.. - * - *************************************************************************/ - - FT_EXPORT_DEF(FT_Error) FT_Set_Renderer( FT_Library library, - FT_Renderer renderer, - FT_UInt num_params, - FT_Parameter* parameters ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Renderer */ + /* */ + /* */ + /* Sets the current renderer to use, and set additional mode. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Additional parameters. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT_DEF( FT_Error ) FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) { FT_ListNode node; FT_Error error = FT_Err_Ok; + node = FT_List_Find( &library->renderers, renderer ); - if (!node) + if ( !node ) { error = FT_Err_Invalid_Argument; goto Exit; @@ -2371,17 +2412,18 @@ FT_List_Up( &library->renderers, node ); - if (renderer->glyph_format == ft_glyph_format_outline ) + if ( renderer->glyph_format == ft_glyph_format_outline ) library->cur_renderer = renderer; - if (num_params > 0) + if ( num_params > 0 ) { FTRenderer_setMode set_mode = renderer->clazz->set_mode; + for ( ; num_params > 0; num_params-- ) { error = set_mode( renderer, parameters->tag, parameters->data ); - if (error) + if ( error ) break; } } @@ -2391,68 +2433,67 @@ } - - /************************************************************************* - * - * - * FT_Render_Glyph - * - * - * Converts a given glyph image to a bitmap. It does so by inspecting - * the glyph image format, find the relevant renderer, and invoke it - * - * - * slot :: handle to the glyph slot containing the image to - * convert - * - * render_mode :: a set of bit flags indicating which kind of bitmap - * to render. For now, only 'ft_render_mode_anti_alias' - * is supported by the available renderers, but others - * could appear later (e.g. LCD or TV optimised) - * - * - * Error code. 0 means success. - * - * - * in case of success, the renderer will be used to convert glyph - * images in the renderer's known format into bitmaps. - * - * This doesn't change the current renderer for other formats.. - * - * The slot's native image should be considered lost after the - * conversion.. - * - *************************************************************************/ - - FT_EXPORT_FUNC(FT_Error) FT_Render_Glyph( FT_GlyphSlot slot, - FT_UInt render_mode ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Render_Glyph */ + /* */ + /* */ + /* Converts a given glyph image to a bitmap. It does so by */ + /* inspecting the glyph image format, find the relevant renderer, and */ + /* invoke it. */ + /* */ + /* */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* render_mode :: A set of bit flags indicating which kind of bitmap */ + /* to render. For now, only */ + /* `ft_render_mode_anti_alias' is supported by the */ + /* available renderers, but others could appear later */ + /* (e.g. optimized for TV or LCD). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + /* The slot's native image should be considered lost after the */ + /* conversion. */ + /* */ + FT_EXPORT_FUNC( FT_Error ) FT_Render_Glyph( FT_GlyphSlot slot, + FT_UInt render_mode ) { FT_Error error = FT_Err_Ok; FT_Renderer renderer; + - if (slot) + if ( slot ) { FT_Face face = slot->face; - FT_Library library = FT_FACE_LIBRARY(face); + FT_Library library = FT_FACE_LIBRARY( face ); - /* if it's already a bitmap, no need to do anything */ - switch (slot->format) + + /* if it is already a bitmap, no need to do anything */ + switch ( slot->format ) { - case ft_glyph_format_bitmap: /* already a bitmap, don't do anything */ - break; + case ft_glyph_format_bitmap: /* already a bitmap, don't do anything */ + break; - default: - { - /* small shortcut for the very common case */ - if (slot->format == ft_glyph_format_outline) - renderer = library->cur_renderer; - else - renderer = ft_lookup_renderer( library, slot->format, 0 ); + default: + /* small shortcut for the very common case */ + if ( slot->format == ft_glyph_format_outline ) + renderer = library->cur_renderer; + else + renderer = ft_lookup_renderer( library, slot->format, 0 ); - error = FT_Err_Unimplemented_Feature; - if (renderer) - error = renderer->render( renderer, slot, render_mode ); - } + error = FT_Err_Unimplemented_Feature; + if ( renderer ) + error = renderer->render( renderer, slot, render_mode ); } } else @@ -2460,6 +2501,7 @@ return error; } + /*************************************************************************/ /*************************************************************************/ @@ -2473,6 +2515,7 @@ /*************************************************************************/ /*************************************************************************/ + /*************************************************************************/ /* */ /* */ @@ -2480,7 +2523,7 @@ /* */ /* */ /* Destroys a given module object. For drivers, this also destroys */ - /* all child faces.. */ + /* all child faces. */ /* */ /* */ /* module :: A handle to the target driver object. */ @@ -2494,59 +2537,60 @@ FT_Memory memory = module->memory; FT_Module_Class* clazz = module->clazz; + /* finalize client-data - before anything else */ if ( module->generic.finalizer ) module->generic.finalizer( module ); /* if the module is a renderer */ - if (FT_MODULE_IS_RENDERER(module)) - ft_remove_renderer(module); + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); /* if the module is a font driver, add some steps */ - if (FT_MODULE_IS_DRIVER(module)) - Destroy_Driver( FT_DRIVER(module) ); + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); /* finalize the module object */ - if (clazz->module_done) - clazz->module_done(module); + if ( clazz->module_done ) + clazz->module_done( module ); /* discard it */ FREE( module ); } - /************************************************************************* - * - * - * FT_Add_Module - * - * - * Add a new module to a given library instance. - * - * - * library :: handle to library object - * clazz :: pointer to class descriptor for the module - * - * - * Error code. 0 means success - * - * - * An error will be returned if a module already exists by that - * name, or if the module requires a version of freetype that is - * too great - * - *************************************************************************/ - FT_EXPORT_FUNC(FT_Error) FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Add_Module */ + /* */ + /* */ + /* Adds a new module to a given library instance. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT_FUNC( FT_Error ) FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) { FT_Error error; FT_Memory memory; FT_Module module; FT_UInt nn; - #define FREETYPE_VER_FIXED (((FT_Long)FREETYPE_MAJOR << 16) | FREETYPE_MINOR) - if (!library || !clazz) +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | + FREETYPE_MINOR ) + + if ( !library || !clazz ) return FT_Err_Invalid_Argument; /* check freetype version */ @@ -2580,7 +2624,7 @@ } /* allocate module object */ - if (ALLOC(module,clazz->module_size)) + if ( ALLOC( module,clazz->module_size ) ) goto Exit; /* base initialisation */ @@ -2589,88 +2633,96 @@ module->clazz = (FT_Module_Class*)clazz; /* if the module is a renderer - this must be performed before */ - /* the normal module initialisation.. */ - if (FT_MODULE_IS_RENDERER(module)) + /* the normal module initialization. */ + if ( FT_MODULE_IS_RENDERER( module ) ) { /* add to the renderers list */ - error = ft_add_renderer(module); - if (error) goto Fail; + error = ft_add_renderer( module ); + if ( error ) + goto Fail; } /* if the module is a font driver */ - if (FT_MODULE_IS_DRIVER(module)) + if ( FT_MODULE_IS_DRIVER( module ) ) { /* allocate glyph loader if needed */ - FT_Driver driver = FT_DRIVER(module); + FT_Driver driver = FT_DRIVER( module ); + driver->clazz = (FT_Driver_Class*)module->clazz; - if (FT_DRIVER_USES_OUTLINES(driver)) + if ( FT_DRIVER_USES_OUTLINES( driver ) ) { error = FT_GlyphLoader_New( memory, &driver->glyph_loader ); - if (error) goto Fail; + if ( error ) + goto Fail; } } - if (clazz->module_init) + if ( clazz->module_init ) { - error = clazz->module_init(module); - if (error) goto Fail; + error = clazz->module_init( module ); + if ( error ) + goto Fail; } /* add module to the library's table */ - library->modules[ library->num_modules++ ] = module; + library->modules[library->num_modules++] = module; - Exit: return error; Fail: - if (FT_MODULE_IS_DRIVER(module)) + if ( FT_MODULE_IS_DRIVER( module ) ) { - FT_Driver driver = FT_DRIVER(module); + FT_Driver driver = FT_DRIVER( module ); - if (FT_DRIVER_USES_OUTLINES(driver)) + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) FT_GlyphLoader_Done( driver->glyph_loader ); } - if (FT_MODULE_IS_RENDERER(module)) + if ( FT_MODULE_IS_RENDERER( module ) ) { - FT_Renderer renderer = FT_RENDERER(module); - if (renderer->raster) + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->raster ) renderer->clazz->raster_class->raster_done( renderer->raster ); } - FREE(module); + + FREE( module ); goto Exit; } - /************************************************************************* - * - * - * FT_Get_Module - * - * - * Find a module by its name. - * - * - * library :: handle to library object - * module_name :: the module's ASCII name. - * - * - * Module handle, 0 if none was found. - * - * - * You'd better be familiar with FreeType internals to know which - * module to look for :-) - * - *************************************************************************/ - FT_EXPORT_FUNC(FT_Module) FT_Get_Module( FT_Library library, - const char* module_name ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Module */ + /* */ + /* */ + /* Finds a module by its name. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* */ + /* A module handle. 0 if none was found. */ + /* */ + /* */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for :-) */ + /* */ + FT_EXPORT_FUNC( FT_Module ) FT_Get_Module( FT_Library library, + const char* module_name ) { FT_Module result = 0; FT_Module* cur = library->modules; FT_Module* limit = cur + library->num_modules; + for ( ; cur < limit; cur++ ) if ( strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) { @@ -2681,66 +2733,70 @@ return result; } - /************************************************************************* - * - * - * FT_Get_Module_Interface - * - * - * Find a module and returns it's specific interface as a void* - * - * - * library :: handle to library object - * module_name :: the module's ASCII name. - * - * - * Module specific interface, if any - * - * - * You'd better be familiar with FreeType internals to know which - * module to look for, and what it's interface is :-) - * - *************************************************************************/ - - FT_EXPORT_FUNC(const void*) FT_Get_Module_Interface( FT_Library library, - const char* mod_name ) + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Module_Interface */ + /* */ + /* */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for, and what its interface is :-) */ + /* */ + FT_EXPORT_FUNC(const void*) FT_Get_Module_Interface( + FT_Library library, + const char* mod_name ) { FT_Module module; + module = FT_Get_Module( library, mod_name ); + return module ? module->clazz->module_interface : 0; } - /************************************************************************* - * - * - * FT_Remove_Module - * - * - * Removes a given module from a library instance. - * - * - * library :: handle to library object - * module :: handle to module object - * - * - * Error code (module not listed) - * - * - * The module object is destroyed by the function in case of success - * - *************************************************************************/ - - FT_EXPORT_FUNC(FT_Error) FT_Remove_Module( FT_Library library, - FT_Module module ) + /*************************************************************************/ + /* */ + /* */ + /* FT_Remove_Module */ + /* */ + /* */ + /* Removes a given module from a library instance. */ + /* */ + /* */ + /* library :: A handle to a library object. */ + /* */ + /* module :: A handle to a module object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The module object is destroyed by the function in case of success. */ + /* + FT_EXPORT_FUNC( FT_Error ) FT_Remove_Module( FT_Library library, + FT_Module module ) { /* try to find the module from the table, then remove it from there */ - if (library && module) + if ( library && module ) { FT_Module* cur = library->modules; FT_Module* limit = cur + library->num_modules; + for ( ; cur < limit; cur++ ) { if (cur[0] == module) @@ -2748,7 +2804,7 @@ /* remove it from the table */ library->num_modules--; limit--; - while (cur < limit) + while ( cur < limit ) { cur[0] = cur[1]; cur++; @@ -2756,7 +2812,7 @@ limit[0] = 0; /* destroy the module */ - Destroy_Module(module); + Destroy_Module( module ); return FT_Err_Ok; } @@ -2766,13 +2822,6 @@ } - - - - - - - /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -2785,6 +2834,7 @@ /*************************************************************************/ /*************************************************************************/ + /*************************************************************************/ /* */ /* */ @@ -2871,6 +2921,7 @@ { FT_Module module = library->modules[n]; + if ( module ) { Destroy_Module( module ); @@ -2893,8 +2944,8 @@ /* FT_Set_Debug_Hook */ /* */ /* */ - /* Sets a debug hook function for debugging the interpreter of a */ - /* font format. */ + /* Sets a debug hook function for debugging the interpreter of a font */ + /* format. */ /* */ /* */ /* library :: A handle to the library object. */ @@ -2920,9 +2971,6 @@ } - - - /*************************************************************************/ /* */ /* */ diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c index 8c6afc06e..beb378931 100644 --- a/src/base/ftoutln.c +++ b/src/base/ftoutln.c @@ -573,16 +573,17 @@ /* */ /* */ /* Renders an outline within a bitmap using the current scan-convert. */ - /* This functions uses a FT_Raster_Params as argument, allowing */ - /* advanced features like direct composition/translucency, etc. */ + /* This functions uses an FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ /* */ /* */ /* library :: A handle to a FreeType library object. */ /* */ /* outline :: A pointer to the source outline descriptor. */ /* */ - /* params :: A pointer to a FT_Raster_Params used to describe */ - /* the rendering operation. */ + /* params :: A pointer to a FT_Raster_Params structure used to */ + /* describe the rendering operation. */ /* */ /* */ /* FreeType error code. 0 means success. */ @@ -592,7 +593,7 @@ /* scan-line converter will be serialized. */ /* */ /* */ - /* You should know what you're doing and the role of FT_Raster_Params */ + /* You should know what you are doing and how FT_Raster_Params works */ /* to use this function. */ /* */ /* The field `params.source' will be set to `outline' before the scan */ @@ -606,6 +607,7 @@ FT_Error error; FT_Renderer renderer; + if ( !library ) { error = FT_Err_Invalid_Library_Handle; @@ -620,7 +622,7 @@ /* retrieve the current outline renderer */ renderer = library->cur_renderer; - if (!renderer) + if ( !renderer ) { /* XXXX: should use another error code */ error = FT_Err_Invalid_Argument; @@ -671,7 +673,8 @@ { FT_Raster_Params params; - if (!bitmap) + + if ( !bitmap ) return FT_Err_Invalid_Argument; /* other checks are delayed to FT_Outline_Render */ @@ -686,8 +689,6 @@ } - - /*************************************************************************/ /* */ /* */ @@ -713,6 +714,7 @@ { FT_Pos xz, yz; + xz = FT_MulFix( vector->x, matrix->xx ) + FT_MulFix( vector->y, matrix->xy ); @@ -724,8 +726,6 @@ } - - /*************************************************************************/ /* */ /* */ @@ -753,6 +753,7 @@ FT_Vector* vec = outline->points; FT_Vector* limit = vec + outline->n_points; + for ( ; vec < limit; vec++ ) FT_Vector_Transform( vec, matrix ); } diff --git a/src/cff/t2driver.c b/src/cff/t2driver.c index 2a599751f..cf3149a48 100644 --- a/src/cff/t2driver.c +++ b/src/cff/t2driver.c @@ -78,7 +78,7 @@ /* formats. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only horizontal layouts (left-to-right & right-to-left) are */ @@ -169,7 +169,7 @@ /* whether to hint the outline, etc). */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Load_Glyph( T2_GlyphSlot slot, @@ -282,8 +282,10 @@ { FT_Module sfnt; - /* we simply pass our request to the "sfnt" module */ + + /* we simply pass our request to the `sfnt' module */ sfnt = FT_Get_Module( driver->root.root.library, "sfnt" ); + return sfnt ? sfnt->clazz->get_interface( sfnt, interface ) : 0; } @@ -297,14 +299,14 @@ ft_module_font_driver | ft_module_driver_scalable, sizeof( T2_DriverRec ), "cff", - 0x10000, - 0x20000, + 0x10000L, + 0x20000L, 0, /* module-specific interface */ - (FT_Module_Constructor) T2_Init_Driver, - (FT_Module_Destructor) T2_Done_Driver, - (FT_Module_Requester) t2_get_interface, + (FT_Module_Constructor)T2_Init_Driver, + (FT_Module_Destructor) T2_Done_Driver, + (FT_Module_Requester) t2_get_interface, }, /* now the specific driver fields */ @@ -312,22 +314,22 @@ sizeof( FT_SizeRec ), sizeof( T2_GlyphSlotRec ), - (FTDriver_initFace) T2_Init_Face, - (FTDriver_doneFace) T2_Done_Face, - (FTDriver_initSize) 0, - (FTDriver_doneSize) 0, - (FTDriver_initGlyphSlot) 0, - (FTDriver_doneGlyphSlot) 0, + (FTDriver_initFace) T2_Init_Face, + (FTDriver_doneFace) T2_Done_Face, + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, - (FTDriver_setCharSizes) 0, - (FTDriver_setPixelSizes) 0, + (FTDriver_setCharSizes) 0, + (FTDriver_setPixelSizes)0, - (FTDriver_loadGlyph) Load_Glyph, - (FTDriver_getCharIndex) Get_Char_Index, + (FTDriver_loadGlyph) Load_Glyph, + (FTDriver_getCharIndex) Get_Char_Index, - (FTDriver_getKerning) Get_Kerning, - (FTDriver_attachFile) 0, - (FTDriver_getAdvances) 0 + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) 0, + (FTDriver_getAdvances) 0 }; diff --git a/src/cff/t2gload.c b/src/cff/t2gload.c index b877eae28..050332605 100644 --- a/src/cff/t2gload.c +++ b/src/cff/t2gload.c @@ -232,6 +232,7 @@ if ( glyph ) { FT_GlyphLoader* loader = glyph->root.loader; + builder->loader = loader; builder->base = &loader->base.outline; @@ -273,6 +274,7 @@ { T2_GlyphSlot glyph = builder->glyph; + if ( glyph ) glyph->root.outline = *builder->base; } @@ -360,8 +362,7 @@ FT_Error check_points( T2_Builder* builder, FT_Int count ) { - return FT_GlyphLoader_Check_Points( builder->loader, - count, 0 ); + return FT_GlyphLoader_Check_Points( builder->loader, count, 0 ); } @@ -374,11 +375,13 @@ { FT_Outline* outline = builder->current; + if ( builder->load_points ) { FT_Vector* point = outline->points + outline->n_points; FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + point->x = x >> 16; point->y = y >> 16; *control = flag ? FT_Curve_Tag_On : FT_Curve_Tag_Cubic; @@ -397,6 +400,7 @@ { FT_Error error; + error = check_points( builder, 1 ); if ( !error ) add_point( builder, x, y, 1 ); @@ -412,6 +416,7 @@ FT_Outline* outline = builder->current; FT_Error error; + if ( !builder->load_points ) { outline->n_contours++; @@ -419,13 +424,14 @@ } error = FT_GlyphLoader_Check_Points( builder->loader, 0, 1 ); - if (!error) + if ( !error ) { if ( outline->n_contours > 0 ) outline->contours[outline->n_contours - 1] = outline->n_points - 1; outline->n_contours++; } + return error; } @@ -441,6 +447,7 @@ { FT_Error error; + builder->path_begun = 1; error = add_contour( builder ); if ( error ) @@ -457,6 +464,7 @@ { FT_Outline* outline = builder->current; + if ( outline->n_contours > 0 ) outline->contours[outline->n_contours - 1] = outline->n_points - 1; } @@ -484,7 +492,7 @@ /* charstring_len :: The length in bytes of the charstring stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error T2_Parse_CharStrings( T2_Decoder* decoder, diff --git a/src/cff/t2objs.c b/src/cff/t2objs.c index 14a880da3..36b9c13ee 100644 --- a/src/cff/t2objs.c +++ b/src/cff/t2objs.c @@ -68,7 +68,7 @@ /* face :: The newly built face object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_DEF FT_Error T2_Init_Face( FT_Stream stream, @@ -80,9 +80,10 @@ FT_Error error; SFNT_Interface* sfnt; - sfnt = (SFNT_Interface*) - FT_Get_Module_Interface( face->root.driver->root.library,"sfnt" ); - if ( !sfnt ) goto Bad_Format; + sfnt = (SFNT_Interface*)FT_Get_Module_Interface( + face->root.driver->root.library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; /* create input stream from resource */ if ( FILE_Seek( 0 ) ) @@ -188,7 +189,7 @@ /* driver :: A handle to the target driver object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error T2_Init_Driver( T2_Driver driver ) diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c index 68c1de627..d0048df78 100644 --- a/src/cid/cidgload.c +++ b/src/cid/cidgload.c @@ -158,12 +158,13 @@ if ( glyph ) { FT_GlyphLoader* loader = glyph->root.loader; + builder->loader = loader; builder->base = &loader->base.outline; builder->current = &loader->current.outline; - FT_GlyphLoader_Rewind(loader); + FT_GlyphLoader_Rewind( loader ); } if ( size ) @@ -245,6 +246,7 @@ { FT_Outline* outline = builder->current; + if ( builder->load_points ) { FT_Vector* point = outline->points + outline->n_points; @@ -285,6 +287,7 @@ FT_Outline* outline = builder->current; FT_Error error; + if ( !builder->load_points ) { outline->n_contours++; @@ -292,7 +295,7 @@ } error = FT_GlyphLoader_Check_Points( builder->loader, 0, 1 ); - if (!error) + if ( !error ) { if ( outline->n_contours > 0 ) outline->contours[outline->n_contours - 1] = outline->n_points - 1; @@ -314,6 +317,7 @@ { FT_Error error; + builder->path_begun = 1; error = add_contour( builder ); if ( error ) @@ -330,6 +334,7 @@ { FT_Outline* outline = builder->current; + if ( outline->n_contours > 0 ) outline->contours[outline->n_contours - 1] = outline->n_points - 1; } @@ -410,7 +415,7 @@ /* achar :: The accent character's StandardEncoding charcode. */ /* */ /* */ - /* Type 1 error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error t1operator_seac( CID_Decoder* decoder, @@ -426,6 +431,7 @@ FT_Outline* base = decoder->builder.base; FT_Vector left_bearing, advance; + bchar_index = bchar; achar_index = achar; @@ -435,19 +441,19 @@ return T1_Err_Syntax_Error; } - /* if we are trying to load a composite glyph, do not load the */ /* accent character and return the array of subglyphs. */ if ( decoder->builder.no_recurse ) { - FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; FT_GlyphLoader* loader = glyph->loader; FT_SubGlyph* subg; + /* reallocate subglyph array if necessary */ error = FT_GlyphLoader_Check_Subglyphs( loader, 2 ); - if (error) goto Exit; + if ( error ) + goto Exit; subg = loader->current.subglyphs; @@ -474,11 +480,12 @@ /* First load `bchar' in builder */ /* now load the unscaled outline */ - if (decoder->builder.loader) - FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + if ( decoder->builder.loader ) + FT_GlyphLoader_Prepare( decoder->builder.loader ); error = cid_load_glyph( decoder, bchar_index ); /* load one glyph */ - if ( error ) goto Exit; + if ( error ) + goto Exit; n_base_points = cur->n_points; @@ -508,6 +515,7 @@ if ( decoder->builder.load_points ) { FT_Outline dummy; + dummy.n_points = base->n_points - n_base_points; dummy.points = base->points + n_base_points; @@ -541,7 +549,7 @@ /* charstring_len :: The length in bytes of the charstring stream. */ /* */ /* */ - /* Type1 error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error CID_Parse_CharStrings( CID_Decoder* decoder, diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c index 37f752c6c..d7edb8597 100644 --- a/src/cid/cidobjs.c +++ b/src/cid/cidobjs.c @@ -110,7 +110,7 @@ /* face :: The newly built face object. */ /* */ /* */ - /* Type1 error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error CID_Init_Face( FT_Stream stream, @@ -133,8 +133,8 @@ psnames = (PSNames_Interface*)face->psnames; if ( !psnames ) { - psnames = (PSNames_Interface*) - FT_Get_Module_Interface( FT_FACE_LIBRARY(face), "psnames" ); + psnames = (PSNames_Interface*)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psnames" ); face->psnames = psnames; } @@ -337,14 +337,14 @@ /* driver :: A handle to the target driver object. */ /* */ /* */ - /* Type1 error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error CID_Init_Driver( T1_Driver driver ) { UNUSED( driver ); - return FT_Err_Ok; + return T1_Err_Ok; } diff --git a/src/cid/cidparse.c b/src/cid/cidparse.c index 31acb29e6..93085e78b 100644 --- a/src/cid/cidparse.c +++ b/src/cid/cidparse.c @@ -67,7 +67,7 @@ /* reallocations. */ /* */ /* */ - /* Type1 error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error T1_New_Table( T1_Table* table, @@ -157,7 +157,7 @@ /* length :: The length in bytes of the source object. */ /* */ /* */ - /* Type1 error code. 0 means success. An error is returned if */ + /* FreeType error code. 0 means success. An error is returned if */ /* reallocation fails. */ /* */ LOCAL_FUNC diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c index 292bc37d2..a045db190 100644 --- a/src/cid/cidriver.c +++ b/src/cid/cidriver.c @@ -38,8 +38,8 @@ static - FT_Module_Interface CID_Get_Interface( FT_Driver driver, - const FT_String* interface ) + FT_Module_Interface CID_Get_Interface( FT_Driver driver, + const FT_String* interface ) { UNUSED( driver ); UNUSED( interface ); @@ -48,7 +48,7 @@ } -#ifdef xxxT1_CONFIG_OPTION_NO_AFM +#ifndef T1_CONFIG_OPTION_NO_AFM static @@ -71,20 +71,20 @@ } -#endif /* xxxT1_CONFIG_OPTION_NO_AFM */ - +#endif /* !T1_CONFIG_OPTION_NO_AFM */ /*************************************************************************/ /* */ /* */ - /* cid_get_char_index */ + /* Cid_Get_Char_Index */ /* */ /* */ /* Uses a charmap to return a given character code's glyph index. */ /* */ /* */ /* charmap :: A handle to the source charmap object. */ + /* */ /* charcode :: The character code. */ /* */ /* */ @@ -98,6 +98,7 @@ FT_UInt result = 0; PSNames_Interface* psnames; + face = (T1_Face)charmap->face; psnames = (PSNames_Interface*)face->psnames; if ( psnames ) @@ -173,7 +174,6 @@ } - const FT_Driver_Class t1cid_driver_class = { /* firs of all, the FT_Module_Class fields */ @@ -181,14 +181,14 @@ ft_module_font_driver | ft_module_driver_scalable, sizeof( FT_DriverRec ), "t1cid", /* module name */ - 0x10000, /* version 1.0 of driver */ - 0x20000, /* requires FreeType 2.0 */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ 0, - (FT_Module_Constructor) CID_Init_Driver, - (FT_Module_Destructor) CID_Done_Driver, - (FT_Module_Requester) CID_Get_Interface + (FT_Module_Constructor)CID_Init_Driver, + (FT_Module_Destructor) CID_Done_Driver, + (FT_Module_Requester) CID_Get_Interface }, /* then the other font drivers fields */ @@ -196,32 +196,30 @@ sizeof( T1_SizeRec ), sizeof( T1_GlyphSlotRec ), - (FTDriver_initFace) CID_Init_Face, - (FTDriver_doneFace) CID_Done_Face, + (FTDriver_initFace) CID_Init_Face, + (FTDriver_doneFace) CID_Done_Face, - (FTDriver_initSize) 0, - (FTDriver_doneSize) 0, - (FTDriver_initGlyphSlot) 0, - (FTDriver_doneGlyphSlot) 0, + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, - (FTDriver_setCharSizes) 0, - (FTDriver_setPixelSizes) 0, + (FTDriver_setCharSizes) 0, + (FTDriver_setPixelSizes)0, - (FTDriver_loadGlyph) CID_Load_Glyph, - (FTDriver_getCharIndex) CID_Get_Char_Index, + (FTDriver_loadGlyph) CID_Load_Glyph, + (FTDriver_getCharIndex) CID_Get_Char_Index, -#ifndef xxxxT1_CONFIG_OPTION_NO_AFM - (FTDriver_getKerning) 0, - (FTDriver_attachFile) 0, +#ifdef T1_CONFIG_OPTION_NO_AFM + (FTDriver_getKerning) 0, + (FTDriver_attachFile) 0, #else - (FTDriver_getKerning) cid_Get_Kerning, - (FTDriver_attachFile) CID_Read_AFM, + (FTDriver_getKerning) cid_Get_Kerning, + (FTDriver_attachFile) CID_Read_AFM, #endif (FTDriver_getAdvances) 0 }; - - /* END */ diff --git a/src/psnames/psdriver.h b/src/psnames/psdriver.h index 5fa89d5b5..ab8884591 100644 --- a/src/psnames/psdriver.h +++ b/src/psnames/psdriver.h @@ -1,10 +1,10 @@ /***************************************************************************/ /* */ -/* psmodule.h */ +/* psdriver.h */ /* */ -/* High-level PSNames module interface (specification). */ +/* High-level PSNames driver interface (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,9 +21,9 @@ #include - FT_EXPORT_VAR(const FT_Module_Class) psnames_module_class; + FT_EXPORT_VAR( const FT_Module_Class ) psnames_module_class; -#endif /* PSMODULE_H */ +#endif /* PSDRIVER_H */ /* END */ diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c index e00f9ac9e..ebbae1afc 100644 --- a/src/psnames/psmodule.c +++ b/src/psnames/psmodule.c @@ -1,44 +1,72 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include #include #include + #include +#include /* for strcmp(), strncpy() */ + #ifndef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES -/* see the python script "freetype2/docs/glnames.py" which is used */ -/* to generate the following tables... */ + + /* see the python script `freetype2/docs/glnames.py' which is used */ + /* to generate the following tables... */ #include + #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - /* return the Unicode value corresponding to a given glyph. Note that */ - /* we do deal with glyph variants by detecting a non-initial dot */ - /* in the name, as in "A.swash" or "e.final", etc.. */ - /* */ + + + /* return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final', etc. */ + /* */ static - FT_ULong PS_Unicode_Value( const char* glyph_name ) + FT_ULong PS_Unicode_Value( const char* glyph_name ) { FT_Int n; char first = glyph_name[0]; char temp[64]; - /* if the name begins with "uni", then the glyph name may be a */ - /* hard-coded unicode character code.. */ + + /* if the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ if ( glyph_name[0] == 'u' && glyph_name[1] == 'n' && glyph_name[2] == 'i' ) { /* determine wether the following characters are hexadecimal */ - FT_Int count; - FT_ULong value = 0; - const char* p = glyph_name + 4; + FT_Int count; + FT_ULong value = 0; + const char* p = glyph_name + 4; - for ( count = 4;count > 0; count--, p++ ) + + for ( count = 4; count > 0; count--, p++ ) { char c = *p; unsigned char d; - d = (unsigned char)c-'0'; - if (d >= 10) + + d = (unsigned char)c - '0'; + if ( d >= 10 ) { d = (unsigned char)c - 'A'; if ( d >= 6 ) @@ -46,25 +74,27 @@ else d += 10; } - /* exit if one non-uppercase-hexadecimal character was found */ - if (d >= 16) + /* exit if a non-uppercase-hexadecimal character was found */ + if ( d >= 16 ) break; - value = (value << 4) + d; - if (count == 0) + value = ( value << 4 ) + d; + if ( count == 0 ) return value; } } /* look for a non-initial dot in the glyph name in order to */ - /* sort-out variants like "A.swash", "e.final", etc.. */ + /* sort-out variants like `A.swash', `e.final', etc. */ { const char* p; int len; + p = glyph_name; - while ( *p && *p != '.' ) p++; - len = p-glyph_name; + while ( *p && *p != '.' ) + p++; + len = p - glyph_name; if ( *p && len < 64 ) { @@ -79,35 +109,40 @@ { const char* name = t1_standard_glyphs[n]; + if ( first == name[0] && strcmp( glyph_name, name ) == 0 ) return names_to_unicode[n]; } + /* not found, there is probably no Unicode value for this glyph name */ return 0; } - /* qsort callback to sort the unicode map */ + /* qsort callback to sort the unicode map */ static - int compare_uni_maps( const void* a, const void* b ) + int compare_uni_maps( const void* a, + const void* b ) { PS_UniMap* map1 = (PS_UniMap*)a; PS_UniMap* map2 = (PS_UniMap*)b; + return ( map1->unicode < map2->unicode ? -1 : map1->unicode > map2->unicode ? 1 : 0 ); } - /* Builds a table that maps Unicode values to glyph indices */ + /* Builds a table that maps Unicode values to glyph indices */ static FT_Error PS_Build_Unicode_Table( FT_Memory memory, FT_UInt num_glyphs, const char** glyph_names, - PS_Unicodes *table ) + PS_Unicodes* table ) { FT_Error error; + /* we first allocate the table */ table->num_maps = 0; table->maps = 0; @@ -119,14 +154,17 @@ PS_UniMap* map; FT_ULong uni_char; + map = table->maps; for ( n = 0; n < num_glyphs; n++ ) { const char* gname = glyph_names[n]; - if (gname) + + + if ( gname ) { - uni_char = PS_Unicode_Value(gname); - if (uni_char && uni_char != 0xFFFF) + uni_char = PS_Unicode_Value( gname ); + if ( uni_char && uni_char != 0xFFFF ) { map->unicode = uni_char; map->glyph_index = n; @@ -138,102 +176,108 @@ /* now, compress the table a bit */ count = map - table->maps; if ( count > 0 && REALLOC( table->maps, - num_glyphs*sizeof(PS_UniMap), - count*sizeof(PS_UniMap) ) ) - { + num_glyphs * sizeof ( PS_UniMap ), + count * sizeof ( PS_UniMap ) ) ) count = 0; - } - if (count == 0) + if ( count == 0 ) { FREE( table->maps ); - if (!error) - error = FT_Err_Invalid_Argument; /* no unicode chars here !! */ + if ( !error ) + error = FT_Err_Invalid_Argument; /* no unicode chars here! */ } else /* sort the table in increasing order of unicode values */ - qsort( table->maps, count, sizeof(PS_UniMap), compare_uni_maps ); + qsort( table->maps, count, sizeof ( PS_UniMap ), compare_uni_maps ); table->num_maps = count; } + return error; } + static FT_UInt PS_Lookup_Unicode( PS_Unicodes* table, FT_ULong unicode ) { PS_UniMap *min, *max, *mid; + + /* perform a binary search on the table */ min = table->maps; max = min + table->num_maps - 1; - while (min <= max) + while ( min <= max ) { - mid = min + (max-min)/2; + mid = min + ( max - min ) / 2; if ( mid->unicode == unicode ) return mid->glyph_index; - if (min == max) + if ( min == max ) break; - if ( mid->unicode < unicode ) min = mid+1; - else max = mid-1; + if ( mid->unicode < unicode ) + min = mid + 1; + else + max = mid - 1; } return 0xFFFF; } -#endif +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ static const char* PS_Macintosh_Name( FT_UInt name_index ) { - if (name_index >= 258) + if ( name_index >= 258 ) name_index = 0; - return standard_glyph_names[ mac_standard_names[name_index] ]; + return standard_glyph_names[mac_standard_names[name_index]]; } - static const char* PS_Standard_Strings( FT_UInt sid ) { - return (sid < NUM_STD_GLYPHS ? t1_standard_glyphs[sid] : 0); + return ( sid < NUM_STD_GLYPHS ? t1_standard_glyphs[sid] : 0 ); } - - static const PSNames_Interface psnames_interface = + static const PSNames_Interface psnames_interface = { #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - (PS_Unicode_Value_Func) PS_Unicode_Value, - (PS_Build_Unicodes_Func) PS_Build_Unicode_Table, - (PS_Lookup_Unicode_Func) PS_Lookup_Unicode, -#else - 0, - 0, - 0, -#endif - (PS_Macintosh_Name_Func) PS_Macintosh_Name, - (PS_Adobe_Std_Strings_Func) PS_Standard_Strings, + (PS_Unicode_Value_Func) PS_Unicode_Value, + (PS_Build_Unicodes_Func) PS_Build_Unicode_Table, + (PS_Lookup_Unicode_Func) PS_Lookup_Unicode, + +#else + + 0, + 0, + 0, + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + (PS_Macintosh_Name_Func) PS_Macintosh_Name, + (PS_Adobe_Std_Strings_Func)PS_Standard_Strings, t1_standard_encoding, t1_expert_encoding }; -#endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ +#endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ const FT_Module_Class psnames_module_class = { 0, /* this is not a font driver, nor a renderer */ - sizeof(FT_ModuleRec), + sizeof( FT_ModuleRec ), "psnames", /* driver name */ 100, /* driver version */ @@ -245,8 +289,10 @@ (void*)&psnames_interface, /* module specific interface */ #endif - (FT_Module_Constructor) 0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 }; + +/* END */ diff --git a/src/psnames/psmodule.h b/src/psnames/psmodule.h index 5fa89d5b5..ff7ef0650 100644 --- a/src/psnames/psmodule.h +++ b/src/psnames/psmodule.h @@ -4,7 +4,7 @@ /* */ /* High-level PSNames module interface (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,9 +21,9 @@ #include - FT_EXPORT_VAR(const FT_Module_Class) psnames_module_class; + FT_EXPORT_VAR( const FT_Module_Class ) psnames_module_class; -#endif /* PSMODULE_H */ +#endif /* PSDRIVER_H */ /* END */ diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index 61b726a08..ed9810ff9 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -25,6 +25,7 @@ #include #include + static void* get_sfnt_table( TT_Face face, FT_Sfnt_Tag tag ) @@ -145,16 +146,15 @@ sizeof( FT_ModuleRec ), "sfnt", /* driver name */ - 0x10000, /* driver version 1.0 */ - 0x20000, /* driver requires FreeType 2.0 or higher */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ (const void*)&sfnt_interface, /* module specific interface */ - (FT_Module_Constructor) 0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) SFNT_Get_Interface + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) SFNT_Get_Interface }; - /* END */ diff --git a/src/sfnt/sfdriver.h b/src/sfnt/sfdriver.h index cfd1a2a3a..92c9c8129 100644 --- a/src/sfnt/sfdriver.h +++ b/src/sfnt/sfdriver.h @@ -21,7 +21,7 @@ #include - FT_EXPORT_VAR(const FT_Module_Class) sfnt_module_class; + FT_EXPORT_VAR( const FT_Module_Class ) sfnt_module_class; #endif /* SFDRIVER_H */ diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c index d10ca084c..75f8106a5 100644 --- a/src/sfnt/ttcmap.c +++ b/src/sfnt/ttcmap.c @@ -59,7 +59,7 @@ /* table :: A pointer to a cmap object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* The function assumes that the stream is already in use (i.e., */ @@ -281,7 +281,7 @@ /* cmap :: A handle to a cmap object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_CharMap_Free( TT_Face face, diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index c954ec461..f8fb0a73f 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -96,7 +96,7 @@ /* length :: The length of the table if found, undefined otherwise. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Goto_Table( TT_Face face, @@ -141,7 +141,7 @@ /* sfnt :: The SFNT header. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* The stream cursor must be at the font file's origin. */ @@ -275,7 +275,7 @@ /* sfnt :: The SFNT directory header. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* The stream cursor must be at the font file's origin. */ @@ -373,7 +373,7 @@ /* buffer :: The address of target buffer. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Any( TT_Face face, @@ -436,7 +436,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Header( TT_Face face, @@ -507,7 +507,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_MaxProfile( TT_Face face, @@ -597,7 +597,7 @@ /* vertical :: A boolean flag. If set, load vertical metrics. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error TT_Load_Metrics( TT_Face face, @@ -733,7 +733,7 @@ /* vertical :: A boolean flag. If set, load vertical metrics. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Metrics_Header( TT_Face face, @@ -829,7 +829,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Names( TT_Face face, @@ -1020,7 +1020,7 @@ /* stream :: A handle to the input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_CMap( TT_Face face, @@ -1129,7 +1129,7 @@ /* stream :: A handle to the input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_OS2( TT_Face face, @@ -1263,7 +1263,7 @@ /* stream :: A handle to the input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_PostScript( TT_Face face, @@ -1318,7 +1318,7 @@ /* stream :: A handle to the input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_PCLT( TT_Face face, @@ -1389,7 +1389,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Gasp( TT_Face face, @@ -1461,7 +1461,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Kern( TT_Face face, @@ -1566,7 +1566,7 @@ /* stream :: A handle to the input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Hdmx( TT_Face face, diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c index 513078295..8fad70562 100644 --- a/src/sfnt/ttpost.c +++ b/src/sfnt/ttpost.c @@ -427,7 +427,7 @@ /* You must not modify the returned string! */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Get_PS_Name( TT_Face face, diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c index ecfb88e69..9768e63be 100644 --- a/src/sfnt/ttsbit.c +++ b/src/sfnt/ttsbit.c @@ -211,7 +211,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Load_SBit_Const_Metrics( TT_SBit_Range* range, @@ -243,7 +243,7 @@ /* load_offsets :: A flag whether to load the glyph offset table. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Load_SBit_Range_Codes( TT_SBit_Range* range, @@ -306,7 +306,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Load_SBit_Range( TT_SBit_Range* range, @@ -381,7 +381,7 @@ /* stream :: The input stream. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_SBit_Strikes( TT_Face face, @@ -631,7 +631,7 @@ /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ /* */ /* */ - /* TrueType error code. 0 means the glyph index was found. */ + /* FreeType error code. 0 means the glyph index was found. */ /* */ static FT_Error Find_SBit_Range( FT_UInt glyph_index, @@ -735,7 +735,7 @@ /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ /* */ /* */ - /* TrueType error code. 0 means success. Returns */ + /* FreeType error code. 0 means success. Returns */ /* TT_Err_Invalid_Argument if no sbit exists for the requested glyph. */ /* */ static @@ -800,7 +800,7 @@ /* big_metrics :: A big SBit metrics structure for the glyph. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* The stream cursor must be positioned at the glyph's offset within */ @@ -1349,7 +1349,7 @@ /* metrics :: A big sbit metrics structure for the glyph image. */ /* */ /* */ - /* TrueType error code. 0 means success. Returns an error if no */ + /* FreeType error code. 0 means success. Returns an error if no */ /* glyph sbit exists for the index. */ /* */ /* */ diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index e118997a0..07c0b208a 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -75,7 +75,7 @@ /* formats. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only horizontal layouts (left-to-right & right-to-left) are */ @@ -178,7 +178,7 @@ /* size :: A handle to the target size object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Set_Char_Sizes( TT_Size size, @@ -238,7 +238,7 @@ /* size :: A handle to the target size object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Set_Pixel_Sizes( TT_Size size, @@ -280,7 +280,7 @@ /* whether to hint the outline, etc). */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Load_Glyph( TT_GlyphSlot slot, @@ -398,18 +398,20 @@ static - FT_Module_Interface tt_get_interface( TT_Driver driver, - const char* interface ) + FT_Module_Interface tt_get_interface( TT_Driver driver, + const char* interface ) { - FT_Module sfntd = FT_Get_Module( driver->root.root.library, "sfnt" ); + FT_Module sfntd = FT_Get_Module( driver->root.root.library, + "sfnt" ); SFNT_Interface* sfnt; + /* only return the default interface from the SFNT module */ if ( sfntd ) { - sfnt = (SFNT_Interface*)(sfntd->clazz->module_interface); + sfnt = (SFNT_Interface*)( sfntd->clazz->module_interface ); if ( sfnt ) - return sfnt->get_interface( FT_MODULE(driver), interface ); + return sfnt->get_interface( FT_MODULE( driver ), interface ); } return 0; @@ -425,14 +427,14 @@ sizeof ( TT_DriverRec ), "truetype", /* driver name */ - 0x10000, /* driver version == 1.0 */ - 0x20000, /* driver requires FreeType 2.0 or above */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ (void*)0, /* driver specific interface */ - (FT_Module_Constructor) TT_Init_Driver, - (FT_Module_Destructor) TT_Done_Driver, - (FT_Module_Requester) tt_get_interface, + (FT_Module_Constructor)TT_Init_Driver, + (FT_Module_Destructor) TT_Done_Driver, + (FT_Module_Requester) tt_get_interface, }, sizeof ( TT_FaceRec ), @@ -440,23 +442,21 @@ sizeof ( FT_GlyphSlotRec ), - (FTDriver_initFace) TT_Init_Face, - (FTDriver_doneFace) TT_Done_Face, - (FTDriver_initSize) TT_Init_Size, - (FTDriver_doneSize) TT_Done_Size, - (FTDriver_initGlyphSlot) 0, - (FTDriver_doneGlyphSlot) 0, + (FTDriver_initFace) TT_Init_Face, + (FTDriver_doneFace) TT_Done_Face, + (FTDriver_initSize) TT_Init_Size, + (FTDriver_doneSize) TT_Done_Size, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, - (FTDriver_setCharSizes) Set_Char_Sizes, - (FTDriver_setPixelSizes) Set_Pixel_Sizes, - (FTDriver_loadGlyph) Load_Glyph, - (FTDriver_getCharIndex) Get_Char_Index, + (FTDriver_setCharSizes) Set_Char_Sizes, + (FTDriver_setPixelSizes)Set_Pixel_Sizes, + (FTDriver_loadGlyph) Load_Glyph, + (FTDriver_getCharIndex) Get_Char_Index, - (FTDriver_getKerning) Get_Kerning, - (FTDriver_attachFile) 0, - (FTDriver_getAdvances) 0 - - + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) 0, + (FTDriver_getAdvances) 0 }; diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index f671a7a7f..8f1fefa27 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -196,8 +196,9 @@ /* */ /* The following functions are used by default with TrueType fonts. */ /* However, they can be replaced by alternatives if we need to support */ - /* TrueType-compressed formats (like MicroType) in the future.. */ + /* TrueType-compressed formats (like MicroType) in the future. */ /* */ + /*************************************************************************/ static FT_Error TT_Access_Glyph_Frame( TT_Loader* loader, @@ -208,7 +209,8 @@ FT_Error error; FT_Stream stream = loader->stream; - /* the following line sets the 'error' variable through macros !! */ + + /* the following line sets the `error' variable through macros! */ (void)( FILE_Seek( offset ) || ACCESS_Frame( byte_count ) ); FT_TRACE5(( "Glyph %ld\n", glyph_index )); @@ -216,21 +218,22 @@ } - static - void TT_Forget_Glyph_Frame( TT_Loader* loader ) + void TT_Forget_Glyph_Frame( TT_Loader* loader ) { FT_Stream stream = loader->stream; + + FORGET_Frame(); } - static FT_Error TT_Load_Glyph_Header( TT_Loader* loader ) { FT_Stream stream = loader->stream; + loader->n_contours = GET_Short(); loader->bbox.xMin = GET_Short(); @@ -248,7 +251,6 @@ } - static FT_Error TT_Load_Simple_Glyph( TT_Loader* load ) { @@ -268,15 +270,17 @@ short* cur = gloader->current.outline.contours; short* limit = cur + n_contours; + for ( ; cur < limit; cur++ ) cur[0] = GET_UShort(); n_points = 0; - if (n_contours > 0) - n_points = cur[-1]+1; + if ( n_contours > 0 ) + n_points = cur[-1] + 1; - error = FT_GlyphLoader_Check_Points( gloader, n_points+2, 0 ); - if (error) goto Fail; + error = FT_GlyphLoader_Check_Points( gloader, n_points + 2, 0 ); + if ( error ) + goto Fail; outline = &gloader->current.outline; } @@ -305,7 +309,8 @@ } #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - if ( ( load->load_flags & + + if ( ( load->load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) ) == 0 && load->instructions ) { @@ -314,6 +319,7 @@ MEM_Copy( load->instructions, stream->cursor, n_ins ); } + #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ stream->cursor += n_ins; @@ -325,6 +331,7 @@ FT_Byte* limit = flag + n_points; FT_Byte c, count; + for ( ; flag < limit; flag++ ) { *flag = c = GET_Byte(); @@ -413,14 +420,18 @@ FT_SubGlyph* subglyph; FT_UInt num_subglyphs; + num_subglyphs = 0; + do { FT_Fixed xx, xy, yy, yx; + /* check that we can load a new subglyph */ error = FT_GlyphLoader_Check_Subglyphs( gloader, num_subglyphs+1 ); - if (error) goto Fail; + if ( error ) + goto Fail; subglyph = gloader->current.subglyphs + num_subglyphs; @@ -508,11 +519,11 @@ /* */ /* Once a simple glyph has been loaded, it needs to be processed. */ /* Usually, this means scaling and hinting through bytecode */ - /* interpretation.. */ + /* interpretation. */ /* */ static - FT_Error TT_Process_Simple_Glyph( TT_Loader* load, - FT_Bool debug ) + FT_Error TT_Process_Simple_Glyph( TT_Loader* load, + FT_Bool debug ) { FT_GlyphLoader* gloader = load->gloader; FT_Outline* outline = &gloader->current.outline; @@ -521,6 +532,7 @@ TT_GlyphZone* zone = &load->zone; FT_Error error = FT_Err_Ok; + n_ins = load->glyph->control_len; /* add shadow points */ @@ -532,6 +544,7 @@ FT_Vector* pp1; FT_Vector* pp2; + /* pp1 = xMin - lsb */ pp1 = outline->points + n_points; pp1->x = load->bbox.xMin - load->left_bearing; @@ -555,7 +568,7 @@ tt_prepare_zone( zone, &gloader->current, 0, 0 ); /* eventually scale the glyph */ - if (!(load->load_flags & FT_LOAD_NO_SCALE)) + if ( !( load->load_flags & FT_LOAD_NO_SCALE ) ) { FT_Vector* vec = zone->cur; FT_Vector* limit = vec + n_points; @@ -573,10 +586,11 @@ cur_to_org( n_points, zone ); /* eventually hint the glyph */ - if ( IS_HINTED(load->load_flags) ) + if ( IS_HINTED( load->load_flags ) ) { FT_Pos x = zone->org[n_points-2].x; + x = ( ( x + 32 ) & -64 ) - x; translate_array( n_points, zone->org, x, 0 ); @@ -585,16 +599,18 @@ zone->cur[n_points - 1].x = ( zone->cur[n_points - 1].x + 32 ) & -64; #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + /* now consider hinting */ if ( n_ins > 0 ) { error = TT_Set_CodeRange( load->exec, tt_coderange_glyph, load->exec->glyphIns, n_ins ); - if ( error ) goto Exit; + if ( error ) + goto Exit; load->exec->is_composite = FALSE; - load->exec->pedantic_hinting = (FT_Bool)(load->load_flags & - FT_LOAD_PEDANTIC); + load->exec->pedantic_hinting = (FT_Bool)( load->load_flags & + FT_LOAD_PEDANTIC ); load->exec->pts = *zone; load->exec->pts.n_points += 2; @@ -604,7 +620,9 @@ error = FT_Err_Ok; /* ignore bytecode errors in non-pedantic mode */ } + #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + } /* save glyph phantom points */ @@ -619,10 +637,6 @@ } - - - - /*************************************************************************/ /* */ /* */ @@ -718,13 +732,15 @@ /* access glyph frame */ error = face->access_glyph_frame( loader, glyph_index, offset, count ); - if (error) goto Exit; + if ( error ) + goto Exit; opened_frame = 1; /* read first glyph header */ error = face->read_glyph_header( loader ); - if (error) goto Fail; + if ( error ) + goto Fail; contours_count = loader->n_contours; @@ -751,10 +767,12 @@ { /* check that we can add the contours to the glyph */ error = FT_GlyphLoader_Check_Points( gloader, 0, contours_count ); - if (error) goto Fail; + if ( error ) + goto Fail; error = face->read_simple_glyph( loader ); - if (error) goto Fail; + if ( error ) + goto Fail; #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER { @@ -783,13 +801,14 @@ TT_GlyphSlot glyph = (TT_GlyphSlot)loader->glyph; FT_UInt start_point, start_contour; + /* for each subglyph, read composite header */ start_point = gloader->base.outline.n_points; start_contour = gloader->base.outline.n_contours; - error = face->read_composite_glyph( loader ); - if (error) goto Fail; + if ( error ) + goto Fail; face->forget_glyph_frame( loader ); opened_frame = 0; @@ -832,10 +851,10 @@ FT_Vector pp1, pp2; FT_Pos x, y; - /* each time we call load_truetype_glyph in this loop, the */ - /* value of 'gloader.base.subglyphs' can change due to table */ - /* reallocations. We thus need to recompute the subglyph */ - /* pointer on each iteration.. */ + /* Each time we call load_truetype_glyph in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ subglyph = gloader->base.subglyphs + num_base_subgs + n; pp1 = loader->pp1; @@ -870,8 +889,10 @@ WE_HAVE_AN_XY_SCALE | WE_HAVE_A_2X2 ) ) { - FT_Vector* cur = gloader->base.outline.points + num_base_points; - FT_Vector* org = gloader->base.extra_points + num_base_points; + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* org = gloader->base.extra_points + + num_base_points; FT_Vector* limit = cur + num_new_points; for ( ; cur < limit; cur++, org++ ) @@ -890,6 +911,7 @@ FT_Vector* p1; FT_Vector* p2; + if ( start_point + k >= num_base_points || l >= (FT_UInt)num_new_points ) { @@ -950,12 +972,12 @@ /* read size of instructions */ if ( FILE_Seek( loader->ins_pos ) || - READ_UShort(n_ins) ) + READ_UShort( n_ins ) ) goto Fail; FT_TRACE5(( " Instructions size = %d\n", n_ins )); /* in some fonts ?? */ - if (n_ins == 0xFFFF) + if ( n_ins == 0xFFFF ) n_ins = 0; /* check it */ @@ -981,7 +1003,8 @@ goto Fail; /* prepare the execution context */ - tt_prepare_zone( &exec->pts, &gloader->base, start_point, start_contour ); + tt_prepare_zone( &exec->pts, &gloader->base, + start_point, start_contour ); pts = &exec->pts; pts->n_points = num_points + 2; @@ -1039,7 +1062,7 @@ /***********************************************************************/ Fail: - if (opened_frame) + if ( opened_frame ) face->forget_glyph_frame( loader ); Exit: @@ -1090,11 +1113,12 @@ else bbox = loader->bbox; - /* get the device-independent horizontal advance. It is scaled later */ - /* by the base layer.. */ + /* get the device-independent horizontal advance. It is scaled later */ + /* by the base layer. */ { FT_Pos advance = loader->advance; + /* the flag FT_LOAD_NO_ADVANCE_CHECK was introduced to */ /* correctly support DynaLab fonts, which have an incorrect */ /* `advance_Width_Max' field! It is used, to my knowledge, */ @@ -1105,7 +1129,7 @@ advance = face->horizontal.advance_Width_Max; /* we need to return the advance in font units in linearHoriAdvance, */ - /* it will be scaled later by the base layer.. */ + /* it will be scaled later by the base layer. */ glyph->linearHoriAdvance = advance; } @@ -1188,13 +1212,13 @@ advance = advance_height; } - /* set the advance height in design units. It is scaled later by the */ - /* base layer.. */ + /* set the advance height in design units. It is scaled later by */ + /* the base layer. */ glyph->linearVertAdvance = advance_height; - /* XXX: for now, we have no better algorithm for the lsb, but it */ - /* should work fine. */ - /* */ + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ left = ( bbox.xMin - bbox.xMax ) / 2; /* grid-fit them if necessary */ @@ -1252,7 +1276,7 @@ /* whether to hint the outline, etc). */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Load_Glyph( TT_Size size, @@ -1352,6 +1376,7 @@ /* update the glyph zone bounds */ { FT_GlyphLoader* gloader = FT_FACE_DRIVER(face)->glyph_loader; + loader.gloader = gloader; diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index d84509771..d81a33f30 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -257,7 +257,7 @@ /* exec :: The target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Goto_CodeRange( TT_ExecContext exec, @@ -307,7 +307,7 @@ /* exec :: The target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Set_CodeRange( TT_ExecContext exec, @@ -339,7 +339,7 @@ /* exec :: The target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Does not set the Error variable. */ @@ -378,7 +378,7 @@ /* memory :: A handle to the parent memory object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only the glyph loader and debugger should call this function. */ @@ -433,7 +433,7 @@ /* exec :: A handle to the target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Init_Context( TT_ExecContext exec, @@ -504,7 +504,7 @@ /* buff :: The address of the buffer base pointer. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ static FT_Error Update_Max( FT_Memory memory, @@ -546,7 +546,7 @@ /* exec :: A handle to the target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only the glyph loader and debugger should call this function. */ @@ -649,7 +649,7 @@ /* size :: A handle to the target size object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only the glyph loader and debugger should call this function. */ @@ -834,7 +834,7 @@ /* exec :: A handle to the target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only the glyph loader and debugger should call this function. */ @@ -6781,7 +6781,7 @@ /* exec :: A handle to the target execution context. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ /* */ /* Only the object manager and debugger should call this function. */ diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c index f167ec43e..f047bf1fc 100644 --- a/src/truetype/ttobjs.c +++ b/src/truetype/ttobjs.c @@ -143,7 +143,7 @@ /* face :: The newly built face object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_DEF FT_Error TT_Init_Face( FT_Stream stream, @@ -158,7 +158,8 @@ library = face->root.driver->root.library; sfnt = (SFNT_Interface*)FT_Get_Module_Interface( library, "sfnt" ); - if (!sfnt) goto Bad_Format; + if ( !sfnt ) + goto Bad_Format; /* create input stream from resource */ if ( FILE_Seek( 0 ) ) @@ -190,7 +191,7 @@ TT_Load_CVT ( face, stream ) || TT_Load_Programs ( face, stream ); - /* initialise standard glyph loading routines */ + /* initialize standard glyph loading routines */ TT_Init_Glyph_Loading( face ); Exit: @@ -221,8 +222,8 @@ SFNT_Interface* sfnt = face->sfnt; - /* for "extended TrueType formats" (i.e. compressed versions) */ - if (face->extra.finalizer) + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) face->extra.finalizer( face->extra.data ); if ( sfnt ) @@ -263,7 +264,7 @@ /* size :: A handle to the size object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_DEF FT_Error TT_Init_Size( TT_Size size ) @@ -341,6 +342,7 @@ { FT_Library library = face->root.driver->root.library; + face->interpreter = (TT_Interpreter) library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; if ( !face->interpreter ) @@ -652,20 +654,21 @@ /* driver :: A handle to the target driver object. */ /* */ /* */ - /* TrueType error code. 0 means success. */ + /* FreeType error code. 0 means success. */ /* */ LOCAL_FUNC FT_Error TT_Init_Driver( TT_Driver driver ) { FT_Error error; - /* set 'extra' in glyph loader */ - error = FT_GlyphLoader_Create_Extra( FT_DRIVER(driver)->glyph_loader ); + + /* set `extra' in glyph loader */ + error = FT_GlyphLoader_Create_Extra( FT_DRIVER( driver )->glyph_loader ); /* init extension registry if needed */ #ifdef TT_CONFIG_OPTION_EXTEND_ENGINE - if (!error) + if ( !error ) return TT_Init_Extensions( driver ); #endif diff --git a/src/type1/t1afm.h b/src/type1/t1afm.h index 984ae945c..1e9bba0c0 100644 --- a/src/type1/t1afm.h +++ b/src/type1/t1afm.h @@ -1,47 +1,59 @@ -/*************************************************************************** - * - * t1afm.h - support for reading Type 1 AFM files - * - * - ***************************************************************************/ +/***************************************************************************/ +/* */ +/* t1afm.h */ +/* */ +/* AFM support for Type 1 fonts (specification). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + #ifndef T1AFM_H #define T1AFM_H #include -/* In this version, we only read the kerning table from the */ -/* AFM file. We may add support for ligatures a bit later.. */ -typedef struct T1_Kern_Pair_ -{ - FT_UInt glyph1; - FT_UInt glyph2; - FT_Vector kerning; + typedef struct T1_Kern_Pair_ + { + FT_UInt glyph1; + FT_UInt glyph2; + FT_Vector kerning; -} T1_Kern_Pair; + } T1_Kern_Pair; + + typedef struct T1_AFM_ + { + FT_Int num_pairs; + T1_Kern_Pair* kern_pairs; + + } T1_AFM; -typedef struct T1_AFM_ -{ - FT_Int num_pairs; - T1_Kern_Pair* kern_pairs; + LOCAL_DEF + FT_Error T1_Read_AFM( FT_Face face, + FT_Stream stream ); -} T1_AFM; + LOCAL_DEF + void T1_Done_AFM( FT_Memory memory, + T1_AFM* afm ); + LOCAL_DEF + void T1_Get_Kerning( T1_AFM* afm, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); -LOCAL_DEF -FT_Error T1_Read_AFM( FT_Face face, - FT_Stream stream ); - -LOCAL_DEF -void T1_Done_AFM( FT_Memory memory, - T1_AFM* afm ); - -LOCAL_DEF -void T1_Get_Kerning( T1_AFM* afm, - FT_UInt glyph1, - FT_UInt glyph2, - FT_Vector* kerning ); #endif /* T1AFM_H */ + + +/* END */ diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c index 85b580d35..a3a23a35d 100644 --- a/src/type1/t1driver.c +++ b/src/type1/t1driver.c @@ -1,19 +1,20 @@ -/******************************************************************* - * - * t1driver.c - * - * High-level Type1 driver interface for FreeType 2.0 - * - * Copyright 1996-1998 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - ******************************************************************/ +/***************************************************************************/ +/* */ +/* t1driver.c */ +/* */ +/* Type 1 driver interface (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + #include #include @@ -23,11 +24,22 @@ #include #include +#include /* for strcmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ #undef FT_COMPONENT #define FT_COMPONENT trace_t1driver + #ifndef T1_CONFIG_OPTION_NO_AFM + /*************************************************************************/ /* */ /* */ @@ -68,85 +80,96 @@ { T1_AFM* afm; + kerning->x = 0; kerning->y = 0; afm = (T1_AFM*)face->afm_data; - if (afm) + if ( afm ) T1_Get_Kerning( afm, left_glyph, right_glyph, kerning ); return T1_Err_Ok; } -#endif - /******************************************************************/ - /* */ - /* Set_Char_Sizes */ - /* */ - /* */ - /* A driver method used to reset a size's character sizes */ - /* (horizontal and vertical) expressed in fractional points. */ - /* */ - /* */ - /* size :: handle to target size object */ - /* char_width :: character width expressed in 26.6 points */ - /* char_height :: character height expressed in 26.6 points */ - /* */ - /* */ - /* FreeType error code. 0 means success */ - /* */ + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + + /*************************************************************************/ + /* */ + /* */ + /* Set_Char_Sizes */ + /* */ + /* */ + /* A driver method used to reset a size's character sizes (horizontal */ + /* and vertical) expressed in fractional points. */ + /* */ + /* */ + /* char_width :: The character width expressed in 26.6 */ + /* fractional points. */ + /* */ + /* char_height :: The character height expressed in 26.6 */ + /* fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution of the output device. */ + /* */ + /* vert_resolution :: The vertical resolution of the output device. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ static - FT_Error Set_Char_Sizes( T1_Size size, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ) + FT_Error Set_Char_Sizes( T1_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) { - UNUSED(char_width); - UNUSED(char_height); - UNUSED(horz_resolution); - UNUSED(vert_resolution); + UNUSED( char_width ); + UNUSED( char_height ); + UNUSED( horz_resolution ); + UNUSED( vert_resolution ); size->valid = FALSE; + return T1_Reset_Size( size ); } - /******************************************************************/ - /* */ - /* Set_Pixel_Sizes */ - /* */ - /* */ - /* A driver method used to reset a size's character sizes */ - /* (horizontal and vertical) expressed in integer pixels. */ - /* */ - /* */ - /* size :: handle to target size object */ - /* */ - /* pixel_width :: character width expressed in 26.6 points */ - /* */ - /* pixel_height :: character height expressed in 26.6 points */ - /* */ - /* char_size :: the corresponding character size in points */ - /* This value is only sent to the TrueType */ - /* bytecode interpreter, even though 99% of */ - /* glyph programs will simply ignore it. A */ - /* safe value there is the maximum of the */ - /* pixel width and height (multiplied by */ - /* 64 to make it a 26.6 fixed float !) */ - /* */ - /* FreeType error code. 0 means success */ - /* */ + /*************************************************************************/ + /* */ + /* */ + /* Set_Pixel_Sizes */ + /* */ + /* */ + /* A driver method used to reset a size's character sizes (horizontal */ + /* and vertical) expressed in integer pixels. */ + /* */ + /* */ + /* pixel_width :: The character width expressed in integer pixels. */ + /* */ + /* pixel_height :: The character height expressed in integer pixels. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ static - FT_Error Set_Pixel_Sizes( T1_Size size, - FT_Int pixel_width, - FT_Int pixel_height ) + FT_Error Set_Pixel_Sizes( T1_Size size, + FT_Int pixel_width, + FT_Int pixel_height ) { - UNUSED(pixel_width); - UNUSED(pixel_height); + UNUSED( pixel_width ); + UNUSED( pixel_height ); size->valid = FALSE; - return T1_Reset_Size(size); + + return T1_Reset_Size( size ); } /*************************************************************************/ @@ -174,97 +197,96 @@ face = (T1_Face)charmap->face; psnames = (PSNames_Interface*)face->psnames; - if (psnames) - switch (charmap->encoding) + if ( psnames ) + switch ( charmap->encoding ) { - /********************************************************************/ - /* */ - /* Unicode encoding support */ - /* */ - case ft_encoding_unicode: - { - /* use the "psnames" module to synthetize the Unicode charmap */ - result = psnames->lookup_unicode( &face->unicode_map, - (FT_ULong)charcode ); + /*******************************************************************/ + /* */ + /* Unicode encoding support */ + /* */ + case ft_encoding_unicode: + /* use the `psnames' module to synthetize the Unicode charmap */ + result = psnames->lookup_unicode( &face->unicode_map, + (FT_ULong)charcode ); - /* the function returns 0xFFFF when the Unicode charcode has */ - /* no corresponding glyph.. */ - if (result == 0xFFFF) - result = 0; - goto Exit; - } + /* the function returns 0xFFFF when the Unicode charcode has */ + /* no corresponding glyph. */ + if ( result == 0xFFFF ) + result = 0; + goto Exit; - /********************************************************************/ - /* */ - /* Custom Type 1 encoding */ - /* */ - case ft_encoding_adobe_custom: + /*******************************************************************/ + /* */ + /* Custom Type 1 encoding */ + /* */ + case ft_encoding_adobe_custom: + { + T1_Encoding* encoding = &face->type1.encoding; + + + if ( charcode >= encoding->code_first && + charcode <= encoding->code_last ) + result = encoding->char_index[charcode]; + goto Exit; + } + + /*******************************************************************/ + /* */ + /* Adobe Standard & Expert encoding support */ + /* */ + default: + if ( charcode < 256 ) + { + FT_UInt code; + FT_Int n; + const char* glyph_name; + + + code = psnames->adobe_std_encoding[charcode]; + if ( charmap->encoding == ft_encoding_adobe_expert ) + code = psnames->adobe_expert_encoding[charcode]; + + glyph_name = psnames->adobe_std_strings( code ); + if ( !glyph_name ) + break; + + for ( n = 0; n < face->type1.num_glyphs; n++ ) { - T1_Encoding* encoding = &face->type1.encoding; - if (charcode >= encoding->code_first && - charcode <= encoding->code_last) + const char* gname = face->type1.glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + strcmp( gname, glyph_name ) == 0 ) { - result = encoding->char_index[charcode]; + result = n; + break; } - goto Exit; } - - /********************************************************************/ - /* */ - /* Adobe Standard & Expert encoding support */ - /* */ - default: - if (charcode < 256) - { - FT_UInt code; - FT_Int n; - const char* glyph_name; - - code = psnames->adobe_std_encoding[charcode]; - if (charmap->encoding == ft_encoding_adobe_expert) - code = psnames->adobe_expert_encoding[charcode]; - - glyph_name = psnames->adobe_std_strings(code); - if (!glyph_name) break; - - for ( n = 0; n < face->type1.num_glyphs; n++ ) - { - const char* gname = face->type1.glyph_names[n]; - - if ( gname && gname[0] == glyph_name[0] && - strcmp( gname, glyph_name ) == 0 ) - { - result = n; - break; - } - } - } + } } Exit: return result; } - - - const FT_Driver_Class t1_driver_class = + const FT_Driver_Class t1_driver_class = { { ft_module_font_driver | ft_module_driver_scalable, sizeof( FT_DriverRec ), "type1", /* driver name */ - 0x10000, /* driver version 1.0 */ - 0x20000, /* driver requires FreeType 2.0 or above */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ 0, /* module specific interface */ - (FT_Module_Constructor) 0, - (FT_Module_Destructor) 0, + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, #ifdef T1_CONFIG_OPTION_NO_AFM - (FT_Module_Requester) Get_Interface + (FT_Module_Requester) Get_Interface #else - (FT_Module_Requester) 0 + (FT_Module_Requester) 0 #endif }, @@ -272,51 +294,31 @@ sizeof( T1_SizeRec ), sizeof( T1_GlyphSlotRec ), - (FTDriver_initFace) T1_Init_Face, - (FTDriver_doneFace) T1_Done_Face, - (FTDriver_initSize) T1_Init_Size, - (FTDriver_doneSize) T1_Done_Size, - (FTDriver_initGlyphSlot) T1_Init_GlyphSlot, - (FTDriver_doneGlyphSlot) T1_Done_GlyphSlot, + (FTDriver_initFace) T1_Init_Face, + (FTDriver_doneFace) T1_Done_Face, + (FTDriver_initSize) T1_Init_Size, + (FTDriver_doneSize) T1_Done_Size, + (FTDriver_initGlyphSlot)T1_Init_GlyphSlot, + (FTDriver_doneGlyphSlot)T1_Done_GlyphSlot, - (FTDriver_setCharSizes) Set_Char_Sizes, - (FTDriver_setPixelSizes) Set_Pixel_Sizes, - (FTDriver_loadGlyph) T1_Load_Glyph, - (FTDriver_getCharIndex) Get_Char_Index, + (FTDriver_setCharSizes) Set_Char_Sizes, + (FTDriver_setPixelSizes)Set_Pixel_Sizes, + (FTDriver_loadGlyph) T1_Load_Glyph, + (FTDriver_getCharIndex) Get_Char_Index, #ifdef T1_CONFIG_OPTION_NO_AFM - (FTDriver_getKerning) 0, - (FTDriver_getAdvances) 0 + (FTDriver_getKerning) 0, + (FTDriver_getAdvances) 0 #else - (FTDriver_getKerning) Get_Kerning, - (FTDriver_attachFile) T1_Read_AFM + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) T1_Read_AFM #endif }; - /******************************************************************/ - /* */ - /* Get_FreeType_Driver_Interface */ - /* */ - /* */ - /* This function is used when compiling the TrueType driver */ - /* as a shared library (.DLL or .so). It will be used by the */ - /* high-level library of FreeType to retrieve the address of */ - /* the driver's generic interface. */ - /* */ - /* It shouldn't be implemented in a static build, as each */ - /* driver must have the same function as an exported entry */ - /* point. */ - /* */ - /* */ - /* address of TrueType's driver generic interface. The */ - /* forma-specific interface can then be retrieved through */ - /* the method interface->get_format_interface.. */ - /* */ - #ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS - EXPORT_FUNC(const FT_Driver_Class*) getDriverClass( void ) + EXPORT_FUNC( const FT_Driver_Class* ) getDriverClass( void ) { return &t1_driver_class; } @@ -324,3 +326,4 @@ #endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */ +/* END */ diff --git a/src/type1/t1driver.h b/src/type1/t1driver.h index c770480ca..5d615b5ba 100644 --- a/src/type1/t1driver.h +++ b/src/type1/t1driver.h @@ -1,26 +1,30 @@ -/******************************************************************* - * - * t1driver.h - * - * High-level Type1 driver interface for FreeType 2.0 - * - * Copyright 1996-1998 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - ******************************************************************/ +/***************************************************************************/ +/* */ +/* t1driver.h */ +/* */ +/* High-level Type 1 driver interface (specification). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + #ifndef T1DRIVER_H #define T1DRIVER_H #include - FT_EXPORT_VAR(const FT_Driver_Class) t1_driver_class; + FT_EXPORT_VAR( const FT_Driver_Class ) t1_driver_class; + #endif /* T1DRIVER_H */ + +/* END */ diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c index b0e6cfe72..325855289 100644 --- a/src/type1/t1gload.c +++ b/src/type1/t1gload.c @@ -1,19 +1,20 @@ -/******************************************************************* - * - * t1gload.c 1.0 - * - * Type1 Glyph Loader. - * - * Copyright 1996-1999 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used - * modified and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - ******************************************************************/ +/***************************************************************************/ +/* */ +/* t1gload.c */ +/* */ +/* Type 1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + #include #include @@ -23,37 +24,35 @@ #include #endif - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /********** *********/ - /********** *********/ - /********** GENERIC CHARSTRINGS PARSING *********/ - /********** *********/ - /********** *********/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ +#include /* for strcmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1gload + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ -/********************************************************************* - * - * - * T1_Init_Builder - * - * - * Initialise a given glyph builder. - * - * - * builder :: glyph builder to initialise - * face :: current face object - * size :: current size object - * glyph :: current glyph object - * funcs :: glyph builder functions (or "methods"). - * - *********************************************************************/ static - void T1_Reset_Builder( T1_Builder* builder, FT_Bool reset_base ) + void T1_Reset_Builder( T1_Builder* builder, + FT_Bool reset_base ) { builder->pos_x = 0; builder->pos_y = 0; @@ -66,9 +65,9 @@ builder->pass = 0; builder->hint_point = 0; - if (builder->loader) + if ( builder->loader ) { - if (reset_base) + if ( reset_base ) FT_GlyphLoader_Rewind( builder->loader ); FT_GlyphLoader_Prepare( builder->loader ); @@ -76,12 +75,32 @@ } + /*************************************************************************/ + /* */ + /* */ + /* T1_Init_Builder */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* funcs :: Glyph builder functions (or `methods'). */ + /* */ LOCAL_FUNC - void T1_Init_Builder( T1_Builder* builder, - T1_Face face, - T1_Size size, - T1_GlyphSlot glyph, - const T1_Builder_Funcs* funcs ) + void T1_Init_Builder( T1_Builder* builder, + T1_Face face, + T1_Size size, + T1_GlyphSlot glyph, + const T1_Builder_Funcs* funcs ) { builder->funcs = *funcs; builder->path_begun = 0; @@ -92,16 +111,17 @@ builder->glyph = glyph; builder->memory = face->root.memory; - if (glyph) + if ( glyph ) { - FT_GlyphLoader* loader = FT_SLOT(glyph)->loader; + FT_GlyphLoader* loader = FT_SLOT( glyph )->loader; + builder->loader = loader; builder->base = &loader->base.outline; builder->current = &loader->current.outline; } - if (size) + if ( size ) { builder->scale_x = size->root.metrics.x_scale; builder->scale_y = size->root.metrics.y_scale; @@ -111,47 +131,43 @@ } -/********************************************************************* - * - * - * T1_Done_Builder - * - * - * Finalise a given glyph builder. Its content can still be - * used after the call, but the function saves important information - * within the corresponding glyph slot. - * - * - * builder :: glyph builder to initialise - * - *********************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Done_Builder */ + /* */ + /* */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ LOCAL_FUNC - void T1_Done_Builder( T1_Builder* builder ) + void T1_Done_Builder( T1_Builder* builder ) { T1_GlyphSlot glyph = builder->glyph; - if (glyph) + + if ( glyph ) glyph->root.outline = *builder->base; } - -/********************************************************************* - * - * - * T1_Init_Decoder - * - * - * Initialise a given Type 1 decoder for parsing - * - * - * decoder :: Type 1 decoder to initialise - * funcs :: hinter functions interface - * - *********************************************************************/ - - + /*************************************************************************/ + /* */ + /* */ + /* T1_Init_Decoder */ + /* */ + /* */ + /* Initializes a given glyph decoder. */ + /* */ + /* */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* funcs :: The hinting functions interface. */ LOCAL_FUNC void T1_Init_Decoder( T1_Decoder* decoder, const T1_Hinter_Funcs* funcs ) @@ -164,49 +180,50 @@ decoder->num_flex_vectors = 0; /* Clear loader */ - MEM_Set( &decoder->builder, 0, sizeof(decoder->builder) ); + MEM_Set( &decoder->builder, 0, sizeof ( decoder->builder ) ); } -/********************************************************************* - * - * - * lookup_glyph_by_stdcharcode - * - * - * Lookup a given glyph by its StandardEncoding charcode. Used - * to implement the SEAC Type 1 operator. - * - * - * face :: current face object - * charcode :: charcode to look for - * - * - * glyph index in font face. Returns -1 if the corresponding - * glyph wasn't found. - * - *********************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* lookup_glyph_by_stdcharcode */ + /* */ + /* */ + /* Looks up a given glyph by its StandardEncoding charcode. Used */ + /* to implement the SEAC Type 1 operator. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ static - FT_Int lookup_glyph_by_stdcharcode( T1_Face face, - FT_Int charcode ) + FT_Int lookup_glyph_by_stdcharcode( T1_Face face, + FT_Int charcode ) { FT_Int n; const FT_String* glyph_name; PSNames_Interface* psnames = (PSNames_Interface*)face->psnames; + /* check range of standard char code */ - if (charcode < 0 || charcode > 255) + if ( charcode < 0 || charcode > 255 ) return -1; glyph_name = psnames->adobe_std_strings( - psnames->adobe_std_encoding[charcode]); + psnames->adobe_std_encoding[charcode] ); for ( n = 0; n < face->type1.num_glyphs; n++ ) { FT_String* name = (FT_String*)face->type1.glyph_names[n]; - if ( name && strcmp(name,glyph_name) == 0 ) + + if ( name && strcmp( name, glyph_name ) == 0 ) return n; } @@ -214,27 +231,30 @@ } -/********************************************************************* - * - * - * t1operator_seac - * - * - * Implements the "seac" Type 1 operator for a Type 1 decoder - * - * - * decoder :: current Type 1 decoder - * asb :: accent's side bearing - * adx :: horizontal position of accent - * ady :: vertical position of accent - * bchar :: base character's StandardEncoding charcode - * achar :: accent character's StandardEncoding charcode - * - * - * Error code. 0 means success. - * - *********************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* t1operator_seac */ + /* */ + /* */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* */ + /* decoder :: The current CID decoder. */ + /* */ + /* asb :: The accent's side bearing. */ + /* */ + /* adx :: The horizontal offset of the accent. */ + /* */ + /* ady :: The vertical offset of the accent. */ + /* */ + /* bchar :: The base character's StandardEncoding charcode. */ + /* */ + /* achar :: The accent character's StandardEncoding charcode. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ static FT_Error t1operator_seac( T1_Decoder* decoder, FT_Pos asb, @@ -251,6 +271,7 @@ T1_Face face = decoder->builder.face; T1_Font* type1 = &face->type1; + bchar_index = lookup_glyph_by_stdcharcode( face, bchar ); achar_index = lookup_glyph_by_stdcharcode( face, achar ); @@ -264,14 +285,15 @@ /* accent character and return the array of subglyphs. */ if ( decoder->builder.no_recurse ) { - FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; FT_GlyphLoader* loader = glyph->loader; FT_SubGlyph* subg; + /* reallocate subglyph array if necessary */ error = FT_GlyphLoader_Check_Subglyphs( loader, 2 ); - if (error) goto Exit; + if ( error ) + goto Exit; subg = loader->current.subglyphs; @@ -300,7 +322,7 @@ /* First load `bchar' in builder */ /* now load the unscaled outline */ - if (decoder->builder.loader) + if ( decoder->builder.loader ) FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ error = T1_Parse_CharStrings( decoder, @@ -309,69 +331,69 @@ type1->num_subrs, type1->subrs, type1->subrs_len ); - if ( error ) goto Exit; + if ( error ) + goto Exit; n_base_points = cur->n_points; + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + /* Now load `achar' on top of the base outline */ + error = T1_Parse_CharStrings( decoder, + type1->charstrings [achar_index], + type1->charstrings_len[achar_index], + type1->num_subrs, + type1->subrs, + type1->subrs_len ); + if ( error ) + return error; + + /* restore the left side bearing and */ + /* advance width of the base character */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + /* Finally, move the accent */ + if ( decoder->builder.load_points ) { - /* save the left bearing and width of the base character */ - /* as they will be erased by the next load. */ + FT_Outline dummy; - left_bearing = decoder->builder.left_bearing; - advance = decoder->builder.advance; - - decoder->builder.left_bearing.x = 0; - decoder->builder.left_bearing.y = 0; - - /* Now load `achar' on top of */ - /* the base outline */ - error = T1_Parse_CharStrings( decoder, - type1->charstrings [achar_index], - type1->charstrings_len[achar_index], - type1->num_subrs, - type1->subrs, - type1->subrs_len ); - if ( error ) return error; - - /* restore the left side bearing and */ - /* advance width of the base character */ - - decoder->builder.left_bearing = left_bearing; - decoder->builder.advance = advance; - - /* Finally, move the accent */ - if ( decoder->builder.load_points ) - { - FT_Outline dummy; - dummy.n_points = base->n_points - n_base_points; - dummy.points = base->points + n_base_points; - FT_Outline_Translate( &dummy, adx - asb, ady ); - } + dummy.n_points = base->n_points - n_base_points; + dummy.points = base->points + n_base_points; + FT_Outline_Translate( &dummy, adx - asb, ady ); } + Exit: return error; } -/********************************************************************* - * - * - * t1operator_flex - * - * - * Implements the "flex" Type 1 operator for a Type 1 decoder - * - * - * decoder :: current Type 1 decoder - * threshold :: threshold - * end_x :: position of final flex point - * end_y :: position of final flex point - * - * - * Error code. 0 means success. - * - *********************************************************************/ + /*************************************************************************/ + /* */ + /* */ + /* t1operator_flex */ + /* */ + /* */ + /* Implements the `flex' Type 1 operator for a Type 1 decoder. */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* threshold :: The threshold. */ + /* end_x :: The horizontal position of the final flex point. */ + /* end_y :: The vertical position of the final flex point. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ static FT_Error t1operator_flex( T1_Decoder* decoder, FT_Pos threshold, @@ -382,10 +404,15 @@ FT_Vector* flex = decoder->flex_vectors; FT_Int n; - /* we don't even try to test the threshold in the non-hinting */ + UNUSED( threshold ); + UNUSED( end_x ); + UNUSED( end_y ); + + + /* we don't even try to test the threshold in the non-hinting */ /* builder, even if the flex operator is said to be a path */ - /* construction statement in the specification. This is better */ - /* left to the hinter.. */ + /* construction statement in the specification. This is better */ + /* left to the hinter. */ flex = decoder->flex_vectors; vec = *flex++; @@ -398,11 +425,6 @@ vec = *flex++; } - - UNUSED(threshold); - UNUSED(end_x); - UNUSED(end_y); - flex = decoder->flex_vectors; return decoder->builder.funcs.rcurve_to( &decoder->builder, @@ -417,44 +439,47 @@ } -/********************************************************************* - * - * - * T1_Parse_CharStrings - * - * - * Parses a given Type 1 charstrings program - * - * - * decoder :: current Type 1 decoder - * charstring_base :: base of the charstring stream - * charstring_len :: length in bytes of the charstring stream - * num_subrs :: number of sub-routines - * subrs_base :: array of sub-routines addresses - * subrs_len :: array of sub-routines lengths - * - * - * Error code. 0 means success. - * - *********************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Parse_CharStrings */ + /* */ + /* */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* num_subrs :: The number of sub-routines. */ + /* */ + /* subrs_base :: An array of sub-routines addresses. */ + /* */ + /* subrs_len :: An array of sub-routines lengths. */ + /* */ + /* */ + /* Free error code. 0 means success. */ + /* */ LOCAL_FUNC - FT_Error T1_Parse_CharStrings( T1_Decoder* decoder, - FT_Byte* charstring_base, - FT_Int charstring_len, - FT_Int num_subrs, - FT_Byte** subrs_base, - FT_Int* subrs_len ) + FT_Error T1_Parse_CharStrings( T1_Decoder* decoder, + FT_Byte* charstring_base, + FT_Int charstring_len, + FT_Int num_subrs, + FT_Byte** subrs_base, + FT_Int* subrs_len ) { - FT_Error error; - T1_Decoder_Zone* zone; - FT_Byte* ip; - FT_Byte* limit; - T1_Builder* builder = &decoder->builder; - T1_Builder_Funcs* builds = &builder->funcs; - T1_Hinter_Funcs* hints = &decoder->hinter; + FT_Error error; + T1_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder* builder = &decoder->builder; + T1_Builder_Funcs* builds = &builder->funcs; + T1_Hinter_Funcs* hints = &decoder->hinter; - static const FT_Int args_count[ op_max ] = + static const FT_Int args_count[op_max] = { 0, /* none */ 0, /* endchar */ @@ -484,7 +509,8 @@ 2 /* setcurrentpoint */ }; - /* First of all, initialise the decoder */ + + /* First of all, initialize the decoder */ decoder->top = decoder->stack; decoder->zone = decoder->zones; zone = decoder->zones; @@ -504,99 +530,146 @@ T1_Operator op = op_none; FT_Long value = 0; - /* First of all, decompress operator or value */ - switch (*ip++) + + /* Start with the decompression of operator or value */ + switch ( *ip++ ) { - case 1: op = op_hstem; break; + case 1: + op = op_hstem; + break; - case 3: op = op_vstem; break; - case 4: op = op_vmoveto; break; - case 5: op = op_rlineto; break; - case 6: op = op_hlineto; break; - case 7: op = op_vlineto; break; - case 8: op = op_rrcurveto; break; - case 9: op = op_closepath; break; - case 10: op = op_callsubr; break; - case 11: op = op_return; break; + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; - case 13: op = op_hsbw; break; - case 14: op = op_endchar; break; + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; - case 21: op = op_rmoveto; break; - case 22: op = op_hmoveto; break; + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; - case 30: op = op_vhcurveto; break; - case 31: op = op_hvcurveto; break; + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; - case 12: - { - if (ip > limit) - { - FT_ERROR(( "T1.Parse_CharStrings : invalid escape (12+EOF)\n" )); - goto Syntax_Error; - } + case 12: + if ( ip > limit ) + { + FT_ERROR(( "T1_Parse_CharStrings: invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } - switch (*ip++) - { - case 0: op = op_dotsection; break; - case 1: op = op_vstem3; break; - case 2: op = op_hstem3; break; - case 6: op = op_seac; break; - case 7: op = op_sbw; break; - case 12: op = op_div; break; - case 16: op = op_callothersubr; break; - case 17: op = op_pop; break; - case 33: op = op_setcurrentpoint; break; - - default: - FT_ERROR(( "T1.Parse_CharStrings : invalid escape (12+%d)\n", - ip[-1] )); - goto Syntax_Error; - } - } + switch ( *ip++ ) + { + case 0: + op = op_dotsection; break; - - case 255: /* four bytes integer */ - { - if (ip+4 > limit) - { - FT_ERROR(( "T1.Parse_CharStrings : unexpected EOF in integer\n" )); - goto Syntax_Error; - } - - value = ((long)ip[0] << 24) | - ((long)ip[1] << 16) | - ((long)ip[2] << 8) | - ip[3]; - ip += 4; - } + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; break; default: - if (ip[-1] >= 32) - { - if (ip[-1] < 247) - value = (long)ip[-1] - 139; - else - { - if (++ip > limit) - { - FT_ERROR(( "T1.Parse_CharStrings : unexpected EOF in integer\n" )); - goto Syntax_Error; - } + FT_ERROR(( "T1_Parse_CharStrings: invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; - if (ip[-2] < 251) - value = ((long)(ip[-2]-247) << 8) + ip[-1] + 108; - else - value = -((((long)ip[-2]-251) << 8) + ip[-1] + 108 ); - } - } + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "T1_Parse_CharStrings: unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = ( (FT_Long)ip[0] << 24 ) | + ( (FT_Long)ip[1] << 16 ) | + ( (FT_Long)ip[2] << 8 ) | + ip[3]; + ip += 4; + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Long)ip[-1] - 139; else { - FT_ERROR(( "T1.Parse_CharStrings : invalid byte (%d)\n", - ip[-1] )); - goto Syntax_Error; + if ( ++ip > limit ) + { + FT_ERROR(( "T1_Parse_CharStrings: unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ((FT_Long)( ip[-2] - 247 ) << 8 ) + ip[-1] + 108; + else + value = -( ( ( (FT_Long)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); } + } + else + { + FT_ERROR(( "T1_Parse_CharStrings: invalid byte (%d)\n", + ip[-1] )); + goto Syntax_Error; + } } /* push value if needed */ @@ -604,7 +677,7 @@ { if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) { - FT_ERROR(( "T1.Parse_CharStrings : Stack overflow !!\n" )); + FT_ERROR(( "T1_Parse_CharStrings: stack overflow!\n" )); goto Syntax_Error; } @@ -614,113 +687,110 @@ else if ( op == op_callothersubr ) /* check arguments differently */ { - if ( top - decoder->stack < 2) + if ( top - decoder->stack < 2 ) goto Stack_Underflow; top -= 2; - switch (top[1]) + switch ( top[1] ) { - case 1: /* start flex feature ----------------------------- */ + case 1: /* start flex feature */ + if ( top[0] != 0 ) + goto Unexpected_OtherSubr; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + decoder->flex_vectors[0].x = 0; + decoder->flex_vectors[0].y = 0; + break; + + case 2: /* add flex vector */ + { + FT_Int index; + FT_Vector* flex; + + + if ( top[0] != 0 ) + goto Unexpected_OtherSubr; + + top -= 2; + if ( top < decoder->stack ) + goto Stack_Underflow; + + index = decoder->num_flex_vectors++; + if ( index >= 7 ) { - if (top[0] != 0) goto Unexpected_OtherSubr; - - decoder->flex_state = 1; - decoder->num_flex_vectors = 0; - decoder->flex_vectors[0].x = 0; - decoder->flex_vectors[0].y = 0; + FT_ERROR(( "T1_Parse_CharStrings: too many flex vectors!\n" )); + goto Syntax_Error; } - break; + flex = decoder->flex_vectors + index; + flex->x += top[0]; + flex->y += top[1]; + } + break; - case 2: /* add flex vector ------------------------------- */ - { - FT_Int index; - FT_Vector* flex; - - if (top[0] != 0) goto Unexpected_OtherSubr; - - top -= 2; - if (top < decoder->stack) goto Stack_Underflow; - - index = decoder->num_flex_vectors++; - if (index >= 7) - { - FT_ERROR(( "T1.Parse_CharStrings: too many flex vectors !\n" )); - goto Syntax_Error; - } - - flex = decoder->flex_vectors + index; - flex->x += top[0]; - flex->y += top[1]; - - } - break; - - - case 0: /* end flex feature ------------------------------ */ - { - if ( decoder->flex_state == 0 || - decoder->num_flex_vectors != 7 ) - { - FT_ERROR(( "T1.Parse_CharStrings: unexpected flex end\n" )); - goto Syntax_Error; - } - - if (top[0] != 3) goto Unexpected_OtherSubr; - - top -= 3; - if (top < decoder->stack) goto Stack_Underflow; - - /* now consume the remaining "pop pop setcurrentpoint" */ - if ( ip+6 > limit || - ip[0] != 12 || ip[1] != 17 || /* pop */ - ip[2] != 12 || ip[3] != 17 || /* pop */ - ip[4] != 12 || ip[5] != 33 ) /* setcurrentpoint */ - { - FT_ERROR(( "T1.Parse_CharStrings: invalid flex charstring\n" )); - goto Syntax_Error; - } - - decoder->flex_state = 0; - decoder->top = top; - - error = t1operator_flex( decoder, top[0], top[1], top[2] ); - } - break; - - - case 3: /* change hints ------------------------------------ */ - { - if (top[0] != 1) goto Unexpected_OtherSubr; - - /* eat the following "pop" */ - if (ip+2 > limit) - { - FT_ERROR(( "T1.Parse_CharStrings: invalid escape (12+%d)\n", - ip[-1] )); - goto Syntax_Error; - } - - if (ip[0] != 12 || ip[1] != 17) - { - FT_ERROR(( "T1.Parse_CharStrings: 'pop' expected, found (%d %d)\n", - ip[0], ip[1] )); - goto Syntax_Error; - } - - ip += 2; - error = hints->change_hints(builder); - } - break; - - - default: - /* invalid OtherSubrs call */ - Unexpected_OtherSubr: - FT_ERROR(( "T1.Parse_CharStrings: unexpected OtherSubrs [%d %d]\n", - top[0], top[1] )); + case 0: /* end flex feature */ + if ( decoder->flex_state == 0 || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "T1_Parse_CharStrings: unexpected flex end\n" )); goto Syntax_Error; + } + + if ( top[0] != 3 ) + goto Unexpected_OtherSubr; + + top -= 3; + if ( top < decoder->stack ) + goto Stack_Underflow; + + /* now consume the remaining `pop pop setcurrentpoint' */ + if ( ip + 6 > limit || + ip[0] != 12 || ip[1] != 17 || /* pop */ + ip[2] != 12 || ip[3] != 17 || /* pop */ + ip[4] != 12 || ip[5] != 33 ) /* setcurrentpoint */ + { + FT_ERROR(( "T1_Parse_CharStrings: invalid flex charstring\n" )); + goto Syntax_Error; + } + + decoder->flex_state = 0; + decoder->top = top; + + error = t1operator_flex( decoder, top[0], top[1], top[2] ); + break; + + case 3: /* change hints */ + if ( top[0] != 1 ) + goto Unexpected_OtherSubr; + + /* eat the following `pop' */ + if ( ip + 2 > limit ) + { + FT_ERROR(( "T1_Parse_CharStrings: invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + + if (ip[0] != 12 || ip[1] != 17) + { + FT_ERROR(( "T1_Parse_CharStrings: `pop' expected, found (%d %d)\n", + ip[0], ip[1] )); + goto Syntax_Error; + } + + ip += 2; + + error = hints->change_hints( builder ); + break; + + default: + /* invalid OtherSubrs call */ + Unexpected_OtherSubr: + FT_ERROR(( "T1_Parse_CharStrings: unexpected OtherSubrs [%d %d]\n", + top[0], top[1] )); + goto Syntax_Error; } decoder->top = top; } @@ -728,180 +798,179 @@ { FT_Int num_args = args_count[op]; + if ( top - decoder->stack < num_args ) goto Stack_Underflow; top -= num_args; - switch (op) + switch ( op ) { - case op_endchar: - error = builds->end_char( builder ); - break; + case op_endchar: + error = builds->end_char( builder ); + break; - case op_hsbw: - error = builds->set_bearing_point( builder, top[0], 0, - top[1], 0 ); - break; + case op_hsbw: + error = builds->set_bearing_point( builder, top[0], 0, + top[1], 0 ); + break; - case op_seac: - /* return immediately after the processing */ - return t1operator_seac( decoder, top[0], top[1], - top[2], top[3], top[4] ); + case op_seac: + /* return immediately after the processing */ + return t1operator_seac( decoder, top[0], top[1], + top[2], top[3], top[4] ); - case op_sbw: - error = builds->set_bearing_point( builder, top[0], top[1], - top[2], top[3] ); - break; + case op_sbw: + error = builds->set_bearing_point( builder, top[0], top[1], + top[2], top[3] ); + break; - case op_closepath: - error = builds->close_path( builder ); - break; + case op_closepath: + error = builds->close_path( builder ); + break; - case op_hlineto: - error = builds->rline_to( builder, top[0], 0 ); - break; + case op_hlineto: + error = builds->rline_to( builder, top[0], 0 ); + break; - case op_hmoveto: - error = builds->rmove_to( builder, top[0], 0 ); - break; + case op_hmoveto: + error = builds->rmove_to( builder, top[0], 0 ); + break; - case op_hvcurveto: - error = builds->rcurve_to( builder, top[0], 0, - top[1], top[2], - 0, top[3] ); - break; + case op_hvcurveto: + error = builds->rcurve_to( builder, top[0], 0, + top[1], top[2], + 0, top[3] ); + break; - case op_rlineto: - error = builds->rline_to( builder, top[0], top[1] ); - break; + case op_rlineto: + error = builds->rline_to( builder, top[0], top[1] ); + break; - case op_rmoveto: - /* ignore operator when in flex mode */ - if (decoder->flex_state == 0) - error = builds->rmove_to( builder, top[0], top[1] ); - else - top += 2; - break; + case op_rmoveto: + /* ignore operator when in flex mode */ + if ( decoder->flex_state == 0 ) + error = builds->rmove_to( builder, top[0], top[1] ); + else + top += 2; + break; - case op_rrcurveto: - { - error = builds->rcurve_to( builder, top[0], top[1], - top[2], top[3], - top[4], top[5] ); - } - break; + case op_rrcurveto: + error = builds->rcurve_to( builder, top[0], top[1], + top[2], top[3], + top[4], top[5] ); + break; - case op_vhcurveto: - error = builds->rcurve_to( builder, 0, top[0], - top[1], top[2], - top[3], 0 ); - break; + case op_vhcurveto: + error = builds->rcurve_to( builder, 0, top[0], + top[1], top[2], + top[3], 0 ); + break; - case op_vlineto: - error = builds->rline_to( builder, 0, top[0] ); - break; + case op_vlineto: + error = builds->rline_to( builder, 0, top[0] ); + break; - case op_vmoveto: - error = builds->rmove_to( builder, 0, top[0] ); - break; + case op_vmoveto: + error = builds->rmove_to( builder, 0, top[0] ); + break; - case op_dotsection: - error = hints->dot_section( builder ); - break; + case op_dotsection: + error = hints->dot_section( builder ); + break; - case op_hstem: - error = hints->stem( builder, top[0], top[1], 0 ); - break; + case op_hstem: + error = hints->stem( builder, top[0], top[1], 0 ); + break; - case op_hstem3: - error = hints->stem3( builder, top[0], top[1], top[2], - top[3], top[4], top[5], 0 ); - break; + case op_hstem3: + error = hints->stem3( builder, top[0], top[1], top[2], + top[3], top[4], top[5], 0 ); + break; - case op_vstem: - error = hints->stem( builder, top[0], top[1], 1 ); - break; + case op_vstem: + error = hints->stem( builder, top[0], top[1], 1 ); + break; - case op_vstem3: - error = hints->stem3( builder, top[0], top[1], top[2], - top[3], top[4], top[5], 1 ); - break; + case op_vstem3: + error = hints->stem3( builder, top[0], top[1], top[2], + top[3], top[4], top[5], 1 ); + break; - case op_div: - if (top[1]) - { - *top = top[0] / top[1]; - ++top; - } - else - { - FT_ERROR(( "T1.Parse_CHarStrings : division by 0\n" )); - goto Syntax_Error; - } - break; - - case op_callsubr: - { - FT_Int index = top[0]; - - if ( index < 0 || index >= num_subrs ) - { - FT_ERROR(( "T1.Parse_CharStrings : invalid subrs index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "T1.Parse_CharStrings : too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - zone->base = subrs_base[index]; - zone->limit = zone->base + subrs_len[index]; - zone->cursor = zone->base; - - if (!zone->base) - { - FT_ERROR(( "T1.Parse_CharStrings : invoking empty subrs !!\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - } - break; - - case op_pop: - FT_ERROR(( "T1.Parse_CharStrings : unexpected POP\n" )); + case op_div: + if ( top[1] ) + { + *top = top[0] / top[1]; + ++top; + } + else + { + FT_ERROR(( "T1_Parse_CHarStrings: division by 0\n" )); goto Syntax_Error; + } + break; + + case op_callsubr: + { + FT_Int index = top[0]; - case op_return: - if ( zone <= decoder->zones ) + if ( index < 0 || index >= num_subrs ) { - FT_ERROR(( "T1.Parse_CharStrings : unexpected return\n" )); + FT_ERROR(( "T1_Parse_CharStrings: invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "T1_Parse_CharStrings: too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = subrs_base[index]; + zone->limit = zone->base + subrs_len[index]; + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "T1_Parse_CharStrings: invoking empty subrs!\n" )); goto Syntax_Error; } - zone--; - ip = zone->cursor; - limit = zone->limit; decoder->zone = zone; - break; + ip = zone->base; + limit = zone->limit; + } + break; - case op_setcurrentpoint: - FT_ERROR(( "T1.Parse_CharStrings : unexpected SETCURRENTPOINT\n" )); - goto Syntax_Error; - break; + case op_pop: + FT_ERROR(( "T1_Parse_CharStrings: unexpected POP\n" )); + goto Syntax_Error; - default: - FT_ERROR(( "T1.Parse_CharStrings : unhandled opcode %d\n", op )); + case op_return: + if ( zone <= decoder->zones ) + { + FT_ERROR(( "T1_Parse_CharStrings: unexpected return\n" )); goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_setcurrentpoint: + FT_ERROR(( "T1_Parse_CharStrings: unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + break; + + default: + FT_ERROR(( "T1_Parse_CharStrings: unhandled opcode %d\n", op )); + goto Syntax_Error; } decoder->top = top; @@ -918,28 +987,29 @@ } - -/*************************************************************************/ -/* */ -/* T1_Add_Points */ -/* */ -/* */ -/* Checks that there is enough room in the current load glyph outline */ -/* to accept "num_points" additional outline points. If not, this */ -/* function grows the load outline's arrays accordingly.. */ -/* */ -/* */ -/* builder :: pointer to glyph builder object */ -/* num_points :: number of points that will be added later */ -/* */ -/* */ -/* Type1 error code. 0 means success */ -/* */ -/* */ -/* This function does NOT update the points count in the glyph builder*/ -/* This must be done by the caller itself, after this function is */ -/* invoked.. */ -/* */ + /*************************************************************************/ + /* */ + /* */ + /* T1_Add_Points */ + /* */ + /* */ + /* Checks that there is enough room in the current load glyph outline */ + /* to accept `num_points' additional outline points. If not, this */ + /* function grows the load outline's arrays accordingly. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder object. */ + /* */ + /* num_points :: The number of points that will be added later. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function does NOT update the points count in the glyph */ + /* builder. This must be done by the caller itself, after this */ + /* function has been invoked. */ + /* */ LOCAL_FUNC FT_Error T1_Add_Points( T1_Builder* builder, FT_Int num_points ) @@ -947,27 +1017,30 @@ return FT_GlyphLoader_Check_Points( builder->loader, num_points, 0 ); } -/*************************************************************************/ -/* */ -/* T1_Add_Contours */ -/* */ -/* */ -/* Checks that there is enough room in the current load glyph outline */ -/* to accept "num_contours" additional contours. If not, this func */ -/* the load outline's arrays accordingly.. */ -/* */ -/* */ -/* builder :: pointer to glyph builder object */ -/* num_contours :: number of contours that will be added later */ -/* */ -/* */ -/* Type1 error code. 0 means success */ -/* */ -/* */ -/* This function does NOT update the contours count in the load glyph */ -/* This must be done by the caller itself, after this function is */ -/* invoked.. */ -/* */ + + /*************************************************************************/ + /* */ + /* */ + /* T1_Add_Contours */ + /* */ + /* */ + /* Checks that there is enough room in the current load glyph outline */ + /* to accept `num_contours' additional contours. If not, this */ + /* function grows the load outline's arrays accordingly. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder object. */ + /* */ + /* num_contours :: The number of contours that will be added later. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function does NOT update the contours count in the load glyph */ + /* This must be done by the caller itself, after this function is */ + /* invoked. */ + /* */ LOCAL_FUNC FT_Error T1_Add_Contours( T1_Builder* builder, FT_Int num_contours ) @@ -976,23 +1049,21 @@ } - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /********** *********/ - /********** *********/ - /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the maximum advance width of the font. It *********/ - /********** quickly process each glyph charstring to *********/ - /********** extract the value from either a "sbw" or "seac" *********/ - /********** operator. *********/ - /********** *********/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ static @@ -1002,12 +1073,13 @@ FT_Pos wx, FT_Pos wy ) { - if (wx > decoder->builder.advance.x) + UNUSED( sbx ); + UNUSED( sby ); + UNUSED( wy ); + + if ( wx > decoder->builder.advance.x ) decoder->builder.advance.x = wx; - UNUSED(sbx); - UNUSED(sby); - UNUSED(wy); return -1; /* return an error code to exit the Type 1 parser */ /* immediately. */ } @@ -1020,56 +1092,55 @@ return -2; } - /* the maxadv_gbuilder_interface is used when computing the maximum */ - /* advance width of all glyphs in a given font. We only process the */ - /* 'sbw' operator here, and return an error for all others.. */ - /* Note that "seac" is processed by the T1_Decoder */ + /* the maxadv_gbuilder_interface is used when computing the maximum */ + /* advance width of all glyphs in a given font. We only process the */ + /* `sbw' operator here, and return an error for all others. */ + + /* Note that `seac' is processed by the T1_Decoder. */ static const T1_Builder_Funcs maxadv_builder_interface = { - (T1_Builder_EndChar) maxadv_error, - (T1_Builder_Sbw) maxadv_sbw, - (T1_Builder_ClosePath) maxadv_error, - (T1_Builder_RLineTo) maxadv_error, - (T1_Builder_RMoveTo) maxadv_error, - (T1_Builder_RCurveTo) maxadv_error + (T1_Builder_EndChar) maxadv_error, + (T1_Builder_Sbw) maxadv_sbw, + (T1_Builder_ClosePath)maxadv_error, + (T1_Builder_RLineTo) maxadv_error, + (T1_Builder_RMoveTo) maxadv_error, + (T1_Builder_RCurveTo) maxadv_error }; - /* the maxadv_interface is used when computing the maximum advance */ - /* with of the set of glyphs in a given font file. We only process */ - /* the "seac" operator and return immediately.. */ + /* the maxadv_hinter_interface always return an error. */ static const T1_Hinter_Funcs maxadv_hinter_interface = { - (T1_Hinter_DotSection) maxadv_error, - (T1_Hinter_ChangeHints) maxadv_error, - (T1_Hinter_Stem) maxadv_error, - (T1_Hinter_Stem3) maxadv_error, + (T1_Hinter_DotSection) maxadv_error, + (T1_Hinter_ChangeHints)maxadv_error, + (T1_Hinter_Stem) maxadv_error, + (T1_Hinter_Stem3) maxadv_error, }; - LOCAL_FUNC FT_Error T1_Compute_Max_Advance( T1_Face face, - FT_Int *max_advance ) + FT_Int* max_advance ) { FT_Error error; T1_Decoder decoder; FT_Int glyph_index; T1_Font* type1 = &face->type1; + *max_advance = 0; - /* Initialise load decoder */ + /* Initialize load decoder */ T1_Init_Decoder( &decoder, &maxadv_hinter_interface ); T1_Init_Builder( &decoder.builder, face, 0, 0, &maxadv_builder_interface ); /* For each glyph, parse the glyph charstring and extract */ - /* the advance width.. */ + /* the advance width. */ for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ ) { /* now get load the unscaled outline */ @@ -1087,23 +1158,21 @@ } - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /********** *********/ - /********** *********/ - /********** UNHINTED GLYPH LOADER *********/ - /********** *********/ - /********** The following code is in charge of loading a *********/ - /********** single outline. It completely ignores hinting *********/ - /********** and is used when FT_LOAD_NO_HINTING is set. *********/ - /********** *********/ - /********** The Type 1 hinter is located in "t1hint.c" *********/ - /********** *********/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** UNHINTED GLYPH LOADER *********/ + /********** *********/ + /********** The following code is in charge of loading a *********/ + /********** single outline. It completely ignores hinting *********/ + /********** and is used when FT_LOAD_NO_HINTING is set. *********/ + /********** *********/ + /********** The Type 1 hinter is located in `t1hint.c' *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ static @@ -1114,14 +1183,15 @@ FT_Int num_points; FT_Int first_point; - /* Some fonts, like Hershey, are made of "open paths" which are */ - /* now managed directly by FreeType. In this case, it is necessary */ - /* to close the path by duplicating its points in reverse order, */ - /* which is precisely the purpose of this function */ - /* first compute the number of points to duplicate.. */ - if (cur->n_contours > 1) - first_point = cur->contours[ cur->n_contours-2 ]+1; + /* Some fonts, like Hershey, are made of `open paths' which are */ + /* now managed directly by FreeType. In this case, it is necessary */ + /* to close the path by duplicating its points in reverse order, */ + /* which is precisely the purpose of this function. */ + + /* first compute the number of points to duplicate */ + if ( cur->n_contours > 1 ) + first_point = cur->contours[cur->n_contours - 2] + 1; else first_point = 0; @@ -1133,14 +1203,16 @@ FT_Vector* point; char* tags; + error = T1_Add_Points( builder, num_points ); - if (error) return error; + if ( error ) + return error; point = cur->points + cur->n_points; - tags = cur->tags + cur->n_points; + tags = cur->tags + cur->n_points; - source_point = point - 2; - source_tags = tags - 2; + source_point = point - 2; + source_tags = tags - 2; cur->n_points += num_points; @@ -1148,10 +1220,9 @@ do { *point++ = *source_point--; - *tags++ = *source_tags--; + *tags++ = *source_tags--; num_points--; - } - while (num_points > 0); + } while ( num_points > 0 ); } builder->path_begun = 0; @@ -1164,9 +1235,10 @@ { FT_Outline* cur = builder->current; + /* save current contour, if any */ if ( cur->n_contours > 0 ) - cur->contours[cur->n_contours-1] = cur->n_points-1; + cur->contours[cur->n_contours - 1] = cur->n_points - 1; #ifndef T1_CONFIG_OPTION_DISABLE_HINTER /* hint latest points if needed - this is not strictly required */ @@ -1180,17 +1252,18 @@ } - static FT_Error gload_endchar( T1_Builder* builder ) { FT_Error error; + /* close path if needed */ - if (builder->path_begun) + if ( builder->path_begun ) { error = close_open_path( builder ); - if (error) return error; + if ( error ) + return error; } error = gload_closepath( builder ); @@ -1201,7 +1274,6 @@ } - static FT_Error gload_sbw( T1_Builder* builder, FT_Pos sbx, @@ -1216,12 +1288,11 @@ builder->last.x = sbx; builder->last.y = sby; + return 0; } - - static FT_Error gload_rlineto( T1_Builder* builder, FT_Pos dx, @@ -1231,9 +1302,11 @@ FT_Outline* cur = builder->current; FT_Vector vec; + /* grow buffer if necessary */ - error = T1_Add_Points ( builder, 1 ); - if (error) return error; + error = T1_Add_Points( builder, 1 ); + if ( error ) + return error; if ( builder->load_points ) { @@ -1242,13 +1315,14 @@ vec.y = builder->last.y + dy; cur->points[cur->n_points] = vec; - cur->tags [cur->n_points] = FT_Curve_Tag_On; + cur->tags [cur->n_points] = FT_Curve_Tag_On; builder->last = vec; } cur->n_points++; - builder->path_begun = 1; + builder->path_begun = 1; + return T1_Err_Ok; } @@ -1262,28 +1336,32 @@ FT_Outline* cur = builder->current; FT_Vector vec; - /* in the case where "path_begun" is set, we have a rmoveto */ - /* after some normal path definition. When the face's paint */ - /* type is set to 1, this means that we have an "open path", */ - /* also called a 'stroke'. The FreeType raster doesn't support */ - /* opened path, so we'll close it explicitely there.. */ + + /* in the case where `path_begun' is set, we have an `rmoveto' */ + /* after some normal path definition. If the face's paint type */ + /* is set to 1, this means that we have an `open path', also */ + /* called a `stroke'. The FreeType raster doesn't support */ + /* opened paths, so we'll close it explicitely there. */ + if ( builder->path_begun && builder->face->type1.paint_type == 1 ) { if ( builder->face->type1.paint_type == 1 ) { error = close_open_path( builder ); - if (error) return error; + if ( error ) + return error; } } /* grow buffer if necessary */ error = T1_Add_Contours( builder, 1 ) || T1_Add_Points ( builder, 1 ); - if (error) return error; + if ( error ) + return error; /* save current contour, if any */ if ( cur->n_contours > 0 ) - cur->contours[cur->n_contours-1] = cur->n_points-1; + cur->contours[cur->n_contours - 1] = cur->n_points - 1; if ( builder->load_points ) { @@ -1291,7 +1369,7 @@ vec.x = builder->last.x + dx; vec.y = builder->last.y + dy; cur->points[cur->n_points] = vec; - cur->tags [cur->n_points] = FT_Curve_Tag_On; + cur->tags [cur->n_points] = FT_Curve_Tag_On; builder->last = vec; } @@ -1318,39 +1396,43 @@ FT_Vector* points; char* tags; + /* grow buffer if necessary */ - error = T1_Add_Points ( builder, 3 ); - if (error) return error; + error = T1_Add_Points( builder, 3 ); + if ( error ) + return error; if ( builder->load_points ) { /* save point */ points = cur->points + cur->n_points; - tags = cur->tags + cur->n_points; + tags = cur->tags + cur->n_points; vec.x = builder->last.x + dx1; vec.y = builder->last.y + dy1; - points[0] = vec; tags[0] = FT_Curve_Tag_Cubic; + points[0] = vec; + tags[0] = FT_Curve_Tag_Cubic; vec.x += dx2; vec.y += dy2; - points[1] = vec; tags[1] = FT_Curve_Tag_Cubic; + points[1] = vec; + tags[1] = FT_Curve_Tag_Cubic; vec.x += dx3; vec.y += dy3; - points[2] = vec; tags[2] = FT_Curve_Tag_On; + points[2] = vec; + tags[2] = FT_Curve_Tag_On; builder->last = vec; } cur->n_points += 3; builder->path_begun = 1; + return T1_Err_Ok; } - - static FT_Error gload_ignore( void ) { @@ -1373,43 +1455,44 @@ static const T1_Builder_Funcs gload_builder_interface_null = { - (T1_Builder_EndChar) gload_ignore, - (T1_Builder_Sbw) gload_sbw, /* record left bearing */ - (T1_Builder_ClosePath) gload_ignore, - (T1_Builder_RLineTo) gload_ignore, - (T1_Builder_RMoveTo) gload_ignore, - (T1_Builder_RCurveTo) gload_ignore + (T1_Builder_EndChar) gload_ignore, + (T1_Builder_Sbw) gload_sbw, /* record left bearing */ + (T1_Builder_ClosePath)gload_ignore, + (T1_Builder_RLineTo) gload_ignore, + (T1_Builder_RMoveTo) gload_ignore, + (T1_Builder_RCurveTo) gload_ignore }; static const T1_Hinter_Funcs gload_hinter_interface = { - (T1_Hinter_DotSection) gload_ignore, /* dotsection */ - (T1_Hinter_ChangeHints) gload_ignore, /* changehints */ - (T1_Hinter_Stem) gload_ignore, /* hstem & vstem */ - (T1_Hinter_Stem3) gload_ignore, /* hstem3 & vestem3 */ + (T1_Hinter_DotSection) gload_ignore, /* dotsection */ + (T1_Hinter_ChangeHints)gload_ignore, /* changehints */ + (T1_Hinter_Stem) gload_ignore, /* hstem & vstem */ + (T1_Hinter_Stem3) gload_ignore, /* hstem3 & vestem3 */ }; - - /*****************************************************************/ - /* */ - /* Hinter overview : */ - /* */ - /* This is a two-pass hinter. On the first pass, the hints */ - /* are all recorded by the hinter, and no point is loaded */ - /* in the outline. */ - /* */ - /* When the first pass is finished, all stems hints are */ - /* grid-fitted at once. */ - /* */ - /* Then, a second pass is performed to load the outline */ - /* points as well as hint/scale them correctly. */ - /* */ - #ifndef T1_CONFIG_OPTION_DISABLE_HINTER + + /*************************************************************************/ + /* */ + /* Hinter overview: */ + /* */ + /* This is a two-pass hinter. On the first pass, the hints are all */ + /* recorded by the hinter, and no point is loaded in the outline. */ + /* */ + /* When the first pass is finished, all stems hints are grid-fitted */ + /* at once. */ + /* */ + /* Then, a second pass is performed to load the outline points as */ + /* well as hint/scale them correctly. */ + /* */ + /*************************************************************************/ + + static FT_Error t1_load_hinted_glyph( T1_Decoder* decoder, FT_UInt glyph_index, @@ -1422,6 +1505,7 @@ FT_GlyphLoader* loader = decoder->builder.loader; FT_Error error; + /* Pass 1 - try to load first glyph, simply recording points */ old_points = loader->base.outline.n_points; old_contours = loader->base.outline.n_contours; @@ -1441,49 +1525,55 @@ type1->num_subrs, type1->subrs, type1->subrs_len ); - if (error) goto Exit; + if ( error ) + goto Exit; - /* check for composite (i.e. "seac" operator) */ + /* check for composite (i.e. `seac' operator) */ if ( glyph->root.format == ft_glyph_format_composite ) { /* this is a composite glyph, we must then load the first one, */ /* then load the second one on top of it and translate it by a */ - /* fixed amount.. */ - FT_UInt n_base_points; - FT_SubGlyph* subglyph = loader->base.subglyphs; - T1_Size size = builder->size; - FT_Pos dx, dy; - FT_Vector left_bearing, advance; + /* fixed amount. */ + FT_UInt n_base_points; + FT_SubGlyph* subglyph = loader->base.subglyphs; + T1_Size size = builder->size; + FT_Pos dx, dy; + FT_Vector left_bearing, advance; + /* clean glyph format */ glyph->root.format = ft_glyph_format_none; - /* First load "bchar" in builder */ + /* First load `bchar' in builder */ builder->no_recurse = 0; error = t1_load_hinted_glyph( decoder, subglyph->index, 0 ); - if (error) goto Exit; + if ( error ) + goto Exit; /* save the left bearing and width of the base character */ - /* as they will be erased by the next load.. */ + /* as they will be erased by the next load */ left_bearing = builder->left_bearing; advance = builder->advance; - /* Then load "achar" in builder */ + /* Then load `achar' in builder */ n_base_points = builder->base->n_points; subglyph++; error = t1_load_hinted_glyph( decoder, subglyph->index, 0 ); - if (error) goto Exit; + if ( error ) + goto Exit; /* Finally, move the accent */ dx = FT_MulFix( subglyph->arg1, size->root.metrics.x_scale ); dy = FT_MulFix( subglyph->arg2, size->root.metrics.y_scale ); - dx = (dx+32) & -64; - dy = (dy+32) & -64; + dx = ( dx + 32 ) & -64; + dy = ( dy + 32 ) & -64; { FT_Outline dummy; + dummy.n_points = loader->base.outline.n_points - n_base_points; dummy.points = loader->base.outline.points + n_base_points; + FT_Outline_Translate( &dummy, dx, dy ); } @@ -1516,14 +1606,15 @@ } /* save new glyph tables */ - if (recurse) + if ( recurse ) T1_Done_Builder( builder ); Exit: return error; } -#endif - + + +#endif /* T1_CONFIG_OPTION_DISABLE_HINTER */ LOCAL_FUNC @@ -1532,13 +1623,14 @@ FT_Int glyph_index, FT_Int load_flags ) { - FT_Error error; - T1_Decoder decoder; - T1_Face face = (T1_Face)glyph->root.face; - FT_Bool hinting; - T1_Font* type1 = &face->type1; + FT_Error error; + T1_Decoder decoder; + T1_Face face = (T1_Face)glyph->root.face; + FT_Bool hinting; + T1_Font* type1 = &face->type1; - if (load_flags & FT_LOAD_NO_RECURSE) + + if ( load_flags & FT_LOAD_NO_RECURSE ) load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; glyph->x_scale = size->root.metrics.x_scale; @@ -1553,7 +1645,7 @@ #ifndef T1_CONFIG_OPTION_DISABLE_HINTER - hinting = (load_flags & (FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING)) == 0; + hinting = ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) ) == 0; if ( hinting ) { @@ -1564,7 +1656,8 @@ error = t1_load_hinted_glyph( &decoder, glyph_index, 1 ); } else -#endif + +#endif /* T1_CONFIG_OPTION_DISABLE_HINTER */ { T1_Init_Decoder( &decoder, &gload_hinter_interface ); @@ -1572,7 +1665,7 @@ T1_Init_Builder( &decoder.builder, face, size, glyph, &gload_builder_interface ); - decoder.builder.no_recurse = !!(load_flags & FT_LOAD_NO_RECURSE); + decoder.builder.no_recurse = ( load_flags & FT_LOAD_NO_RECURSE ) != 0; /* now load the unscaled outline */ error = T1_Parse_CharStrings( &decoder, @@ -1586,14 +1679,13 @@ T1_Done_Builder( &decoder.builder ); } - - /* Now, set the metrics.. - this is rather simple, as : */ - /* the left side bearing is the xMin, and the top side */ - /* bearing the yMax.. */ - if (!error) + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + if ( !error ) { /* for composite glyphs, return only the left side bearing and the */ - /* advance width.. */ + /* advance width */ if ( load_flags & FT_LOAD_NO_RECURSE ) { glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; @@ -1604,18 +1696,20 @@ FT_BBox cbox; FT_Glyph_Metrics* metrics = &glyph->root.metrics; + /* apply the font matrix */ - FT_Outline_Transform( &glyph->root.outline, &face->type1.font_matrix ); + FT_Outline_Transform( &glyph->root.outline, + &face->type1.font_matrix ); FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); /* grid fit the bounding box if necessary */ - if (hinting) + if ( hinting ) { cbox.xMin &= -64; cbox.yMin &= -64; - cbox.xMax = ( cbox.xMax+63 ) & -64; - cbox.yMax = ( cbox.yMax+63 ) & -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; } metrics->width = cbox.xMax - cbox.xMin; @@ -1625,7 +1719,7 @@ metrics->horiBearingY = cbox.yMax; /* copy the _unscaled_ advance width */ - metrics->horiAdvance = decoder.builder.advance.x; + metrics->horiAdvance = decoder.builder.advance.x; /* make up vertical metrics */ metrics->vertBearingX = 0; @@ -1641,20 +1735,20 @@ glyph->root.outline.flags |= ft_outline_reverse_fill; - /* +#if 0 glyph->root.outline.second_pass = TRUE; - glyph->root.outline.high_precision = ( size->root.metrics.y_ppem < 24 ); + glyph->root.outline.high_precision = size->root.metrics.y_ppem < 24; glyph->root.outline.dropout_mode = 2; - */ +#endif if ( hinting ) { - /* adjust the advance width */ - /* XXX : TODO : consider stem hints grid-fit */ + /* adjust the advance width */ + /* XXX TODO: consider stem hints grid-fit */ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, glyph->x_scale ); } - else if ( (load_flags & FT_LOAD_NO_SCALE) == 0 ) + else if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) { /* scale the outline and the metrics */ FT_Int n; @@ -1681,7 +1775,6 @@ metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, x_scale ); - } } } @@ -1689,3 +1782,5 @@ return error; } + +/* END */ diff --git a/src/type1/t1gload.h b/src/type1/t1gload.h index e491f4366..fd6a434f8 100644 --- a/src/type1/t1gload.h +++ b/src/type1/t1gload.h @@ -1,36 +1,20 @@ -/******************************************************************* - * - * t1gload.h 1.0 - * - * Type1 Glyph Loader. - * - * Copyright 1996-1998 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used - * modified and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - * - * The Type 1 glyph loader uses three distinct objects to build - * scaled and hinted outlines from a charstrings program. These are : - * - * - a glyph builder, T1_Builder, used to store the built outline - * - * - a glyph hinter, T1_Hinter, used to record and apply the stem - * hints - * - * - a charstrings interpreter, T1_Decoder, used to parse the - * Type 1 charstrings stream, manage a stack and call the builder - * and/or hinter depending on the opcodes. - * - * Ideally, a Type 2 glyph loader would only need to have its own - * T2_Decoder object (assuming the hinter is able to manage all - * kinds of hints). - * - ******************************************************************/ +/***************************************************************************/ +/* */ +/* t1gload.h */ +/* */ +/* Type 1 Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + #ifndef T1GLOAD_H #define T1GLOAD_H @@ -42,25 +26,15 @@ #endif -/*************************************************************************/ -/* */ -/* T1_Builder_Funcs */ -/* */ -/* */ -/* a structure used to store the address of various functions */ -/* used by a glyph builder to implement the outline's "path */ -/* construction". */ -/* */ -/* */ typedef struct T1_Builder_ T1_Builder; typedef FT_Error (*T1_Builder_EndChar)( T1_Builder* loader ); - typedef FT_Error (*T1_Builder_Sbw) ( T1_Builder* loader, - FT_Pos sbx, - FT_Pos sby, - FT_Pos wx, - FT_Pos wy ); + typedef FT_Error (*T1_Builder_Sbw)( T1_Builder* loader, + FT_Pos sbx, + FT_Pos sby, + FT_Pos wx, + FT_Pos wy ); typedef FT_Error (*T1_Builder_ClosePath)( T1_Builder* loader ); @@ -80,7 +54,17 @@ FT_Pos dx3, FT_Pos dy3 ); - typedef struct T1_Builder_Funcs_ + + /*************************************************************************/ + /* */ + /* */ + /* T1_Builder_Funcs */ + /* */ + /* */ + /* A structure to store the address of various functions used by a */ + /* glyph builder to implement the outline's `path construction'. */ + /* */ + typedef struct T1_Builder_Funcs_ { T1_Builder_EndChar end_char; T1_Builder_Sbw set_bearing_point; @@ -93,50 +77,60 @@ -/*************************************************************************/ -/* */ -/* T1_Builder */ -/* */ -/* */ -/* a structure used during glyph loading to store its outline. */ -/* */ -/* */ -/* system :: current system object */ -/* face :: current face object */ -/* size :: current size object */ -/* glyph :: current glyph slot */ -/* */ -/* current :: current glyph outline */ -/* base :: base glyph outline */ -/* */ -/* max_points :: maximum points in builder outline */ -/* max_contours :: maximum contours in builder outline */ -/* */ -/* last :: last point position */ -/* */ -/* scale_x :: horizontal scale ( FUnits to sub-pixels ) */ -/* scale_y :: vertical scale ( FUnits to sub-pixels ) */ -/* pos_x :: horizontal translation (composite glyphs) */ -/* pos_y :: vertical translation (composite glyph) */ -/* */ -/* left_bearing :: left side bearing point */ -/* advance :: horizontal advance vector */ -/* */ -/* path_begun :: flag, indicates that a new path has begun */ -/* load_points :: flag, if not set, no points are loaded */ -/* */ -/* pass :: pass number for multi-pass hinters */ -/* */ -/* funcs :: table of builder functions used to perform */ -/* the outline's path construction */ -/* */ -/* hint_point :: index of next point to hint.. */ -/* */ -/* */ -/* */ -/* */ - - struct T1_Builder_ + /*************************************************************************/ + /* */ + /* */ + /* T1_Builder */ + /* */ + /* */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: The current glyph loader. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* last :: The last point position. */ + /* */ + /* scale_x :: The horizontal scale (FUnits to sub-pixels). */ + /* */ + /* scale_y :: The vertical scale (FUnits to sub-pixels). */ + /* */ + /* pos_x :: The horizontal translation (for composite glyphs). */ + /* */ + /* pos_y :: The vertical translation (for composite glyphs). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* no_recurse :: */ + /* */ + /* bbox :: The glyph's bounding box. */ + /* */ + /* path_begun :: A flag which indicates that a new path has begun. */ + /* */ + /* load_points :: A flag which indicates, if not set, that no points */ + /* are loaded. */ + /* */ + /* pass :: The pass number for multi-pass hinters. */ + /* */ + /* hint_point :: The index of the next point to hint. */ + /* */ + /* funcs :: A table of builder functions used to perform the */ + /* outline's path construction. */ + /* */ + struct T1_Builder_ { FT_Memory memory; T1_Face face; @@ -171,15 +165,6 @@ }; -/*************************************************************************/ -/* */ -/* T1_Hinter_Funcs */ -/* */ -/* */ -/* a structure used to store the address of various functions */ -/* used by a Type 1 hinter to perform outline hinting. */ -/* */ - typedef FT_Error (*T1_Hinter_ChangeHints)( T1_Builder* builder ); typedef FT_Error (*T1_Hinter_DotSection)( T1_Builder* builder ); @@ -189,7 +174,6 @@ FT_Pos width, FT_Bool vertical ); - typedef FT_Error (*T1_Hinter_Stem3)( T1_Builder* builder, FT_Pos pos0, FT_Pos width0, @@ -199,18 +183,28 @@ FT_Pos width2, FT_Bool vertical ); - typedef struct T1_Hinter_Func_ + + /*************************************************************************/ + /* */ + /* */ + /* T1_Hinter_Funcs */ + /* */ + /* */ + /* A structure to store the address of various functions used by a */ + /* Type 1 hinter to perform outline hinting. */ + /* */ + typedef struct T1_Hinter_Func_ { - T1_Hinter_ChangeHints change_hints; - T1_Hinter_DotSection dot_section; - T1_Hinter_Stem stem; - T1_Hinter_Stem3 stem3; + T1_Hinter_ChangeHints change_hints; + T1_Hinter_DotSection dot_section; + T1_Hinter_Stem stem; + T1_Hinter_Stem3 stem3; } T1_Hinter_Funcs; - typedef enum T1_Operator_ + typedef enum T1_Operator_ { op_none = 0, op_endchar, @@ -244,10 +238,8 @@ } T1_Operator; - - /* execution context charstring zone */ - typedef struct T1_Decoder_Zone_ + typedef struct T1_Decoder_Zone_ { FT_Byte* base; FT_Byte* limit; @@ -256,171 +248,58 @@ } T1_Decoder_Zone; - typedef struct T1_Decoder_ + typedef struct T1_Decoder_ { - T1_Builder builder; - T1_Hinter_Funcs hinter; + T1_Builder builder; + T1_Hinter_Funcs hinter; - FT_Int stack[ T1_MAX_CHARSTRINGS_OPERANDS ]; - FT_Int* top; + FT_Int stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Int* top; - T1_Decoder_Zone zones[ T1_MAX_SUBRS_CALLS+1 ]; - T1_Decoder_Zone* zone; + T1_Decoder_Zone zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone* zone; - FT_Int flex_state; - FT_Int num_flex_vectors; - FT_Vector flex_vectors[7]; + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; } T1_Decoder; - -/********************************************************************* - * - * - * T1_Init_Builder - * - * - * Initialise a given glyph builder. - * - * - * builder :: glyph builder to initialise - * face :: current face object - * size :: current size object - * glyph :: current glyph object - * funcs :: glyph builder functions (or "methods"). - * - * - * This function is exported for now because it is used by the - * "t1dump" utility. Later, it will be accessed through a - * format-specific extension - * - *********************************************************************/ - LOCAL_DEF - void T1_Init_Builder( T1_Builder* builder, - T1_Face face, - T1_Size size, - T1_GlyphSlot glyph, - const T1_Builder_Funcs* funcs ); - -/********************************************************************* - * - * - * T1_Done_Builder - * - * - * Finalise a given glyph builder. Its content can still be - * used after the call, but the function saves important information - * within the corresponding glyph slot. - * - * - * builder :: glyph builder to initialise - * - * - * This function is exported for now because it is used by the - * "t1dump" utility. Later, it will be accessed through a - * format-specific extension - * - *********************************************************************/ + void T1_Init_Builder( T1_Builder* builder, + T1_Face face, + T1_Size size, + T1_GlyphSlot glyph, + const T1_Builder_Funcs* funcs ); LOCAL_DEF void T1_Done_Builder( T1_Builder* builder ); - -/********************************************************************* - * - * - * T1_Init_Decoder - * - * - * Initialise a given Type 1 decoder for parsing - * - * - * decoder :: Type 1 decoder to initialise - * funcs :: hinter functions interface - * - * - * This function is exported for now because it is used by the - * "t1dump" utility. Later, it will be accessed through a - * format-specific extension - * - *********************************************************************/ - LOCAL_DEF void T1_Init_Decoder( T1_Decoder* decoder, const T1_Hinter_Funcs* funcs ); - - - /* Compute the maximum advance width of a font through quick parsing */ LOCAL_DEF FT_Error T1_Compute_Max_Advance( T1_Face face, - FT_Int *max_advance ); + FT_Int* max_advance ); - - /* This function is exported, because it is used by the T1Dump utility */ LOCAL_DEF - FT_Error T1_Parse_CharStrings( T1_Decoder* decoder, - FT_Byte* charstring_base, - FT_Int charstring_len, - FT_Int num_subrs, - FT_Byte** subrs_base, - FT_Int* subrs_len ); + FT_Error T1_Parse_CharStrings( T1_Decoder* decoder, + FT_Byte* charstring_base, + FT_Int charstring_len, + FT_Int num_subrs, + FT_Byte** subrs_base, + FT_Int* subrs_len ); - - -/*************************************************************************/ -/* */ -/* T1_Add_Points */ -/* */ -/* */ -/* Checks that there is enough room in the current load glyph outline */ -/* to accept "num_points" additional outline points. If not, this */ -/* function grows the load outline's arrays accordingly.. */ -/* */ -/* */ -/* builder :: pointer to glyph builder object */ -/* num_points :: number of points that will be added later */ -/* */ -/* */ -/* Type1 error code. 0 means success */ -/* */ -/* */ -/* This function does NOT update the points count in the glyph loader */ -/* This must be done by the caller itself, after this function is */ -/* invoked.. */ -/* */ LOCAL_DEF FT_Error T1_Add_Points( T1_Builder* builder, FT_Int num_points ); -/*************************************************************************/ -/* */ -/* T1_Add_Contours */ -/* */ -/* */ -/* Checks that there is enough room in the current load glyph outline */ -/* to accept "num_contours" additional contours. If not, this func */ -/* the load outline's arrays accordingly.. */ -/* */ -/* */ -/* builder :: pointer to glyph builder object */ -/* num_contours :: number of contours that will be added later */ -/* */ -/* */ -/* Type1 error code. 0 means success */ -/* */ -/* */ -/* This function does NOT update the contours count in the load glyph */ -/* This must be done by the caller itself, after this function is */ -/* invoked.. */ -/* */ LOCAL_DEF FT_Error T1_Add_Contours( T1_Builder* builder, FT_Int num_contours ); - LOCAL_DEF FT_Error T1_Load_Glyph( T1_GlyphSlot glyph, T1_Size size, @@ -432,4 +311,8 @@ } #endif + #endif /* T1GLOAD_H */ + + +/* END */ diff --git a/src/type1/t1hinter.c b/src/type1/t1hinter.c index aac08387c..0ac6c5e53 100644 --- a/src/type1/t1hinter.c +++ b/src/type1/t1hinter.c @@ -1,151 +1,161 @@ -/******************************************************************* - * - * t1hinter.c 1.2 - * - * Type1 hinter. - * - * Copyright 1996-1999 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used - * modified and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - * - * The Hinter is in charge of fitting th scaled outline to the - * pixel grid in order to considerably improve the quality of - * the Type 1 font driver's output.. - * - ******************************************************************/ +/***************************************************************************/ +/* */ +/* t1hinter.c */ +/* */ +/* Type 1 hinter (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The Hinter is in charge of fitting th scaled outline to the pixel */ + /* grid in order to considerably improve the quality of the Type 1 font */ + /* driver's output. */ + /* */ + /*************************************************************************/ + #include #include #include + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ #undef FT_COMPONENT -#define FT_COMPONENT trace_t1hint /* for debugging/tracing */ +#define FT_COMPONENT trace_t1hint #undef ONE_PIXEL #define ONE_PIXEL 64 #undef ROUND -#define ROUND(x) (( x + ONE_PIXEL/2 ) & -ONE_PIXEL) +#define ROUND( x ) ( ( x + ONE_PIXEL / 2 ) & -ONE_PIXEL ) #undef SCALE -#define SCALE(val) FT_MulFix( val, scale ) +#define SCALE( val ) FT_MulFix( val, scale ) /* various constants used to describe the alignment of a horizontal */ /* stem with regards to the blue zones */ + #define T1_ALIGN_NONE 0 #define T1_ALIGN_BOTTOM 1 #define T1_ALIGN_TOP 2 #define T1_ALIGN_BOTH 3 -/************************************************************************ - * - * - * t1_set_blue_zones - * - * - * Set a size object's blue zones during reset. This will compute - * the "snap" zone corresponding to each blue zone. - * - * - * size :: handle to target size object - * - * - * Error code. 0 means success - * - * - * This functions does the following : - * - * 1. It extracts the bottom and top blue zones from the - * face object. - * - * 2. Each zone is then grown by BlueFuzz, overlapping - * is eliminated by adjusting the zone edges appropriately - * - * 3. For each zone, we keep its original font units position, its - * original scaled position, as well as its grown/adjusted - * edges. - * - ************************************************************************/ + /* very simple bubble sort (not a lot of elements, mostly */ + /* pre-sorted, no need for quicksort) */ - /* ultra simple bubble sort (not a lot of elements, mostly */ - /* pre-sorted, no need for quicksort) */ - static - void t1_sort_blues( FT_Int* blues, - FT_Int count ) + static + void t1_sort_blues( FT_Int* blues, + FT_Int count ) + { + FT_Int i, swap; + FT_Int* cur; + + + for ( i = 2; i < count; i += 2 ) + { + cur = blues + i; + do { - FT_Int i, swap; - FT_Int* cur; + if ( cur[-1] < cur[0] ) + break; - for ( i = 2; i < count; i += 2 ) - { - cur = blues + i; - do - { - if ( cur[-1] < cur[0] ) - break; - - swap = cur[-2]; cur[-2] = cur[0]; cur[0] = swap; - swap = cur[-1]; cur[-1] = cur[1]; cur[1] = swap; - cur -= 2; - } - while ( cur > blues ); - } - } + swap = cur[-2]; cur[-2] = cur[0]; cur[0] = swap; + swap = cur[-1]; cur[-1] = cur[1]; cur[1] = swap; + cur -= 2; + } while ( cur > blues ); + } + } + /*************************************************************************/ + /* */ + /* */ + /* t1_set_blue_zones */ + /* */ + /* */ + /* Sets a size object's blue zones during reset. This will compute */ + /* the `snap' zone corresponding to each blue zone. */ + /* */ + /* */ + /* size :: A handle to target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This functions does the following: */ + /* */ + /* 1. It extracts the bottom and top blue zones from the face object. */ + /* */ + /* 2. Each zone is then grown by `BlueFuzz', overlapping is */ + /* eliminated by adjusting the zone edges appropriately. */ + /* */ + /* 3. For each zone, we keep its original font units position, its */ + /* original scaled position, as well as its grown/adjusted edges. */ + /* */ static FT_Error t1_set_blue_zones( T1_Size size ) { - T1_Face face = (T1_Face)size->root.face; - T1_Private* priv = &face->type1.private_dict; - FT_Int n; - FT_Int blues[24]; - FT_Int num_bottom; - FT_Int num_top; - FT_Int num_blues; - T1_Size_Hints* hints = size->hints; - T1_Snap_Zone* zone; - FT_Pos pix, orus; - FT_Pos min, max, threshold; - FT_Fixed scale; - FT_Bool is_bottom; + T1_Face face = (T1_Face)size->root.face; + T1_Private* priv = &face->type1.private_dict; + FT_Int n; + FT_Int blues[24]; + FT_Int num_bottom; + FT_Int num_top; + FT_Int num_blues; + T1_Size_Hints* hints = size->hints; + T1_Snap_Zone* zone; + FT_Pos pix, orus; + FT_Pos min, max, threshold; + FT_Fixed scale; + FT_Bool is_bottom; - /**********************************************************************/ - /* */ - /* COPY BOTTOM AND TOP BLUE ZONES IN LOCAL ARRAYS */ - /* */ - /* */ + + /***********************************************************************/ + /* */ + /* copy bottom and top blue zones in local arrays */ + /* */ /* First of all, check the sizes of the /BlueValues and /OtherBlues */ - /* tables. They all must contain an even number of arguments */ + /* tables. They all must contain an even number of arguments. */ if ( priv->num_other_blues & 1 || priv->num_blue_values & 1 ) { - FT_ERROR(( "T1.Copy_Blues : odd number of blue values\n" )); + FT_ERROR(( "t1_set_blue_zones: odd number of blue values\n" )); return T1_Err_Syntax_Error; } - /* copy the bottom blue zones from /OtherBlues */ + /* copy the bottom blue zones from /OtherBlues */ num_top = 0; num_bottom = priv->num_other_blues; - for ( n = 0; n < num_bottom; n ++ ) + for ( n = 0; n < num_bottom; n++ ) blues[n] = priv->other_blues[n]; - /* Add the first blue zone in /BlueValues to the table */ + /* add the first blue zone in /BlueValues to the table */ num_top = priv->num_blue_values - 2; if ( num_top >= 0 ) { - blues[ num_bottom ] = priv->blue_values[0]; - blues[num_bottom+1] = priv->blue_values[1]; + blues[num_bottom ] = priv->blue_values[0]; + blues[num_bottom + 1] = priv->blue_values[1]; num_bottom += 2; } @@ -159,7 +169,7 @@ if ( num_top > 0 ) { for ( n = 0; n < num_top; n++ ) - blues[ num_bottom+n ] = priv->blue_values[n+2]; + blues[num_bottom + n] = priv->blue_values[n + 2]; /* sort the top blue zones */ t1_sort_blues( blues + num_bottom, num_top ); @@ -170,28 +180,29 @@ num_blues = num_top + num_bottom; hints->num_blue_zones = ( num_blues ) >> 1; - /**********************************************************************/ - /* */ - /* BUILD BLUE SNAP ZONES FROM THE LOCAL BLUES ARRAYS */ - /* */ - /* */ + /***********************************************************************/ + /* */ + /* build blue snap zones from the local blues arrays */ + /* */ scale = size->root.metrics.y_scale; zone = hints->blue_zones; - threshold = ONE_PIXEL/4; /* 0.25 pixels */ + threshold = ONE_PIXEL / 4; /* 0.25 pixels */ - for ( n = 0; n < num_blues; n += 2, zone ++ ) + for ( n = 0; n < num_blues; n += 2, zone++ ) { - is_bottom = ( n < num_bottom ? 1 : 0 ); + is_bottom = n < num_bottom ? 1 : 0; - orus = blues[n+is_bottom]; /* get alignement coordinate */ - pix = SCALE( orus ); /* scale it */ + orus = blues[n + is_bottom]; /* get alignement coordinate */ + pix = SCALE( orus ); /* scale it */ - min = SCALE( blues[ n ] - priv->blue_fuzz ); - max = SCALE( blues[n+1] + priv->blue_fuzz ); + min = SCALE( blues[n ] - priv->blue_fuzz ); + max = SCALE( blues[n + 1] + priv->blue_fuzz ); - if ( min > pix - threshold ) min = pix - threshold; - if ( max < pix + threshold ) max = pix + threshold; + if ( min > pix - threshold ) + min = pix - threshold; + if ( max < pix + threshold ) + max = pix + threshold; zone->orus = orus; zone->pix = pix; @@ -201,26 +212,24 @@ /* adjust edges in case of overlap */ zone = hints->blue_zones; - for ( n = 0; n < num_blues-2; n += 2, zone ++ ) + for ( n = 0; n < num_blues - 2; n += 2, zone++ ) { - if ( n != num_bottom-2 && + if ( n != num_bottom - 2 && zone[0].max > zone[1].min ) - { - zone[0].max = zone[1].min = (zone[0].pix+zone[1].pix)/2; - } + zone[0].max = zone[1].min = ( zone[0].pix + zone[1].pix ) / 2; } - - /* Compare the current pixel size with the BlueScale value */ - /* to know wether to supress overshoots.. */ + /* compare the current pixel size with the BlueScale value */ + /* to know whether to supress overshoots */ hints->supress_overshoots = - ( size->root.metrics.y_ppem < FT_MulFix(1000,priv->blue_scale) ); + size->root.metrics.y_ppem < FT_MulFix( 1000, priv->blue_scale ); - /* Now print the new blue values in tracing mode */ #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE2(( "Blue Zones for size object at $%08lx :\n", (long)size )); + /* now print the new blue values in tracing mode */ + + FT_TRACE2(( "Blue Zones for size object at $%08lx:\n", (long)size )); FT_TRACE2(( " orus pix min max\n" )); FT_TRACE2(( "-------------------------------\n" )); @@ -228,14 +237,14 @@ for ( n = 0; n < hints->num_blue_zones; n++ ) { FT_TRACE2(( " %3d %.2f %.2f %.2f\n", - zone->orus, - zone->pix/64.0, - zone->min/64.0, - zone->max/64.0 )); + zone->orus, + zone->pix / 64.0, + zone->min / 64.0, + zone->max / 64.0 )); zone++; } - FT_TRACE2(( "\nOver shoots are %s\n\n", - hints->supress_overshoots ? "supressed" : "active" )); + FT_TRACE2(( "\nOvershoots are %s\n\n", + hints->supress_overshoots ? "supressed" : "active" )); #endif /* DEBUG_LEVEL_TRACE */ @@ -243,52 +252,50 @@ } - -/************************************************************************ - * - * - * t1_set_snap_zones - * - * - * This function set a size object's stem snap zones. - * - * - * size :: handle to target size object - * - * - * Error code. 0 means success - * - * - * This function performs the following : - * - * 1. It reads and scales the stem snap widths from the parent face - * - * 2. A "snap zone" is computed for each snap width, by "growing" - * it with a threshold of a 1/2 pixel. Overlapping is avoided - * through proper edge adjustment. - * - * 3. Each width whose zone contain the scaled standard set width - * is removed from the table - * - * 4. Finally, the standard set width is scaled, and its correponding - * "snap zone" is inserted into the sorted snap zones table - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* t1_set_snap_zones */ + /* */ + /* */ + /* This function set a size object's stem snap zones. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function performs the following: */ + /* */ + /* 1. It reads and scales the stem snap widths from the parent face. */ + /* */ + /* 2. A `snap zone' is computed for each snap width, by `growing' it */ + /* with a threshold of 1/2 pixel. Overlapping is avoided through */ + /* proper edge adjustment. */ + /* */ + /* 3. Each width whose zone contain the scaled standard set width is */ + /* removed from the table. */ + /* */ + /* 4. Finally, the standard set width is scaled, and its correponding */ + /* `snap zone' is inserted into the sorted snap zones table. */ + /* */ static FT_Error t1_set_snap_zones( T1_Size size ) { - FT_Int n, direction, n_zones, num_zones; - T1_Snap_Zone* zone; - T1_Snap_Zone* base_zone; - FT_Short* orgs; - FT_Pos standard_width; - FT_Fixed scale; + FT_Int n, direction, n_zones, num_zones; + T1_Snap_Zone* zone; + T1_Snap_Zone* base_zone; + FT_Short* orgs; + FT_Pos standard_width; + FT_Fixed scale; - T1_Face face = (T1_Face)size->root.face; - T1_Private* priv = &face->type1.private_dict; + T1_Face face = (T1_Face)size->root.face; + T1_Private* priv = &face->type1.private_dict; T1_Size_Hints* hints = size->hints; + /* start with horizontal snap zones */ direction = 0; standard_width = priv->standard_width[0]; @@ -297,24 +304,26 @@ orgs = priv->snap_widths; scale = size->root.metrics.x_scale; - while (direction < 2) + while ( direction < 2 ) { - /*****************************************************************/ - /* */ - /* Read and scale stem snap widths table from the physical */ - /* font record. */ - /* */ + /*********************************************************************/ + /* */ + /* Read and scale stem snap widths table from the physical font */ + /* record. */ + /* */ + FT_Pos prev, orus, pix, min, max, threshold; - threshold = ONE_PIXEL/4; + + threshold = ONE_PIXEL / 4; zone = base_zone; if ( n_zones > 0 ) { orus = *orgs++; pix = SCALE( orus ); - min = pix-threshold; - max = pix+threshold; + min = pix - threshold; + max = pix + threshold; zone->orus = orus; zone->pix = pix; @@ -326,12 +335,12 @@ orus = *orgs++; pix = SCALE( orus ); - if ( pix-prev < 2*threshold ) + if ( pix - prev < 2 * threshold ) { - min = max = (pix+prev)/2; + min = max = ( pix + prev ) / 2; } else - min = pix-threshold; + min = pix - threshold; zone->max = max; zone++; @@ -339,49 +348,52 @@ zone->pix = pix; zone->min = min; - max = pix+threshold; + max = pix + threshold; prev = pix; } zone->max = max; } - /* print the scaled stem snap values in tracing modes */ #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE2(( "Set_Snap_Zones : first %s pass\n", - direction ? "vertical" : "horizontal" )); + /* print the scaled stem snap values in tracing mode */ - FT_TRACE2(( "Scaled original stem snap zones :\n" )); + FT_TRACE2(( "Set_Snap_Zones: first %s pass\n", + direction ? "vertical" : "horizontal" )); + + FT_TRACE2(( "Scaled original stem snap zones:\n" )); FT_TRACE2(( " orus pix min max\n" )); FT_TRACE2(( "-----------------------------\n" )); zone = base_zone; for ( n = 0; n < n_zones; n++, zone++ ) FT_TRACE2(( " %3d %.2f %.2f %.2f\n", - zone->orus, - zone->pix/64.0, - zone->min/64.0, - zone->max/64.0 )); + zone->orus, + zone->pix / 64.0, + zone->min / 64.0, + zone->max / 64.0 )); FT_TRACE2(( "\n" )); FT_TRACE2(( "Standard width = %d\n", standard_width )); -#endif - /*****************************************************************/ - /* */ - /* Now, each snap width which is in the range of the standard */ - /* set width will be removed from the list.. */ - /* */ +#endif /* FT_DEBUG_LEVEL_TRACE */ + + /*********************************************************************/ + /* */ + /* Now, each snap width which is in the range of the standard set */ + /* width will be removed from the list. */ + /* */ if ( standard_width > 0 ) { T1_Snap_Zone* parent; FT_Pos std_pix, std_min, std_max; + std_pix = SCALE( standard_width ); - std_min = std_pix-threshold; - std_max = std_pix+threshold; + std_min = std_pix - threshold; + std_max = std_pix + threshold; num_zones = 0; zone = base_zone; @@ -392,8 +404,10 @@ if ( zone->pix >= std_min && zone->pix <= std_max ) { /* this zone must be removed from the list */ - if ( std_min > zone->min ) std_min = zone->min; - if ( std_max < zone->max ) std_max = zone->max; + if ( std_min > zone->min ) + std_min = zone->min; + if ( std_max < zone->max ) + std_max = zone->max; } else { @@ -403,21 +417,23 @@ zone++; } - /**********************************************/ - /* Now, insert the standard width zone */ + /*******************************************************************/ + /* */ + /* Now, insert the standard width zone */ + /* */ - zone = base_zone+num_zones; + zone = base_zone + num_zones; while ( zone > base_zone && zone[-1].pix > std_max ) { zone[0] = zone[-1]; - zone --; + zone--; } /* check border zones */ if ( zone > base_zone && zone[-1].max > std_min ) zone[-1].max = std_min; - if ( zone < base_zone+num_zones && zone[1].min < std_max ) + if ( zone < base_zone + num_zones && zone[1].min < std_max ) zone[1].min = std_max; zone->orus = standard_width; @@ -431,30 +447,34 @@ num_zones = n_zones; /* save total number of stem snaps now */ - if (direction) hints->num_snap_heights = num_zones; - else hints->num_snap_widths = num_zones; + if ( direction ) + hints->num_snap_heights = num_zones; + else + hints->num_snap_widths = num_zones; - /* print the scaled stem snap values in tracing modes */ #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE2(( "Set_Snap_Zones : second %s pass\n", - direction ? "vertical" : "horizontal" )); + /* print the scaled stem snap values in tracing mode */ - FT_TRACE2(( "Scaled clipped stem snap zones :\n" )); + FT_TRACE2(( "Set_Snap_Zones: second %s pass\n", + direction ? "vertical" : "horizontal" )); + + FT_TRACE2(( "Scaled clipped stem snap zones:\n" )); FT_TRACE2(( " orus pix min max\n" )); FT_TRACE2(( "-----------------------------\n" )); zone = base_zone; for ( n = 0; n < num_zones; n++, zone++ ) FT_TRACE2(( " %3d %.2f %.2f %.2f\n", - zone->orus, - zone->pix/64.0, - zone->min/64.0, - zone->max/64.0 )); + zone->orus, + zone->pix / 64.0, + zone->min / 64.0, + zone->max / 64.0 )); FT_TRACE2(( "\n" )); FT_TRACE2(( "Standard width = %d\n", standard_width )); -#endif + +#endif /* FT_DEBUG_LEVEL_TRACE */ /* continue with vertical snap zone */ direction++; @@ -469,153 +489,145 @@ } -/************************************************************************ - * - * - * T1_New_Size_Hinter - * - * - * Allocates a new hinter structure for a given size object - * - * - * size :: handle to target size object - * - * - * Error code. 0 means success - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_New_Size_Hinter */ + /* */ + /* */ + /* Allocates a new hinter structure for a given size object. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType Error code. 0 means success. */ + /* */ LOCAL_FUNC FT_Error T1_New_Size_Hinter( T1_Size size ) { FT_Memory memory = size->root.face->memory; - return MEM_Alloc( size->hints, sizeof(*size->hints) ); + + return MEM_Alloc( size->hints, sizeof ( *size->hints ) ); } -/************************************************************************ - * - * - * T1_Done_Size_Hinter - * - * - * Releases a given size object's hinter structure - * - * - * size :: handle to target size object - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Done_Size_Hinter */ + /* */ + /* */ + /* Releases a given size object's hinter structure. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ LOCAL_FUNC - void T1_Done_Size_Hinter( T1_Size size ) + void T1_Done_Size_Hinter( T1_Size size ) { FT_Memory memory = size->root.face->memory; + FREE( size->hints ); } - -/************************************************************************ - * - * - * T1_Reset_Size_Hinter - * - * - * Recomputes hinting information when a given size object has - * changed its resolutions/char sizes/pixel sizes - * - * - * size :: handle to size object - * - * - * Error code. 0 means success - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Reset_Size_Hinter */ + /* */ + /* */ + /* Recomputes hinting information when a given size object has */ + /* changed its resolutions/char sizes/pixel sizes. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ LOCAL_FUNC FT_Error T1_Reset_Size_Hinter( T1_Size size ) { - return t1_set_blue_zones(size) || t1_set_snap_zones(size); + return t1_set_blue_zones( size ) || t1_set_snap_zones( size ); } - -/************************************************************************ - * - * - * T1_New_Glyph_Hinter - * - * - * Allocates a new hinter structure for a given glyph slot - * - * - * glyph :: handle to target glyph slot - * - * - * Error code. 0 means success - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_New_Glyph_Hinter */ + /* */ + /* */ + /* Allocates a new hinter structure for a given glyph slot. */ + /* */ + /* */ + /* glyph :: A handle to the target glyph slot. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ LOCAL_FUNC FT_Error T1_New_Glyph_Hinter( T1_GlyphSlot glyph ) { FT_Memory memory = glyph->root.face->memory; - return MEM_Alloc( glyph->hints, sizeof(*glyph->hints) ); + + return MEM_Alloc( glyph->hints, sizeof ( *glyph->hints ) ); } -/************************************************************************ - * - * - * T1_Done_Glyph_Hinter - * - * - * Releases a given glyph slot's hinter structure - * - * - * glyph :: handle to glyph slot - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Done_Glyph_Hinter */ + /* */ + /* */ + /* Releases a given glyph slot's hinter structure. */ + /* */ + /* */ + /* glyph :: A handle to the glyph slot. */ + /* */ LOCAL_FUNC void T1_Done_Glyph_Hinter( T1_GlyphSlot glyph ) { FT_Memory memory = glyph->root.face->memory; + FREE( glyph->hints ); } + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** **********/ + /********** HINTED GLYPH LOADER **********/ + /********** **********/ + /********** The following code is in charge of the first **********/ + /********** and second pass when loading a single outline **********/ + /********** **********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /********** *********/ - /********** *********/ - /********** HINTED GLYPH LOADER *********/ - /********** *********/ - /********** The following code is in charge of the first *********/ - /********** and second pass when loading a single outline *********/ - /********** *********/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ static - FT_Error t1_hinter_ignore( void ) + FT_Error t1_hinter_ignore( void ) { - /* do nothing, used for "dotsection" which is unsupported for now */ + /* do nothing, used for `dotsection' which is unsupported for now */ return 0; } + static - FT_Error t1_hinter_stem( T1_Builder* builder, - FT_Pos pos, - FT_Int width, - FT_Bool vertical ) + FT_Error t1_hinter_stem( T1_Builder* builder, + FT_Pos pos, + FT_Int width, + FT_Bool vertical ) { T1_Stem_Table* stem_table; T1_Stem_Hint* stems; @@ -624,6 +636,7 @@ FT_Bool new_stem; T1_Glyph_Hints* hinter = builder->glyph->hints; + /* select the appropriate stem array */ stem_table = vertical ? &hinter->vert_stems : &hinter->hori_stems; stems = stem_table->stems; @@ -638,15 +651,15 @@ max = min + width; else { - /* a negative width indicates a "ghost" stem */ + /* a negative width indicates a `ghost' stem */ if ( width == -21 ) min += width; max = min; } - /* now scan the array. If we find a stem with the same borders */ - /* simply activate it.. */ + /* now scan the array. If we find a stem with the same borders */ + /* simply activate it. */ cur_stem = stems; new_stem = 1; @@ -656,10 +669,10 @@ cur_stem->max_edge.orus == max ) { /* This stem is already in the table, simply activate it */ - if ( (cur_stem->hint_flags & T1_HINT_FLAG_ACTIVE) == 0) + if ( ( cur_stem->hint_flags & T1_HINT_FLAG_ACTIVE ) == 0 ) { - cur_stem->hint_flags |= T1_HINT_FLAG_ACTIVE; - stem_table->num_active ++; + cur_stem->hint_flags |= T1_HINT_FLAG_ACTIVE; + stem_table->num_active++; } new_stem = 0; break; @@ -667,16 +680,16 @@ } /* add a new stem to the array when necessary */ - if (new_stem) + if ( new_stem ) { - if (cur_stem >= stems + T1_HINTER_MAX_EDGES) + if ( cur_stem >= stems + T1_HINTER_MAX_EDGES ) { - FT_ERROR(( "T1.Hinter : too many stems in glyph charstring\n" )); + FT_ERROR(( "t1_hinter_stem: too many stems in glyph charstring\n" )); return T1_Err_Syntax_Error; } /* on the first pass, we record the stem, otherwise, this is */ - /* a bug in the glyph loader !! */ + /* a bug in the glyph loader! */ if ( builder->pass == 0 ) { cur_stem->min_edge.orus = min; @@ -688,7 +701,7 @@ } else { - FT_ERROR(( "T1.Hinter : fatal glyph loader bug - pass2-stem\n" )); + FT_ERROR(( "t1_hinter_stem: fatal glyph loader bug - pass2-stem\n" )); return T1_Err_Syntax_Error; } } @@ -698,16 +711,16 @@ static - FT_Error t1_hinter_stem3( T1_Builder* builder, - FT_Pos pos0, - FT_Int width0, - FT_Pos pos1, - FT_Int width1, - FT_Pos pos2, - FT_Int width2, - FT_Bool vertical ) + FT_Error t1_hinter_stem3( T1_Builder* builder, + FT_Pos pos0, + FT_Int width0, + FT_Pos pos1, + FT_Int width1, + FT_Pos pos2, + FT_Int width2, + FT_Bool vertical ) { - /* For now, don't be elitist and simply call "stem" 3 times */ + /* For now, simply call `stem' 3 times */ return t1_hinter_stem( builder, pos0, width0, vertical ) || t1_hinter_stem( builder, pos1, width1, vertical ) || t1_hinter_stem( builder, pos2, width2, vertical ); @@ -721,9 +734,10 @@ T1_Stem_Table* stem_table; T1_Glyph_Hints* hinter = builder->glyph->hints; - /* if we're in the second pass of glyph hinting, we must */ - /* call the function T1_Hint_Points on the builder in order */ - /* to force the fit the latest points to the pixel grid */ + + /* If we are in the second pass of glyph hinting, we must */ + /* call the function T1_Hint_Points() on the builder in order */ + /* to force the fit the latest points to the pixel grid. */ if ( builder->pass == 1 ) T1_Hint_Points( builder ); @@ -735,6 +749,7 @@ T1_Stem_Hint* cur = stem_table->stems; T1_Stem_Hint* limit = cur + stem_table->num_stems; + for ( ; cur < limit; cur++ ) cur->hint_flags &= ~T1_HINT_FLAG_ACTIVE; @@ -749,41 +764,40 @@ LOCAL_FUNC const T1_Hinter_Funcs t1_hinter_funcs = { - (T1_Hinter_ChangeHints) t1_hinter_changehints, - (T1_Hinter_DotSection) t1_hinter_ignore, - (T1_Hinter_Stem) t1_hinter_stem, - (T1_Hinter_Stem3) t1_hinter_stem3 + (T1_Hinter_ChangeHints)t1_hinter_changehints, + (T1_Hinter_DotSection) t1_hinter_ignore, + (T1_Hinter_Stem) t1_hinter_stem, + (T1_Hinter_Stem3) t1_hinter_stem3 }; - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ - /********** *********/ - /********** *********/ - /********** STEM HINTS MANAGEMENT *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the placement of each scaled stem hint.. *********/ - /********** *********/ - /**********************************************************************/ - /**********************************************************************/ - /**********************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** STEM HINTS MANAGEMENT *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the placement of each scaled stem hint. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ -/************************************************************************ - * - * - * t1_sort_hints - * - * - * Sort the list of active stems in increasing order, through - * the "sort" indexing table - * - * - * table :: a stem hints table - * - ************************************************************************/ + /*************************************************************************/ + /* */ + /* */ + /* t1_sort_hints */ + /* */ + /* */ + /* Sorta the list of active stems in increasing order, through the */ + /* `sort' indexing table. */ + /* */ + /* */ + /* table :: A stem hints table. */ + /* */ static void t1_sort_hints( T1_Stem_Table* table ) { @@ -793,6 +807,7 @@ T1_Stem_Hint* stems = table->stems; FT_Int n; + /* record active stems in sort table */ for ( n = 0; n < num_stems; n++ ) { @@ -800,64 +815,65 @@ sort[num_active++] = n; } - /* now sort the indices. There are usually very few stems, */ - /* and they are pre-sorted in 90% cases, so we choose a */ - /* simple bubble sort (quicksort would be slower).. */ + /* now sort the indices. There are usually very few stems, */ + /* and they are pre-sorted in 90% cases, so we choose a */ + /* simple bubble sort (quicksort would be slower). */ for ( n = 1; n < num_active; n++ ) { - FT_Int p = n-1; - T1_Stem_Hint* cur = stems + sort[n]; + FT_Int p = n - 1; + T1_Stem_Hint* cur = stems + sort[n]; + do { FT_Int swap; T1_Stem_Hint* prev = stems + sort[p]; - /* note that by definition, the active stems cannot overlap */ - /* so we simply compare their "min" to sort them.. */ - /* (we could compare their max, this wouldn't change anything) */ + + /* note that by definition, the active stems cannot overlap */ + /* so we simply compare their `min' to sort them (we could compare */ + /* their max values also; this wouldn't change anything). */ if ( prev->min_edge.orus <= cur->min_edge.orus ) break; /* swap elements */ - swap = sort[ p ]; - sort[ p ] = sort[p+1]; - sort[p+1] = swap; + swap = sort[p ]; + sort[p ] = sort[p + 1]; + sort[p + 1] = swap; p--; - } - while ( p >= 0 ); + } while ( p >= 0 ); } table->num_active = num_active; } -/************************************************************************ - * - * - * t1_hint_horizontal_stems - * - * - * Compute the location of each scaled horizontal stem hint. - * This takes care of the blue zones and the horizontal stem - * snap table - * - * - * table :: the horizontal stem hints table - * hints :: the current size's hint structure - * blueShift :: the value of the /BlueShift as taken from the - * face object. - * scale :: the 16.16 scale used to convert outline - * units to 26.6 pixels - * - * - * For now, all stems are hinted independently from each other. - * It might be necessary, for better performance, to introduce - * the notion of "controlled" hints describing things like - * counter-stems, stem3 as well as overlapping stems control. - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* t1_hint_horizontal_stems */ + /* */ + /* */ + /* Computes the location of each scaled horizontal stem hint. This */ + /* takes care of the blue zones and the horizontal stem snap table. */ + /* */ + /* */ + /* table :: The horizontal stem hints table. */ + /* */ + /* hints :: The current size's hint structure. */ + /* */ + /* blueShift :: The value of the /BlueShift as taken from the face */ + /* object. */ + /* */ + /* scale :: The 16.16 scale used to convert outline units to */ + /* 26.6 pixels. */ + /* */ + /* */ + /* For now, all stems are hinted independently from each other. It */ + /* might be necessary, for better performance, to introduce the */ + /* notion of `controlled' hints describing things like counter-stems, */ + /* stem3, as well as overlapping stems control. */ + /* */ static void t1_hint_horizontal_stems( T1_Stem_Table* table, T1_Size_Hints* hints, @@ -867,8 +883,9 @@ T1_Stem_Hint* stem = table->stems; T1_Stem_Hint* limit = stem + table->num_stems; + /* first of all, scale the blueShift */ - blueShift = SCALE(blueShift); + blueShift = SCALE( blueShift ); /* then scan the horizontal stem table */ for ( ; stem < limit; stem++ ) @@ -884,56 +901,71 @@ FT_Pos top = top_pix; FT_Int align = T1_ALIGN_NONE; - /******************************************************************/ - /* Snap pixel width if in stem snap range */ + + /*********************************************************************/ + /* */ + /* Snap pixel width if in stem snap range */ + /* */ + { T1_Snap_Zone* zone = hints->snap_heights; T1_Snap_Zone* zone_limit = zone + hints->num_snap_heights; - FT_Pos best_dist = 32000; - T1_Snap_Zone* best_zone = 0; + FT_Pos best_dist = 32000; + T1_Snap_Zone* best_zone = 0; + for ( ; zone < zone_limit; zone++ ) { FT_Pos dist; - dist = width_pix - zone->min; if (dist < 0) dist = -dist; - if (dist < best_dist) + + dist = width_pix - zone->min; + if ( dist < 0 ) + dist = -dist; + if ( dist < best_dist ) { best_zone = zone; best_dist = dist; } } - if (best_zone) + if ( best_zone ) { - if (width_pix > best_zone->pix) + if ( width_pix > best_zone->pix ) { width_pix -= 0x20; - if (width_pix < best_zone->pix) + if ( width_pix < best_zone->pix ) width_pix = best_zone->pix; } else { width_pix += 0x20; - if (width_pix > best_zone->pix) + if ( width_pix > best_zone->pix ) width_pix = best_zone->pix; } } } - /******************************************************************/ - /* round width - minimum 1 pixel if this isn't a ghost stem */ + /*********************************************************************/ + /* */ + /* round width - minimum 1 pixel if this isn't a ghost stem */ + /* */ + if ( width_pix > 0 ) - width_pix = ( width_pix < ONE_PIXEL ? ONE_PIXEL : ROUND(width_pix) ); + width_pix = width_pix < ONE_PIXEL ? ONE_PIXEL : ROUND( width_pix ); - /******************************************************************/ - /* Now check for bottom blue zones alignement */ + /*********************************************************************/ + /* */ + /* Now check for bottom blue zones alignement */ + /* */ + { FT_Int num_blues = hints->num_bottom_zones; T1_Snap_Zone* blue = hints->blue_zones; T1_Snap_Zone* blue_limit = blue + num_blues; + for ( ; blue < blue_limit; blue++ ) { if ( bottom_pix < blue->min ) @@ -944,21 +976,24 @@ align = T1_ALIGN_BOTTOM; bottom = ROUND( blue->pix ); - /* implements blue shift */ - if (!hints->supress_overshoots) + /* implement blue shift */ + if ( !hints->supress_overshoots ) { FT_Pos delta = blue->pix - bottom_pix; - delta = ( delta < blueShift ? 0 : ROUND( delta ) ); + + delta = delta < blueShift ? 0 : ROUND( delta ); bottom -= delta; } } } } + /*********************************************************************/ + /* */ + /* check for top blue zones alignement */ + /* */ - /******************************************************************/ - /* Check for top blue zones alignement */ { FT_Int num_blues = hints->num_blue_zones - hints->num_bottom_zones; @@ -968,6 +1003,7 @@ T1_Snap_Zone* blue_limit = blue + num_blues; + for ( ; blue < blue_limit; blue++ ) { if ( top_pix < blue->min ) @@ -975,49 +1011,51 @@ if ( top_pix <= blue->max ) { - align |= T1_ALIGN_TOP; - top = ROUND( blue->pix ); + align |= T1_ALIGN_TOP; + top = ROUND( blue->pix ); - /* implements blue shift */ - if (!hints->supress_overshoots) + /* implement blue shift */ + if ( !hints->supress_overshoots ) { FT_Pos delta = top - blue->pix; - delta = ( delta < blueShift ? 0 : ROUND( delta ) ); + + delta = delta < blueShift ? 0 : ROUND( delta ); top += delta; } } } } + /*********************************************************************/ + /* */ + /* compute the hinted stem position, according to its alignment */ + /* */ - /******************************************************************/ - /* compute the hinted stem position, according to its alignment */ - switch (align) + switch ( align ) { - case T1_ALIGN_BOTTOM: /* bottom zone alignement */ - bottom_pix = bottom; - top_pix = bottom + width_pix; - break; + case T1_ALIGN_BOTTOM: /* bottom zone alignment */ + bottom_pix = bottom; + top_pix = bottom + width_pix; + break; - case T1_ALIGN_TOP: /* top zone alignement */ - top_pix = top; - bottom_pix = top - width_pix; + case T1_ALIGN_TOP: /* top zone alignment */ + top_pix = top; + bottom_pix = top - width_pix; + break; - break; + case T1_ALIGN_BOTH: /* bottom+top zone alignment */ + bottom_pix = bottom; + top_pix = top; + break; - case T1_ALIGN_BOTH: /* bottom+top zone alignement */ - bottom_pix = bottom; - top_pix = top; - break; + default: /* no alignment */ - default: /* no alignement */ + /* XXXX TODO: Add management of controlled stems */ + bottom = ( SCALE( bottom_orus + top_orus ) - width_pix ) / 2; - /* XXXX : TODO : Add management of controlled stems */ - bottom = ( SCALE(bottom_orus+top_orus) - width_pix )/2; - - bottom_pix = ROUND(bottom); - top_pix = bottom_pix + width_pix; + bottom_pix = ROUND( bottom ); + top_pix = bottom_pix + width_pix; } stem->min_edge.pix = bottom_pix; @@ -1026,33 +1064,27 @@ } - - -/************************************************************************ - * - * - * t1_hint_vertical_stems - * - * - * Compute the location of each scaled vertical stem hint. - * This takes care of the vertical stem snap table - * - * - * table :: the vertical stem hints table - * hints :: the current size's hint structure - * scale :: the 16.16 scale used to convert outline - * units to 26.6 pixels - * - * - * For now, all stems are hinted independently from each other. - * It might be necessary, for better performance, to introduce - * the notion of "controlled" hints describing things like - * counter-stems, stem3 as well as overlapping stems control. - * - ************************************************************************/ - - /* compute the location of each scaled vertical stem hint. */ - /* Take care of blue zones and stem snap table */ + /*************************************************************************/ + /* */ + /* */ + /* t1_hint_vertical_stems */ + /* */ + /* */ + /* Computes the location of each scaled vertical stem hint. This */ + /* takes care of the vertical stem snap table. */ + /* */ + /* */ + /* table :: The vertical stem hints table. */ + /* hints :: The current size's hint structure. */ + /* scale :: The 16.16 scale used to convert outline units to */ + /* 26.6 pixels. */ + /* */ + /* */ + /* For now, all stems are hinted independently from each other. It */ + /* might be necessary, for better performance, to introduce the */ + /* notion of `controlled' hints describing things like counter-stems, */ + /* stem3 as well as overlapping stems control. */ + /* */ static void t1_hint_vertical_stems( T1_Stem_Table* table, T1_Size_Hints* hints, @@ -1061,45 +1093,51 @@ T1_Stem_Hint* stem = table->stems; T1_Stem_Hint* limit = stem + table->num_stems; + for ( ; stem < limit; stem++ ) { FT_Pos stem_left = stem->min_edge.orus; FT_Pos stem_right = stem->max_edge.orus; FT_Pos width_pix, left; + width_pix = SCALE( stem_right - stem_left ); /* Snap pixel width if in stem snap range */ { T1_Snap_Zone* zone = hints->snap_heights; T1_Snap_Zone* zone_limit = zone + hints->num_snap_heights; - FT_Pos best_dist = 32000; - T1_Snap_Zone* best_zone = 0; + FT_Pos best_dist = 32000; + T1_Snap_Zone* best_zone = 0; + for ( ; zone < zone_limit; zone++ ) { FT_Pos dist; - dist = width_pix - zone->min; if (dist < 0) dist = -dist; - if (dist < best_dist) + + dist = width_pix - zone->min; + if ( dist < 0 ) + dist = -dist; + if ( dist < best_dist ) { best_zone = zone; best_dist = dist; } } - if (best_zone) + if ( best_zone ) { - if (width_pix > best_zone->pix) + if ( width_pix > best_zone->pix ) { width_pix -= 0x20; - if (width_pix < best_zone->pix) + if ( width_pix < best_zone->pix ) width_pix = best_zone->pix; } else { width_pix += 0x20; - if (width_pix > best_zone->pix) + if ( width_pix > best_zone->pix ) width_pix = best_zone->pix; } } @@ -1107,49 +1145,45 @@ /* round width - minimum 1 pixel if this isn't a ghost stem */ if ( width_pix > 0 ) - width_pix = ( width_pix < ONE_PIXEL ? ONE_PIXEL : - ROUND( width_pix ) ); + width_pix = width_pix < ONE_PIXEL ? ONE_PIXEL + : ROUND( width_pix ); /* now place the snapped and rounded stem */ - /* XXXX : TODO : implement controlled stems for the overlapping */ - /* cases.. */ + /* XXXX TODO: implement controlled stems for the overlapping */ + /* cases */ - left = ( SCALE(stem_left+stem_right) - width_pix )/2; + left = ( SCALE( stem_left + stem_right ) - width_pix ) / 2; - stem->min_edge.pix = ROUND(left); + stem->min_edge.pix = ROUND( left ); stem->max_edge.pix = stem->min_edge.pix + width_pix; } } - - -/************************************************************************ - * - * - * t1_hint_point - * - * - * Grid-fit a coordinate with regards to a given stem hints table - * - * - * table :: the source stem hints table - * coord :: original coordinate, expressed in font units - * scale :: the 16.16 scale used to convert font units into - * 26.6 pixels - * - * - * the hinted/scaled value in 26.6 pixels - * - * - * For now, all stems are hinted independently from each other. - * It might be necessary, for better performance, to introduce - * the notion of "controlled" hints describing things like - * counter-stems, stem3 as well as overlapping stems control. - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* t1_hint_point */ + /* */ + /* */ + /* Grid-fit a coordinate with regards to a given stem hints table. */ + /* */ + /* */ + /* table :: The source stem hints table. */ + /* coord :: The original coordinate, expressed in font units. */ + /* scale :: The 16.16 scale used to convert font units into */ + /* 26.6 pixels. */ + /* */ + /* */ + /* The hinted/scaled value in 26.6 pixels. */ + /* */ + /* */ + /* For now, all stems are hinted independently from each other. It */ + /* might be necessary, for better performance, to introduce the */ + /* notion of `controlled' hints describing things like counter-stems, */ + /* stem3 as well as overlapping stems control. */ + /* */ static FT_Pos t1_hint_point( T1_Stem_Table* table, FT_Pos coord, @@ -1163,9 +1197,10 @@ T1_Edge* max; FT_Pos delta; + /* only hint when there is at least one stem defined */ - if (num_active <= 0) - return SCALE(coord); + if ( num_active <= 0 ) + return SCALE( coord ); /* scan the stem table to determine placement of coordinate */ /* relative to the list of sorted and stems */ @@ -1173,74 +1208,70 @@ { cur = table->stems + table->sort[n]; - /* is it on the left of the current edge ? */ + /* is it on the left of the current edge? */ delta = cur->min_edge.orus - coord; - if ( delta == 0 ) return cur->min_edge.pix; + if ( delta == 0 ) + return cur->min_edge.pix; - if (delta > 0) + if ( delta > 0 ) { /* if this is the left of the first edge, simply shift */ - if (!prev) return cur->min_edge.pix - SCALE(delta); + if ( !prev ) + return cur->min_edge.pix - SCALE( delta ); /* otherwise, interpolate between the maximum of the */ /* previous stem, and the minimum of the current one */ min = &prev->max_edge; max = &cur->min_edge; + goto Interpolate; } - /* is it within the current edge ? */ + /* is it within the current edge? */ delta = cur->max_edge.orus - coord; - if ( delta == 0 ) return cur->max_edge.pix; + if ( delta == 0 ) + return cur->max_edge.pix; - if (delta > 0) + if ( delta > 0 ) { /* interpolate within the stem */ min = &cur->min_edge; max = &cur->max_edge; + goto Interpolate; } } /* apparently, this coordinate is on the right of the last stem */ delta = coord - cur->max_edge.orus; - return cur->max_edge.pix + SCALE(delta); + return cur->max_edge.pix + SCALE( delta ); Interpolate: - return min->pix + - FT_MulDiv( coord - min->orus, - max->pix - min->pix, - max->orus - min->orus ); + return min->pix + FT_MulDiv( coord - min->orus, + max->pix - min->pix, + max->orus - min->orus ); } - - - - #if 1 -/************************************************************************ - * - * - * T1_Hint_Points - * - * - * this function grid-fits several points in a given Type 1 builder - * at once. - * - * - * builder :: handle to target Type 1 builder - * first :: first point to hint in builder's current outline - * last :: last point to hint in builder's current outline - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Hint_Points */ + /* */ + /* */ + /* This function grid-fits several points in a given Type 1 builder */ + /* at once. */ + /* */ + /* */ + /* builder :: A handle to target Type 1 builder. */ + /* */ LOCAL_FUNC void T1_Hint_Points( T1_Builder* builder ) { FT_Int first = builder->hint_point; - FT_Int last = builder->current->n_points-1; + FT_Int last = builder->current->n_points - 1; T1_Size size = builder->size; FT_Fixed scale_x = size->root.metrics.x_scale; @@ -1253,6 +1284,7 @@ FT_Vector* cur = builder->current->points + first; FT_Vector* limit = cur + last - first + 1; + /* first of all, sort the active stem hints */ t1_sort_hints( hori_stems ); t1_sort_hints( vert_stems ); @@ -1267,21 +1299,19 @@ } -/************************************************************************ - * - * - * T1_Hint_Stems - * - * - * This function is used to compute the location of each stem hint - * between the first and second passes of the glyph loader on the - * charstring. - * - * - * builder :: handle to target builder - * - ************************************************************************/ - + /*************************************************************************/ + /* */ + /* */ + /* T1_Hint_Stems */ + /* */ + /* */ + /* This function is used to compute the location of each stem hint */ + /* between the first and second passes of the glyph loader on the */ + /* charstring. */ + /* */ + /* */ + /* builder :: A handle to the target builder. */ + /* */ LOCAL_FUNC void T1_Hint_Stems( T1_Builder* builder ) { @@ -1292,6 +1322,7 @@ FT_Fixed scale_x = size->root.metrics.x_scale; FT_Fixed scale_y = size->root.metrics.y_scale; + t1_hint_horizontal_stems( &hints->hori_stems, builder->size->hints, priv->blue_shift, @@ -1302,4 +1333,7 @@ scale_x ); } -#endif +#endif /* 1 */ + + +/* END */