sync with OpenBSD -current

This commit is contained in:
purplerain 2024-08-06 22:23:11 +00:00
parent acb2a22980
commit 455fea1627
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
229 changed files with 25075 additions and 13981 deletions

View file

@ -1,21 +1,21 @@
# $OpenBSD: 3RDPARTY,v 1.429 2024/07/19 19:00:02 matthieu Exp $
# $OpenBSD: 3RDPARTY,v 1.432 2024/08/04 18:22:48 matthieu Exp $
#
Package: Freetype
Version: 2.13.0
Version: 2.13.2
Current Vers: 2.13.2
Maintainer: Freetype.org
Archive Site: http://download.savannah.gnu.org/releases/freetype/
Package: xterm
Version: 378
Version: 393
Current Vers: 393
Maintainer: Thomas E. Dickey
Archive Site: http://invisible-island.net/xterm/xterm.html
Package: Mesa
Version 23.3.6
Current Vers: 24.1.4
Current Vers: 24.1.5
Maintainer: Brian Paul
Archive Site: https://archive.mesa3d.org/

10
MODULES
View file

@ -1,4 +1,4 @@
# $OpenBSD: MODULES,v 1.525 2024/07/19 15:12:09 matthieu Exp $
# $OpenBSD: MODULES,v 1.527 2024/08/04 18:22:48 matthieu Exp $
#
# X.Org maintained modules
#
@ -22,7 +22,7 @@ app/setxkbmap 1.3.4
app/smproxy 1.0.7
app/twm 1.0.12
app/viewres 1.0.7
app/x11perf 1.6.2
app/x11perf 1.7.0 needs-update
app/xauth 1.1.3
app/xbacklight 1.2.3
app/xbiff 1.0.5
@ -149,7 +149,7 @@ font/xfree86-type1 1.0.5
lib/libICE 1.1.1
lib/libSM 1.2.4
lib/libX11 1.8.9
lib/libX11 1.8.10
lib/libXScrnSaver 1.2.4
lib/libXau 1.0.11
lib/libXaw 1.0.16
@ -159,7 +159,7 @@ lib/libXdamage 1.1.6
lib/libXdmcp 1.1.5
lib/libXext 1.3.6
lib/libXfixes 6.0.1
lib/libXfont2 2.0.6
lib/libXfont2 2.0.7 needs-update
lib/libXft 2.3.8
lib/libXi 1.8.1
lib/libXinerama 1.1.5
@ -170,7 +170,7 @@ lib/libXrandr 1.5.4
lib/libXrender 0.9.11
lib/libXres 1.2.2
lib/libXt 1.3.0
lib/libXtst 1.2.4
lib/libXtst 1.2.5
lib/libXv 1.0.12
lib/libXvMC 1.0.14
lib/libXxf86dga 1.1.6

View file

@ -218,7 +218,7 @@
./usr/X11R6/lib/libX11-xcb.so.2.0
./usr/X11R6/lib/libX11.a
./usr/X11R6/lib/libX11.la
./usr/X11R6/lib/libX11.so.18.1
./usr/X11R6/lib/libX11.so.18.2
./usr/X11R6/lib/libXRes.a
./usr/X11R6/lib/libXRes.la
./usr/X11R6/lib/libXRes.so.5.1
@ -309,7 +309,7 @@
./usr/X11R6/lib/libfontenc.la
./usr/X11R6/lib/libfontenc.so.4.0
./usr/X11R6/lib/libfreetype.a
./usr/X11R6/lib/libfreetype.so.30.3
./usr/X11R6/lib/libfreetype.so.30.4
./usr/X11R6/lib/libpciaccess.a
./usr/X11R6/lib/libpciaccess.so.2.1
./usr/X11R6/lib/libpixman-1.a

View file

@ -164,7 +164,7 @@ project(freetype C)
set(VERSION_MAJOR "2")
set(VERSION_MINOR "13")
set(VERSION_PATCH "0")
set(VERSION_PATCH "2")
# Generate LIBRARY_VERSION and LIBRARY_SOVERSION.
set(LIBTOOL_REGEX "version_info='([0-9]+):([0-9]+):([0-9]+)'")

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,11 @@
# $OpenBSD: Makefile,v 1.58 2023/05/21 09:25:29 matthieu Exp $
# $OpenBSD: Makefile,v 1.59 2024/08/04 17:17:23 matthieu Exp $
.include <bsd.own.mk>
FREETYPESRC= ${.CURDIR}/src
# Get it from builds/unix/configure.ac
FT_VERSION_INFO= 25.0.19
FT_VERSION_INFO= 26.1.20
INSTALL_PROGRAM = ${INSTALL} ${INSTALL_COPY} -m 755 -o $(BINOWN) -g $(BINGRP)
@ -26,7 +26,7 @@ SRCS= ftbase.c ftbbox.c ftbdf.c ftbitmap.c ftdebug.c ftcache.c \
raster.c sdf.c sfnt.c smooth.c svg.c truetype.c type1.c type1cid.c \
type42.c winfnt.c
CPPFLAGS+= -I${.CURDIR}/include -I${.CURDIR}/builds/unix -I${.CURDIR}/src/lzw -DFT2_BUILD_LIBRARY -DFT_CONFIG_CONFIG_H='<ftconfig.h>'
CPPFLAGS+= -I${.CURDIR}/include -I${.CURDIR}/builds/unix -I${.CURDIR}/src/lzw -DFT2_BUILD_LIBRARY=1 -DFT_CONFIG_CONFIG_H='<ftconfig.h>'
.if ${COMPILER_VERSION} != "gcc3"
CFLAGS+= -fvisibility=hidden -std=gnu99 -Wall -Wdeclaration-after-statement -Werror=implicit-function-declaration -Werror=undef -Wextra -Winit-self -Winline -Winvalid-pch -Wmissing-declarations -Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs -Wno-attributes -Wno-long-long -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wpacked -Wpointer-arith -Wshadow -Wsign-compare -Wstrict-aliasing=2 -Wstrict-prototypes -Wwrite-strings

View file

@ -1,4 +1,4 @@
FreeType 2.13.0
FreeType 2.13.2
===============
Homepage: https://www.freetype.org
@ -32,9 +32,9 @@ sites. Go to
and download one of the following files.
freetype-doc-2.13.0.tar.xz
freetype-doc-2.13.0.tar.gz
ftdoc2130.zip
freetype-doc-2.13.2.tar.xz
freetype-doc-2.13.2.tar.gz
ftdoc2132.zip
To view the documentation online, go to

View file

@ -67,6 +67,7 @@
FT_Get_Color_Glyph_Layer;
FT_Get_Color_Glyph_Paint;
FT_Get_Colorline_Stops;
FT_Get_Default_Named_Instance;
FT_Get_FSType_Flags;
FT_Get_First_Char;
FT_Get_Font_Format;
@ -104,6 +105,7 @@
FT_Get_Var_Design_Coordinates;
FT_Get_WinFNT_Header;
FT_Get_X11_Font_Format;
FT_GlyphSlot_AdjustWeight;
FT_GlyphSlot_Embolden;
FT_GlyphSlot_Oblique;
FT_GlyphSlot_Own_Bitmap;
@ -220,6 +222,8 @@
FT_Vector_Unit;
TT_New_Context;
TT_RunIns;
_init;
_fini;
local:
*;
};

View file

@ -299,7 +299,7 @@ refdoc:
$(PUBLIC_DIR)/config/*.h \
$(PUBLIC_DIR)/cache/*.h
@echo Building static site...
cd $(DOC_DIR) && mkdocs build
cd $(DOC_DIR) && $(PYTHON) -m mkdocs build
@echo Done.
# Variables for running `refdoc' with Python's `virtualenv'. The

View file

@ -200,14 +200,6 @@ environment by Metrowerks. GCC for MPW and Symantec
behaviours are not tested at all. Building ftdemos
for classic MacOS and working test is required.
4-3. Porting Jam onto MPW
-------------------------
FreeType uses Jam (and FT-Jam) for unified cross-
platform building tool. At present, Jam is not ported
to MPW. To update classic MacOS support easily,
building by Jam is expected on MPW.
APPENDIX I
----------

View file

@ -97,8 +97,12 @@ def generate_ftmodule(lists):
for module in lists["AUX_MODULES"]:
if module in ("psaux", "psnames", "otvalid", "gxvalid"):
name = {
"gxvalid": "gxv",
"otvalid": "otv",
}.get(module, module)
result += (
"FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module
"FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % name
)
result += "/* EOF */\n"

View file

@ -198,27 +198,22 @@ modules:
include $(TOP_DIR)/builds/modules.mk
# get FreeType version string, using a
# poor man's `sed' emulation with make's built-in string functions
# get FreeType version string using built-in string functions
#
hash := \#
work := $(strip $(shell $(CAT) \
$(subst /,$(SEP),$(TOP_DIR)/include/freetype/freetype.h)))
work := $(subst |,x,$(work))
work := $(subst $(space),|,$(work))
work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work))
work := $(word 2,$(work))
major := $(subst |,$(space),$(work))
major := $(firstword $(major))
work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work))
work := $(word 2,$(work))
minor := $(subst |,$(space),$(work))
minor := $(firstword $(minor))
work := $(subst $(hash)define$(space)FREETYPE_MAJOR$(space),MAjOR=,$(work))
work := $(subst $(hash)define$(space)FREETYPE_MINOR$(space),MInOR=,$(work))
work := $(subst $(hash)define$(space)FREETYPE_PATCH$(space),PAtCH=,$(work))
work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work))
work := $(word 2,$(work))
patch := $(subst |,$(space),$(work))
patch := $(firstword $(patch))
major := $(subst MAjOR=,,$(filter MAjOR=%,$(work)))
minor := $(subst MInOR=,,$(filter MInOR=%,$(work)))
patch := $(subst PAtCH=,,$(filter PAtCH=%,$(work)))
work :=
# ifneq ($(findstring x0x,x$(patch)x),)
# version := $(major).$(minor)

View file

@ -11,13 +11,13 @@
# indicate that you have read the license and understand and accept it
# fully.
AC_INIT([FreeType], [2.13], [freetype@nongnu.org], [freetype])
AC_INIT([FreeType], [2.13.2], [freetype@nongnu.org], [freetype])
AC_CONFIG_SRCDIR([ftconfig.h.in])
# Don't forget to update `docs/VERSIONS.TXT'!
version_info='25:0:19'
version_info='26:1:20'
AC_SUBST([version_info])
ft_version=`echo $version_info | tr : .`
AC_SUBST([ft_version])
@ -966,14 +966,14 @@ esac
AX_PTHREAD([have_pthread=yes], [have_pthread=no])
# Check for Python and docwriter
PYTHON_MIN_VERSION=3.5
have_py3=no
have_docwriter=no
PIP=pip
AC_CHECK_PROGS([PYTHON], [python3 python], [missing])
if test "x$PYTHON" != "xmissing"; then
AX_PROG_PYTHON_VERSION([3.5], [have_py3=yes], [])
AX_PROG_PYTHON_VERSION([$PYTHON_MIN_VERSION], [have_py3=yes], [])
if test "x$have_py3" = "xyes"; then
PIP="$PYTHON -m $PIP"
@ -1162,7 +1162,7 @@ if test $have_docwriter = no; then
`make refdoc' will fail since pip package `docwriter' is not installed.
To install, run `$PIP install docwriter', or to use a Python
virtual environment, run `make refdoc-venv' (requires pip package
`virtualenv'). These operations require Python >= 3.5.
`virtualenv'). These operations require Python >= $PYTHON_MIN_VERSION.
])
fi

View file

@ -17,7 +17,7 @@ AC_CONFIG_SRCDIR([ftconfig.h.in])
# Don't forget to update `docs/VERSIONS.TXT'!
version_info='25:0:19'
version_info='26:1:20'
AC_SUBST([version_info])
ft_version=`echo $version_info | tr : .`
AC_SUBST([ft_version])
@ -966,14 +966,14 @@ esac
AX_PTHREAD([have_pthread=yes], [have_pthread=no])
# Check for Python and docwriter
PYTHON_MIN_VERSION=3.5
have_py3=no
have_docwriter=no
PIP=pip
AC_CHECK_PROGS([PYTHON], [python3 python], [missing])
if test "x$PYTHON" != "xmissing"; then
AX_PROG_PYTHON_VERSION([3.5], [have_py3=yes], [])
AX_PROG_PYTHON_VERSION([$PYTHON_MIN_VERSION], [have_py3=yes], [])
if test "x$have_py3" = "xyes"; then
PIP="$PYTHON -m $PIP"
@ -1162,7 +1162,7 @@ if test $have_docwriter = no; then
`make refdoc' will fail since pip package `docwriter' is not installed.
To install, run `$PIP install docwriter', or to use a Python
virtual environment, run `make refdoc-venv' (requires pip package
`virtualenv'). These operations require Python >= 3.5.
`virtualenv'). These operations require Python >= $PYTHON_MIN_VERSION.
])
fi

View file

@ -0,0 +1,2 @@
src/tools/apinames -wV include/freetype/*.h > freetype_vms0.opt
mv freetype_vms0.opt freetype_vms.opt

View file

@ -1,28 +0,0 @@
!
! This is a simple driver file with information used by make.com to
! check if external libraries (like t1lib and freetype) are available on
! the system.
!
! Layout of the file:
!
! - Lines starting with ! are treated as comments
! - Elements in a data line are separated by # signs
! - The elements need to be listed in the following order
! 1.) Name of the Library
! 2.) Location where the object library can be found
! 3.) Location where the include files for the library can be found
! 4.) Include file used to verify library location
! 5.) CPP define to pass to the build to indicate availability of
! the library
!
! Example: The following lines show how definitions
! might look like. They are site specific and the locations of the
! library and include files need almost certainly to be changed.
!
! Location: All of the libaries can be found at the following addresses
!
! ZLIB: http://www.decus.de:8080/www/vms/sw/zlib.htmlx
!
BZ2LIB # sys$library:libbz2.olb # decc$user_include: # bzlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB
PNGLIB # sys$library:libpng.olb # sys$library: # png.h # FT_CONFIG_OPTION_SYSTEM_ZLIB
ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB

View file

@ -21,7 +21,7 @@ the following targets:
<li>PPC/SP WM6 (Windows Mobile 6)</li>
</ul>
It compiles the following libraries from the FreeType 2.13.0 sources:</p>
It compiles the following libraries from the FreeType 2.13.2 sources:</p>
<ul>
<pre>

View file

@ -21,7 +21,7 @@ the following targets:
<li>PPC/SP WM6 (Windows Mobile 6)</li>
</ul>
It compiles the following libraries from the FreeType 2.13.0 sources:</p>
It compiles the following libraries from the FreeType 2.13.2 sources:</p>
<ul>
<pre>

View file

@ -168,7 +168,7 @@
<WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
@ -195,7 +195,7 @@
<WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
@ -248,7 +248,7 @@
<WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
@ -274,7 +274,7 @@
<WarningLevel>Level4</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
@ -328,7 +328,7 @@
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<IntrinsicFunctions>true</IntrinsicFunctions>
@ -356,7 +356,7 @@
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>
@ -409,7 +409,7 @@
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<IntrinsicFunctions>true</IntrinsicFunctions>
@ -435,7 +435,7 @@
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
<CompileAs>Default</CompileAs>
<DisableSpecificWarnings>4001</DisableSpecificWarnings>
<DisableSpecificWarnings>4001;4267</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>

View file

@ -12,7 +12,7 @@
<p>This directory contains solution and project files for
Visual&nbsp;C++&nbsp;2010 or newer, named <tt>freetype.sln</tt>,
and <tt>freetype.vcxproj</tt>. It compiles the following libraries
from the FreeType 2.13.0 sources:</p>
from the FreeType 2.13.2 sources:</p>
<ul>
<li>freetype.dll using 'Release' or 'Debug' configurations</li>

View file

@ -12,7 +12,7 @@
<p>This directory contains project files <tt>freetype.dsp</tt> for
Visual C++ 6.0, and <tt>freetype.vcproj</tt> for Visual C++ 2002
through 2008, which you might need to upgrade automatically.
It compiles the following libraries from the FreeType 2.13.0 sources:</p>
It compiles the following libraries from the FreeType 2.13.2 sources:</p>
<ul>
<li>freetype.dll using 'Release' or 'Debug' configurations</li>

View file

@ -21,7 +21,7 @@ the following targets:
<li>PPC/SP WM6 (Windows Mobile 6)</li>
</ul>
It compiles the following libraries from the FreeType 2.13.0 sources:</p>
It compiles the following libraries from the FreeType 2.13.2 sources:</p>
<ul>
<pre>

View file

@ -661,36 +661,12 @@ FT_BEGIN_HEADER
* not) instructions in a certain way so that all TrueType fonts look like
* they do in a Windows ClearType (DirectWrite) environment. See [1] for a
* technical overview on what this means. See `ttinterp.h` for more
* details on the LEAN option.
* details on this option.
*
* There are three possible values.
*
* Value 1:
* This value is associated with the 'Infinality' moniker, contributed by
* an individual nicknamed Infinality with the goal of making TrueType
* fonts render better than on Windows. A high amount of configurability
* and flexibility, down to rules for single glyphs in fonts, but also
* very slow. Its experimental and slow nature and the original
* developer losing interest meant that this option was never enabled in
* default builds.
*
* The corresponding interpreter version is v38.
*
* Value 2:
* The new default mode for the TrueType driver. The Infinality code
* base was stripped to the bare minimum and all configurability removed
* in the name of speed and simplicity. The configurability was mainly
* aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'.
* Legacy fonts are fonts that modify vertical stems to achieve clean
* black-and-white bitmaps. The new mode focuses on applying a minimal
* set of rules to all fonts indiscriminately so that modern and web
* fonts render well while legacy fonts render okay.
*
* The corresponding interpreter version is v40.
*
* Value 3:
* Compile both, making both v38 and v40 available (the latter is the
* default).
* The new default mode focuses on applying a minimal set of rules to all
* fonts indiscriminately so that modern and web fonts render well while
* legacy fonts render okay. The corresponding interpreter version is v40.
* The so-called Infinality mode (v38) is no longer available in FreeType.
*
* By undefining these, you get rendering behavior like on Windows without
* ClearType, i.e., Windows XP without ClearType enabled and Win9x
@ -705,9 +681,7 @@ FT_BEGIN_HEADER
* [1]
* https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
*/
/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */
/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 */
#define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 )
#define TT_CONFIG_OPTION_SUBPIXEL_HINTING
/**************************************************************************
@ -977,21 +951,14 @@ FT_BEGIN_HEADER
/*
* The next three macros are defined if native TrueType hinting is
* The next two macros are defined if native TrueType hinting is
* requested by the definitions above. Don't change this.
*/
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#define TT_USE_BYTECODE_INTERPRETER
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1
#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
#endif
#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2
#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
#endif
#endif
#endif

View file

@ -1,3 +1,57 @@
CHANGES BETWEEN 2.13.1 and 2.13.2 (2023-Aug-25)
I. MISCELLANEOUS
- Better support for CFF2 variation fonts.
- TrueType interpreter version 38 (also known as 'Infinality') has
been removed.
- Improved OpenVMS support.
======================================================================
CHANGES BETWEEN 2.13.0 and 2.13.1 (2023-Jun-24)
I. MISCELLANEOUS
- New function `FT_Get_Default_Named_Instance` to get the index of
the default named instance of an OpenType Variation Font.
- A new load flag `FT_LOAD_NO_SVG` to make FreeType ignore glyphs in
an 'SVG ' table.
- New function `FT_GlyphSlot_AdjustWeight` to adjust the glyph
weight either horizontally or vertically. This is part of the
`ftsynth.h` header file, which is still considered to be in alpha
stage.
- TrueType interpreter version 38 (also known as 'Infinality') has
been deactivated; the value of `TT_INTERPRETER_VERSION_38` is now
the same as `TT_INTERPRETER_VERSION_40`.
- Updated OpenVMS support.
- The base API documentation has been modularized for easier
handling.
- Switching named instances on and off in Variation Fonts was buggy
if the design coordinates didn't change.
- `ftbench` has a new command-line option `-a` to apply design
coordinates.
- `ftview` can now flip SVG rendering on and off using the 'Z' key.
- In `ftmulti` it is now possible to toggle the fill rule and
overlap flag used for rendering glyphs using the 'F3' and 'F4'
keys, respectively. Toggling the anti-aliased mode has been
changed to the 'TAB' key.
======================================================================
CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09)
I. IMPORTANT CHANGES
@ -12,7 +66,7 @@ CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09)
https://learn.microsoft.com/en-us/typography/opentype/spec/colr
III. MISCELLANEOUS
II. MISCELLANEOUS
- For OpenType Variable Fonts, `avar` table format 2.0 is now
supported. The code was contributed by Behdad Esfahbod.
@ -75,6 +129,10 @@ CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09)
af_debug_hints_
```
- The internal zlib library was updated to version 1.2.13. Note,
however, that FreeType is *not* affected by CVE-2022-37434 since
it doesn't use the `inflateGetHeader` function.
======================================================================
@ -2420,7 +2478,7 @@ CHANGES BETWEEN 2.3.8 and 2.3.7
is provided for x86 and ARM. See FT_CONFIG_OPTION_INLINE_MULFIX
and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more.
- The handling of `tricky' fonts (this is, fonts which don't work
- The handling of `tricky' fonts (that is, fonts which don't work
with the autohinter, needing the font format's hinting engine)
has been generalized and changed slightly:
@ -2877,7 +2935,7 @@ CHANGES BETWEEN 2.2 and 2.1.10
II. IMPORTANT CHANGES
- Version 2.2 no longer exposes its internals, this is, the header
- Version 2.2 no longer exposes its internals, that is, the header
files located in the `include/freetype/internal' directory of
the source package are not copied anymore by the `make install'
command. Consequently, a number of rogue clients which directly

View file

@ -270,12 +270,12 @@ to access them.
`FT2_DEBUG' environment variable. Use this function to override
the value with `level'. Use value `NULL' to disable tracing.
FT_Trace_Set_Default_Level():
FT_Trace_Set_Default_Level( void )
Reset the tracing levels to the default value, i.e., the value of
the `FT2_DEBUG' environment variable or no tracing if not set.
FT_Set_Log_Handler( ft_custom_log_handler handler ):
FT_Set_Log_Handler( ft_custom_log_handler handler )
Use `handler' as a custom handler for formatting tracing and error
messages. The `ft_custom_log_handler' typedef has the following
@ -290,7 +290,7 @@ to access them.
first argument of `FT_TRACE' or `FT_ERROR', and `args' holds the
remaining arguments.
FT_Set_Default_Log_Handler():
FT_Set_Default_Log_Handler( void )
Reset the log handler to the default version.

View file

@ -1,23 +1,23 @@
How to build the FreeType 2 library on VMS
-----------------------------------------
How to build the FreeType library on VMS
----------------------------------------
It is actually very straightforward to install the FreeType 2 library.
Just execute vms_make.com from the toplevel directory to build the
It is actually very straightforward to install the FreeType library.
Just execute `vms_make.com from` the toplevel directory to build the
library. This procedure currently accepts the following options:
DEBUG
* `DEBUG`
Build the library with debug information and without optimization.
lopts=<value>
Options to pass to the link command e.g. lopts=/traceback
* `lopts=<value>`
Options to pass to the link command, e.g., `lopts=/traceback`.
ccopt=<value>
Options to pass to the C compiler e.g. ccopt=/float=ieee
* `ccopt=<value>`
Options to pass to the C compiler, e.g., `ccopt=/float=ieee`.
In case you did download the demos, place them in a separate directory
sharing the same top level as the directory of FreeType 2 and follow
the same instructions as above for the demos from there. The build
process relies on this to figure out the location of the FreeType 2
sharing the same top level as the directory of FreeType and follow the
same instructions as above for the demos from there. The build
process relies on this to figure out the location of the FreeType
include files.
@ -28,23 +28,30 @@ The library is available in the directory
[.LIB]
To compile applications using FreeType 2 you have to define the
logical FREETYPE pointing to the directory
To compile applications using FreeType you have to define the logical
`FREETYPE` pointing to the directory
[.INCLUDE.FREETYPE]
i.e., if the directory in which this INSTALL.VMS file is located is
$disk:[freetype] then define the logical with
i.e., if the directory in which this `INSTALL.VMS` file is located is
`$disk:[freetype.docs]`, then define the logical with
define freetype $disk:[freetype.include.freetype]
This version has been tested with Compaq C V6.2-006 on OpenVMS Alpha
V7.2-1.
See http://nchrem.tnw.tudelft.nl/openvms/software2.html#Freetype for
the packages FreeType depends on.
The latest versions were tested using
- VSI C V7.4-002 and DECWindows V1.7-F on OpenVMS Alpha V8.4-2L1
- VSI C V7.4-001 and DECWindows V1.7-E on OpenVMS IA64 V8.4-2L3
Any problems can be reported to
Jouk Jansen <joukj@hrem.stm.tudelft.nl> or
Jouk Jansen <joukj@hrem.nano.tudelft.nl> or
Orginal version of the build procedures was created by
Martin P.J. Zinser <zinser@zinser.no-ip.info>
------------------------------------------------------------------------

View file

@ -18,8 +18,6 @@ There are two ways to generate the documentation:
- This may or may not require internet access every time depending on
pip and system caching.
This also works with Jam: Just type `jam refdoc' in the main directory.
Some troubleshooting tips:
* Regularly run `pip install --upgrade docwriter' to check for updates which

View file

@ -60,6 +60,8 @@ found on _most_ systems, but not all of them:
release libtool so
-------------------------------
2.13.2 26.1.20 6.20.1
2.13.1 26.0.20 6.20.0
2.13.0 25.0.19 6.19.0
2.12.1 24.3.18 6.18.3
2.12.0 24.2.18 6.18.2

View file

@ -57,7 +57,7 @@ Notes
(`*') in the table below.
FreeType can be configured to support Mac files (on older Mac OS
versions, a `file' is stored as a data and a resource fork, this is,
versions, a `file' is stored as a data and a resource fork, that is,
within two separate data chunks). If a file can't be opened as a
font, FreeType then checks whether it is a resource fork, trying to
extract the contained font data from either a `POST' or `sfnt'
@ -77,8 +77,8 @@ which isn't supported yet please send a mail too.
--- BDF --- --- bdf 5005.BDF_Spec.pdf, X11
SFNT PS TYPE_1 --- type1 Type 1 GX Font Format
(for the Mac) [3]
SFNT PS TYPE_1 --- type1 Type 1 GX Font Format [7]
(for the Mac; not supported)
SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) [3]
SFNT PS CFF --- cff OT spec, 5176.CFF.pdf
(`OTTO' format)
@ -198,6 +198,12 @@ which isn't supported yet please send a mail too.
[6] Supported font formats are TrueType and OpenType fonts as
defined in the OpenType specification 1.6 and newer.
[7] `The Type 1 GX Font Format' (dated 1995-09-27) was distributed in
Apple Developer CD-ROM in those days. The content of `TYP1' table
is a PostScript Type 1 font without the eexec encryption. Current
versions of FreeType don't not support this format, but FontForge
can load it.
------------------------------------------------------------------------
Copyright (C) 2004-2023 by

View file

@ -1,4 +1,4 @@
.TH FREETYPE-CONFIG 1 "February 2023" "FreeType 2.13.0"
.TH FREETYPE-CONFIG 1 "August 2023" "FreeType 2.13.2"
.
.
.SH NAME

View file

@ -15,33 +15,53 @@ How to prepare a new release
. docs/VERSIONS.TXT: Document changed `version_info`.
. Clone the git archive to another directory with
. Update the 'dlg' submodule with
git clone -l -s . ../freetype.test
git submodule foreach git pull origin master
or something like this and run
. Copy the submodule code with
make distclean; make devel; make
make distclean; make devel; make multi
make distclean; make devel CC=g++; make CC=g++
make distclean; make devel CC=g++; make multi CC=g++
make copy_submodule
and run
make distclean && make devel && make
make distclean && make devel && make multi
make distclean && make devel CC=g++ && make CC=g++ ANSIFLAGS=""
make distclean && make devel CC=g++ && make multi CC=g++ ANSIFLAGS=""
sh autogen.sh
make distclean; ./configure CC=g++; make
make distclean && ./configure CC=g++ && make ANSIFLAGS=""
in the cloned repository to test compilation with both gcc and g++.
to test compilation with both gcc and g++ (you might also add the `-j`
flag to `make` for parallel compilation).
Note that it is normally not necessary to test standard C
compilation with the `configure`, `meson`, and `cmake` build tools
since this is done by the CI process of 'gitlab.freetype.org' for
since this is done by the CI process of 'gitlab.freedesktop.org' for
every commit.
. Test C++ compilation for 'freetype-demos' too (using `git clone` as
above).
. Test C++ compilation for 'freetype-demos' too; this needs a compiled
FreeType library as described in the `README` file.
make distclean && make
make distclean && make CC=g++ ANSIFLAGS=""
. Run `src/tools/chktrcmp.py` and check that there are no undefined
`trace_XXXX` macros.
. Update meson subproject files (for both the 'freetype' and
'freetype-demos' git repositories) with
meson subprojects update
. Test meson compilation (for both the 'freetype' and 'freetype-demos'
git repositories) with
meson setup builddir && meson compile -C builddir
. Commit everything.
. After pushing the new release, tag the git repositories ('freetype',
'freetype-demos') with

View file

@ -85,6 +85,13 @@
#endif
#endif
// This macro is used when an assertion fails. It gets the source expression
// and can return an alternative (that must stay alive).
// Mainly useful to execute something on failed assertion.
#ifndef DLG_FAILED_ASSERTION_TEXT
#define DLG_FAILED_ASSERTION_TEXT(x) x
#endif
// - utility -
// two methods needed since cplusplus does not support compound literals
// and c does not support uniform initialization/initializer lists
@ -131,18 +138,67 @@ struct dlg_origin {
// Type of the output handler, see dlg_set_handler.
typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, void* data);
#ifdef DLG_DISABLE
#ifndef DLG_DISABLE
// Tagged/Untagged logging with variable level
// Tags must always be in the format `("tag1", "tag2")` (including brackets)
// Example usages:
// dlg_log(dlg_level_warning, "test 1")
// dlg_logt(("tag1, "tag2"), dlg_level_debug, "test %d", 2)
#define dlg_log(level, ...) if(level >= DLG_LOG_LEVEL) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), NULL)
#define dlg_logt(level, tags, ...) if(level >= DLG_LOG_LEVEL) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), NULL)
// Dynamic level assert macros in various versions for additional arguments
// Example usages:
// dlg_assertl(dlg_level_warning, data != nullptr);
// dlg_assertlt(("tag1, "tag2"), dlg_level_trace, data != nullptr);
// dlg_asserttlm(("tag1), dlg_level_warning, data != nullptr, "Data must not be null");
// dlg_assertlm(dlg_level_error, data != nullptr, "Data must not be null");
#define dlg_assertl(level, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, \
DLG_FAILED_ASSERTION_TEXT(#expr))
#define dlg_assertlt(level, tags, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, \
DLG_FAILED_ASSERTION_TEXT(#expr))
#define dlg_assertlm(level, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr))
#define dlg_assertltm(level, tags, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, \
__func__, DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr))
#define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) {\
if(level >= DLG_ASSERT_LEVEL) \
dlg__do_log(level, tags, DLG_FILE, __LINE__, __func__, msg, \
DLG_FAILED_ASSERTION_TEXT(#expr)); \
code; \
} (void) NULL
// - Private interface: not part of the abi/api but needed in macros -
// Formats the given format string and arguments as printf would, uses the thread buffer.
DLG_API const char* dlg__printf_format(const char* format, ...) DLG_PRINTF_ATTRIB(1, 2);
DLG_API void dlg__do_log(enum dlg_level lvl, const char* const*, const char*, int,
const char*, const char*, const char*);
DLG_API const char* dlg__strip_root_path(const char* file, const char* base);
#else // DLG_DISABLE
#define dlg_log(level, ...)
#define dlg_logt(level, tags, ...)
// Dynamic level assert macros in various versions for additional arguments
#define dlg_assertl(level, expr) // assert without tags/message
#define dlg_assertlt(level, tags, expr) // assert with tags
#define dlg_assertlm(level, expr, ...) // assert with message
#define dlg_assertltm(level, tags, expr, ...) // assert with tags & message
#define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) { code; } (void) NULL
#endif // DLG_DISABLE
// The API below is independent from DLG_DISABLE
// Sets the handler that is responsible for formatting and outputting log calls.
// This function is not thread safe and the handler is set globally.
// The handler itself must not change dlg tags or call a dlg macro (if it
@ -152,10 +208,13 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string,
// The default handler is dlg_default_output (see its doc for more info).
// If using c++ make sure the registered handler cannot throw e.g. by
// wrapping everything into a try-catch blog.
inline void dlg_set_handler(dlg_handler handler, void* data) {
(void) handler;
(void) data;
}
DLG_API void dlg_set_handler(dlg_handler handler, void* data);
// The default output handler.
// Only use this to reset the output handler, prefer to use
// dlg_generic_output (from output.h) which this function simply calls.
// It also flushes the stream used and correctly outputs even from multiple threads.
DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*);
// Returns the currently active dlg handler and sets `data` to
// its user data pointer. `data` must not be NULL.
@ -163,84 +222,27 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string,
// This function is not threadsafe, i.e. retrieving the handler while
// changing it from another thread is unsafe.
// See `dlg_set_handler`.
inline dlg_handler dlg_get_handler(void** data) {
*data = NULL;
return NULL;
}
// The default output handler.
// Only use this to reset the output handler, prefer to use
// dlg_generic_output (from output.h) which this function simply calls.
// It also flushes the stream used and correctly outputs even from multiple threads.
inline void dlg_default_output(const struct dlg_origin* o, const char* str, void* data) {
(void) o;
(void) str;
(void) data;
}
DLG_API dlg_handler dlg_get_handler(void** data);
// Adds the given tag associated with the given function to the thread specific list.
// If func is not NULL the tag will only applied to calls from the same function.
// Remove the tag again calling dlg_remove_tag (with exactly the same pointers!).
// Does not check if the tag is already present.
inline void dlg_add_tag(const char* tag, const char* func) {
(void) tag;
(void) func;
}
DLG_API void dlg_add_tag(const char* tag, const char* func);
// Removes a tag added with dlg_add_tag (has no effect for tags no present).
// The pointers must be exactly the same pointers that were supplied to dlg_add_tag,
// this function will not check using strcmp. When the same tag/func combination
// is added multiple times, this function remove exactly one candidate, it is
// undefined which. Returns whether a tag was found (and removed).
inline bool dlg_remove_tag(const char* tag, const char* func) {
(void) tag;
(void) func;
return true;
}
DLG_API bool dlg_remove_tag(const char* tag, const char* func);
// Returns the thread-specific buffer and its size for dlg.
// The buffer should only be used by formatting functions.
// The buffer can be reallocated and the size changed, just make sure
// to update both values correctly.
inline char** dlg_thread_buffer(size_t** size) {
(void) size;
return NULL;
}
#else // DLG_DISABLE
#define dlg_log(level, ...) if(level >= DLG_LOG_LEVEL) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), NULL)
#define dlg_logt(level, tags, ...) if(level >= DLG_LOG_LEVEL) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), NULL)
#define dlg_assertl(level, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, #expr)
#define dlg_assertlt(level, tags, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, #expr)
#define dlg_assertlm(level, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \
DLG_FMT_FUNC(__VA_ARGS__), #expr)
#define dlg_assertltm(level, tags, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, \
__func__, DLG_FMT_FUNC(__VA_ARGS__), #expr)
DLG_API void dlg_set_handler(dlg_handler handler, void* data);
DLG_API dlg_handler dlg_get_handler(void** data);
DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*);
DLG_API void dlg_add_tag(const char* tag, const char* func);
DLG_API bool dlg_remove_tag(const char* tag, const char* func);
DLG_API char** dlg_thread_buffer(size_t** size);
// - Private interface: not part of the abi/api but needed in macros -
// Formats the given format string and arguments as printf would, uses the thread buffer.
DLG_API const char* dlg__printf_format(const char* format, ...) DLG_PRINTF_ATTRIB(1, 2);
DLG_API void dlg__do_log(enum dlg_level lvl, const char* const*, const char*, int,
const char*, const char*, const char*);
DLG_API const char* dlg__strip_root_path(const char* file, const char* base);
#endif // DLG_DISABLE
// Untagged leveled logging
#define dlg_trace(...) dlg_log(dlg_level_trace, __VA_ARGS__)
#define dlg_debug(...) dlg_log(dlg_level_debug, __VA_ARGS__)
@ -263,6 +265,24 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string,
#define dlg_assertm(expr, ...) dlg_assertlm(DLG_DEFAULT_ASSERT, expr, __VA_ARGS__)
#define dlg_asserttm(tags, expr, ...) dlg_assertltm(DLG_DEFAULT_ASSERT, tags, expr, __VA_ARGS__)
// If (expr) does not evaluate to true, always executes 'code' (no matter what
// DLG_ASSERT_LEVEL is or if dlg is disabled or not).
// When dlg is enabled and the level is greater or equal to DLG_ASSERT_LEVEL,
// logs the failed assertion.
// Example usages:
// dlg_assertl_or(dlg_level_warn, data != nullptr, return);
// dlg_assertlm_or(dlg_level_fatal, data != nullptr, return, "Data must not be null");
// dlg_assert_or(data != nullptr, logError(); return false);
#define dlg_assertltm_or(level, tags, expr, code, ...) dlg__assert_or(level, \
DLG_CREATE_TAGS tags, expr, code, DLG_FMT_FUNC(__VA_ARGS__))
#define dlg_assertlm_or(level, expr, code, ...) dlg__assert_or(level, \
DLG_CREATE_TAGS(NULL), expr, code, DLG_FMT_FUNC(__VA_ARGS__))
#define dlg_assertl_or(level, expr, code) dlg__assert_or(level, \
DLG_CREATE_TAGS(NULL), expr, code, NULL)
#define dlg_assert_or(expr, code) dlg_assertl_or(DLG_DEFAULT_ASSERT, expr, code)
#define dlg_assertm_or(expr, code, ...) dlg_assertlm_or(DLG_DEFAULT_ASSERT, expr, code, __VA_ARGS__)
#ifdef __cplusplus
}
#endif

View file

@ -661,36 +661,12 @@ FT_BEGIN_HEADER
* not) instructions in a certain way so that all TrueType fonts look like
* they do in a Windows ClearType (DirectWrite) environment. See [1] for a
* technical overview on what this means. See `ttinterp.h` for more
* details on the LEAN option.
* details on this option.
*
* There are three possible values.
*
* Value 1:
* This value is associated with the 'Infinality' moniker, contributed by
* an individual nicknamed Infinality with the goal of making TrueType
* fonts render better than on Windows. A high amount of configurability
* and flexibility, down to rules for single glyphs in fonts, but also
* very slow. Its experimental and slow nature and the original
* developer losing interest meant that this option was never enabled in
* default builds.
*
* The corresponding interpreter version is v38.
*
* Value 2:
* The new default mode for the TrueType driver. The Infinality code
* base was stripped to the bare minimum and all configurability removed
* in the name of speed and simplicity. The configurability was mainly
* aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'.
* Legacy fonts are fonts that modify vertical stems to achieve clean
* black-and-white bitmaps. The new mode focuses on applying a minimal
* set of rules to all fonts indiscriminately so that modern and web
* fonts render well while legacy fonts render okay.
*
* The corresponding interpreter version is v40.
*
* Value 3:
* Compile both, making both v38 and v40 available (the latter is the
* default).
* The new default mode focuses on applying a minimal set of rules to all
* fonts indiscriminately so that modern and web fonts render well while
* legacy fonts render okay. The corresponding interpreter version is v40.
* The so-called Infinality mode (v38) is no longer available in FreeType.
*
* By undefining these, you get rendering behavior like on Windows without
* ClearType, i.e., Windows XP without ClearType enabled and Win9x
@ -705,9 +681,7 @@ FT_BEGIN_HEADER
* [1]
* https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
*/
/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */
#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2
/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */
#define TT_CONFIG_OPTION_SUBPIXEL_HINTING
/**************************************************************************
@ -977,21 +951,14 @@ FT_BEGIN_HEADER
/*
* The next three macros are defined if native TrueType hinting is
* The next two macros are defined if native TrueType hinting is
* requested by the definitions above. Don't change this.
*/
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#define TT_USE_BYTECODE_INTERPRETER
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1
#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
#endif
#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2
#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
#endif
#endif
#endif

View file

@ -117,7 +117,7 @@
#define ft_fread fread
#define ft_fseek fseek
#define ft_ftell ftell
#define ft_sprintf sprintf
#define ft_snprintf snprintf
/**************************************************************************

View file

@ -102,61 +102,25 @@ FT_BEGIN_HEADER
*/
/*************************************************************************/
/*************************************************************************/
/* */
/* B A S I C T Y P E S */
/* */
/*************************************************************************/
/*************************************************************************/
/**************************************************************************
*
* @section:
* base_interface
* font_testing_macros
*
* @title:
* Base Interface
* Font Testing Macros
*
* @abstract:
* The FreeType~2 base font interface.
* Macros to test various properties of fonts.
*
* @description:
* This section describes the most important public high-level API
* functions of FreeType~2.
* Macros to test the most important font properties.
*
* It is recommended to use these high-level macros instead of directly
* testing the corresponding flags, which are scattered over various
* structures.
*
* @order:
* FT_Library
* FT_Face
* FT_Size
* FT_GlyphSlot
* FT_CharMap
* FT_Encoding
* FT_ENC_TAG
*
* FT_FaceRec
*
* FT_FACE_FLAG_SCALABLE
* FT_FACE_FLAG_FIXED_SIZES
* FT_FACE_FLAG_FIXED_WIDTH
* FT_FACE_FLAG_HORIZONTAL
* FT_FACE_FLAG_VERTICAL
* FT_FACE_FLAG_COLOR
* FT_FACE_FLAG_SFNT
* FT_FACE_FLAG_CID_KEYED
* FT_FACE_FLAG_TRICKY
* FT_FACE_FLAG_KERNING
* FT_FACE_FLAG_MULTIPLE_MASTERS
* FT_FACE_FLAG_VARIATION
* FT_FACE_FLAG_GLYPH_NAMES
* FT_FACE_FLAG_EXTERNAL_STREAM
* FT_FACE_FLAG_HINTER
* FT_FACE_FLAG_SVG
* FT_FACE_FLAG_SBIX
* FT_FACE_FLAG_SBIX_OVERLAY
*
* FT_HAS_HORIZONTAL
* FT_HAS_VERTICAL
* FT_HAS_KERNING
@ -176,21 +140,59 @@ FT_BEGIN_HEADER
* FT_IS_NAMED_INSTANCE
* FT_IS_VARIATION
*
* FT_STYLE_FLAG_BOLD
* FT_STYLE_FLAG_ITALIC
*/
/**************************************************************************
*
* FT_SizeRec
* FT_Size_Metrics
* @section:
* library_setup
*
* FT_GlyphSlotRec
* FT_Glyph_Metrics
* FT_SubGlyph
* @title:
* Library Setup
*
* FT_Bitmap_Size
* @abstract:
* Functions to start and end the usage of the FreeType library.
*
* @description:
* Functions to start and end the usage of the FreeType library.
*
* Note that @FT_Library_Version and @FREETYPE_XXX are of limited use
* because even a new release of FreeType with only documentation
* changes increases the version number.
*
* @order:
* FT_Library
* FT_Init_FreeType
* FT_Done_FreeType
*
* FT_Library_Version
* FREETYPE_XXX
*
*/
/**************************************************************************
*
* @section:
* face_creation
*
* @title:
* Face Creation
*
* @abstract:
* Functions to manage fonts.
*
* @description:
* The functions and structures collected in this section operate on
* fonts globally.
*
* @order:
* FT_Face
* FT_FaceRec
* FT_FACE_FLAG_XXX
* FT_STYLE_FLAG_XXX
*
* FT_New_Face
* FT_Done_Face
* FT_Reference_Face
@ -198,10 +200,36 @@ FT_BEGIN_HEADER
* FT_Face_Properties
* FT_Open_Face
* FT_Open_Args
* FT_OPEN_XXX
* FT_Parameter
* FT_Attach_File
* FT_Attach_Stream
*
*/
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
* @title:
* Sizing and Scaling
*
* @abstract:
* Functions to manage font sizes.
*
* @description:
* The functions and structures collected in this section are related to
* selecting and manipulating the size of a font globally.
*
* @order:
* FT_Size
* FT_SizeRec
* FT_Size_Metrics
*
* FT_Bitmap_Size
*
* FT_Set_Char_Size
* FT_Set_Pixel_Sizes
* FT_Request_Size
@ -209,44 +237,37 @@ FT_BEGIN_HEADER
* FT_Size_Request_Type
* FT_Size_RequestRec
* FT_Size_Request
*
* FT_Set_Transform
* FT_Get_Transform
*
*/
/**************************************************************************
*
* @section:
* glyph_retrieval
*
* @title:
* Glyph Retrieval
*
* @abstract:
* Functions to manage glyphs.
*
* @description:
* The functions and structures collected in this section operate on
* single glyphs, of which @FT_Load_Glyph is most important.
*
* @order:
* FT_GlyphSlot
* FT_GlyphSlotRec
* FT_Glyph_Metrics
*
* FT_Load_Glyph
* FT_Get_Char_Index
* FT_Get_First_Char
* FT_Get_Next_Char
* FT_Load_Char
*
* FT_OPEN_MEMORY
* FT_OPEN_STREAM
* FT_OPEN_PATHNAME
* FT_OPEN_DRIVER
* FT_OPEN_PARAMS
*
* FT_LOAD_DEFAULT
* FT_LOAD_RENDER
* FT_LOAD_MONOCHROME
* FT_LOAD_LINEAR_DESIGN
* FT_LOAD_NO_SCALE
* FT_LOAD_NO_HINTING
* FT_LOAD_NO_BITMAP
* FT_LOAD_SBITS_ONLY
* FT_LOAD_NO_AUTOHINT
* FT_LOAD_COLOR
*
* FT_LOAD_VERTICAL_LAYOUT
* FT_LOAD_IGNORE_TRANSFORM
* FT_LOAD_FORCE_AUTOHINT
* FT_LOAD_NO_RECURSE
* FT_LOAD_PEDANTIC
*
* FT_LOAD_TARGET_NORMAL
* FT_LOAD_TARGET_LIGHT
* FT_LOAD_TARGET_MONO
* FT_LOAD_TARGET_LCD
* FT_LOAD_TARGET_LCD_V
*
* FT_LOAD_XXX
* FT_LOAD_TARGET_MODE
* FT_LOAD_TARGET_XXX
*
* FT_Render_Glyph
* FT_Render_Mode
@ -254,34 +275,121 @@ FT_BEGIN_HEADER
* FT_Kerning_Mode
* FT_Get_Track_Kerning
*
*/
/**************************************************************************
*
* @section:
* character_mapping
*
* @title:
* Character Mapping
*
* @abstract:
* Functions to manage character-to-glyph maps.
*
* @description:
* This section holds functions and structures that are related to
* mapping character input codes to glyph indices.
*
* Note that for many scripts the simplistic approach used by FreeType
* of mapping a single character to a single glyph is not valid or
* possible! In general, a higher-level library like HarfBuzz or ICU
* should be used for handling text strings.
*
* @order:
* FT_CharMap
* FT_CharMapRec
* FT_Encoding
* FT_ENC_TAG
*
* FT_Select_Charmap
* FT_Set_Charmap
* FT_Get_Charmap_Index
*
* FT_Get_Char_Index
* FT_Get_First_Char
* FT_Get_Next_Char
* FT_Load_Char
*
*/
/**************************************************************************
*
* @section:
* information_retrieval
*
* @title:
* Information Retrieval
*
* @abstract:
* Functions to retrieve font and glyph information.
*
* @description:
* Functions to retrieve font and glyph information. Only some very
* basic data is covered; see also the chapter on the format-specific
* API for more.
*
*
* @order:
* FT_Get_Name_Index
* FT_Get_Glyph_Name
* FT_Get_Postscript_Name
* FT_Get_FSType_Flags
* FT_FSTYPE_XXX
* FT_Get_SubGlyph_Info
* FT_SUBGLYPH_FLAG_XXX
*
*/
/**************************************************************************
*
* @section:
* other_api_data
*
* @title:
* Other API Data
*
* @abstract:
* Other structures, enumerations, and macros.
*
* @description:
* Other structures, enumerations, and macros. Deprecated functions are
* also listed here.
*
* @order:
* FT_Face_Internal
* FT_Size_Internal
* FT_Slot_Internal
*
* FT_FACE_FLAG_XXX
* FT_STYLE_FLAG_XXX
* FT_OPEN_XXX
* FT_LOAD_XXX
* FT_LOAD_TARGET_XXX
* FT_SUBGLYPH_FLAG_XXX
* FT_FSTYPE_XXX
* FT_SubGlyph
*
* FT_HAS_FAST_GLYPHS
* FT_Face_CheckTrueTypePatents
* FT_Face_SetUnpatentedHinting
*
*/
/*************************************************************************/
/*************************************************************************/
/* */
/* B A S I C T Y P E S */
/* */
/*************************************************************************/
/*************************************************************************/
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @struct:
@ -349,6 +457,13 @@ FT_BEGIN_HEADER
} FT_Glyph_Metrics;
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
*/
/**************************************************************************
*
* @struct:
@ -409,6 +524,13 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
/**************************************************************************
*
* @section:
* library_setup
*
*/
/**************************************************************************
*
* @type:
@ -483,7 +605,7 @@ FT_BEGIN_HEADER
/**************************************************************************
*
* @section:
* base_interface
* face_creation
*
*/
@ -519,6 +641,13 @@ FT_BEGIN_HEADER
typedef struct FT_FaceRec_* FT_Face;
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
*/
/**************************************************************************
*
* @type:
@ -551,6 +680,13 @@ FT_BEGIN_HEADER
typedef struct FT_SizeRec_* FT_Size;
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @type:
@ -570,6 +706,13 @@ FT_BEGIN_HEADER
typedef struct FT_GlyphSlotRec_* FT_GlyphSlot;
/**************************************************************************
*
* @section:
* character_mapping
*
*/
/**************************************************************************
*
* @type:
@ -877,6 +1020,13 @@ FT_BEGIN_HEADER
/*************************************************************************/
/**************************************************************************
*
* @section:
* other_api_data
*
*/
/**************************************************************************
*
* @type:
@ -892,6 +1042,13 @@ FT_BEGIN_HEADER
typedef struct FT_Face_InternalRec_* FT_Face_Internal;
/**************************************************************************
*
* @section:
* face_creation
*
*/
/**************************************************************************
*
* @struct:
@ -918,7 +1075,7 @@ FT_BEGIN_HEADER
* If we have the third named instance of face~4, say, `face_index` is
* set to 0x00030004.
*
* Bit 31 is always zero (this is, `face_index` is always a positive
* Bit 31 is always zero (that is, `face_index` is always a positive
* value).
*
* [Since 2.9] Changing the design coordinates with
@ -936,7 +1093,7 @@ FT_BEGIN_HEADER
*
* [Since 2.6.1] Bits 16-30 hold the number of named instances
* available for the current face if we have a GX or OpenType variation
* (sub)font. Bit 31 is always zero (this is, `style_flags` is always
* (sub)font. Bit 31 is always zero (that is, `style_flags` is always
* a positive value). Note that a variation font has always at least
* one named instance, namely the default instance.
*
@ -1002,7 +1159,7 @@ FT_BEGIN_HEADER
* Note that the bounding box might be off by (at least) one pixel for
* hinted fonts. See @FT_Size_Metrics for further discussion.
*
* Note that the bounding box does not vary in OpenType variable fonts
* Note that the bounding box does not vary in OpenType variation fonts
* and should only be used in relation to the default instance.
*
* units_per_EM ::
@ -1090,9 +1247,9 @@ FT_BEGIN_HEADER
FT_Generic generic;
/*# The following member variables (down to `underline_thickness`) */
/*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */
/*# for bitmap fonts. */
/* The following member variables (down to `underline_thickness`) */
/* are only relevant to scalable outlines; cf. @FT_Bitmap_Size */
/* for bitmap fonts. */
FT_BBox bbox;
FT_UShort units_per_EM;
@ -1110,7 +1267,7 @@ FT_BEGIN_HEADER
FT_Size size;
FT_CharMap charmap;
/*@private begin */
/* private fields, internal to FreeType */
FT_Driver driver;
FT_Memory memory;
@ -1123,8 +1280,6 @@ FT_BEGIN_HEADER
FT_Face_Internal internal;
/*@private end */
} FT_FaceRec;
@ -1207,13 +1362,13 @@ FT_BEGIN_HEADER
* successfully; in all other cases you get an
* `FT_Err_Invalid_Argument` error.
*
* Note that CID-keyed fonts that are in an SFNT wrapper (this is, all
* Note that CID-keyed fonts that are in an SFNT wrapper (that is, all
* OpenType/CFF fonts) don't have this flag set since the glyphs are
* accessed in the normal way (using contiguous indices); the
* 'CID-ness' isn't visible to the application.
*
* FT_FACE_FLAG_TRICKY ::
* The face is 'tricky', this is, it always needs the font format's
* The face is 'tricky', that is, it always needs the font format's
* native hinting engine to get a reasonable result. A typical example
* is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that
* uses TrueType bytecode instructions to move and scale all of its
@ -1235,8 +1390,8 @@ FT_BEGIN_HEADER
* FT_FACE_FLAG_VARIATION ::
* [Since 2.9] Set if the current face (or named instance) has been
* altered with @FT_Set_MM_Design_Coordinates,
* @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates.
* This flag is unset by a call to @FT_Set_Named_Instance.
* @FT_Set_Var_Design_Coordinates, @FT_Set_Var_Blend_Coordinates, or
* @FT_Set_MM_WeightVector to select a non-default instance.
*
* FT_FACE_FLAG_SVG ::
* [Since 2.12] The face has an 'SVG~' OpenType table.
@ -1272,6 +1427,13 @@ FT_BEGIN_HEADER
#define FT_FACE_FLAG_SBIX_OVERLAY ( 1L << 18 )
/**************************************************************************
*
* @section:
* font_testing_macros
*
*/
/**************************************************************************
*
* @macro:
@ -1381,6 +1543,13 @@ FT_BEGIN_HEADER
( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) )
/**************************************************************************
*
* @section:
* other_api_data
*
*/
/**************************************************************************
*
* @macro:
@ -1393,6 +1562,13 @@ FT_BEGIN_HEADER
#define FT_HAS_FAST_GLYPHS( face ) 0
/**************************************************************************
*
* @section:
* font_testing_macros
*
*/
/**************************************************************************
*
* @macro:
@ -1451,8 +1627,8 @@ FT_BEGIN_HEADER
*
* @description:
* A macro that returns true whenever a face object has been altered by
* @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or
* @FT_Set_Var_Blend_Coordinates.
* @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates,
* @FT_Set_Var_Blend_Coordinates, or @FT_Set_MM_WeightVector.
*
* @since:
* 2.9
@ -1628,6 +1804,13 @@ FT_BEGIN_HEADER
( !!( (face)->face_flags & FT_FACE_FLAG_SBIX_OVERLAY ) )
/**************************************************************************
*
* @section:
* face_creation
*
*/
/**************************************************************************
*
* @enum:
@ -1654,6 +1837,13 @@ FT_BEGIN_HEADER
#define FT_STYLE_FLAG_BOLD ( 1 << 1 )
/**************************************************************************
*
* @section:
* other_api_data
*
*/
/**************************************************************************
*
* @type:
@ -1666,6 +1856,13 @@ FT_BEGIN_HEADER
typedef struct FT_Size_InternalRec_* FT_Size_Internal;
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
*/
/**************************************************************************
*
* @struct:
@ -1817,6 +2014,13 @@ FT_BEGIN_HEADER
} FT_SizeRec;
/**************************************************************************
*
* @section:
* other_api_data
*
*/
/**************************************************************************
*
* @struct:
@ -1848,6 +2052,13 @@ FT_BEGIN_HEADER
typedef struct FT_Slot_InternalRec_* FT_Slot_Internal;
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @struct:
@ -2092,6 +2303,13 @@ FT_BEGIN_HEADER
/*************************************************************************/
/**************************************************************************
*
* @section:
* library_setup
*
*/
/**************************************************************************
*
* @function:
@ -2149,6 +2367,13 @@ FT_BEGIN_HEADER
FT_Done_FreeType( FT_Library library );
/**************************************************************************
*
* @section:
* face_creation
*
*/
/**************************************************************************
*
* @enum:
@ -2451,7 +2676,7 @@ FT_BEGIN_HEADER
* Each new face object created with this function also owns a default
* @FT_Size object, accessible as `face->size`.
*
* One @FT_Library instance can have multiple face objects, this is,
* One @FT_Library instance can have multiple face objects, that is,
* @FT_Open_Face and its siblings can be called multiple times using the
* same `library` argument.
*
@ -2650,6 +2875,13 @@ FT_BEGIN_HEADER
FT_Done_Face( FT_Face face );
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
*/
/**************************************************************************
*
* @function:
@ -2679,7 +2911,7 @@ FT_BEGIN_HEADER
* silently uses outlines if there is no bitmap for a given glyph index.
*
* For GX and OpenType variation fonts, a bitmap strike makes sense only
* if the default instance is active (this is, no glyph variation takes
* if the default instance is active (that is, no glyph variation takes
* place); otherwise, FreeType simply ignores bitmap strikes. The same
* is true for all named instances that are different from the default
* instance.
@ -2942,6 +3174,13 @@ FT_BEGIN_HEADER
FT_UInt pixel_height );
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @function:
@ -2976,7 +3215,7 @@ FT_BEGIN_HEADER
* glyph may be transformed. See @FT_Set_Transform for the details.
*
* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned
* for invalid CID values (this is, for CID values that don't have a
* for invalid CID values (that is, for CID values that don't have a
* corresponding glyph in the font). See the discussion of the
* @FT_FACE_FLAG_CID_KEYED flag for more details.
*
@ -2990,6 +3229,13 @@ FT_BEGIN_HEADER
FT_Int32 load_flags );
/**************************************************************************
*
* @section:
* character_mapping
*
*/
/**************************************************************************
*
* @function:
@ -3033,6 +3279,13 @@ FT_BEGIN_HEADER
FT_Int32 load_flags );
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @enum:
@ -3172,10 +3425,11 @@ FT_BEGIN_HEADER
*
* [Since 2.12] If the glyph index maps to an entry in the face's
* 'SVG~' table, load the associated SVG document from this table and
* set the `format` field of @FT_GlyphSlotRec to @FT_GLYPH_FORMAT_SVG.
* Note that FreeType itself can't render SVG documents; however, the
* library provides hooks to seamlessly integrate an external renderer.
* See sections @ot_svg_driver and @svg_fonts for more.
* set the `format` field of @FT_GlyphSlotRec to @FT_GLYPH_FORMAT_SVG
* ([since 2.13.1] provided @FT_LOAD_NO_SVG is not set). Note that
* FreeType itself can't render SVG documents; however, the library
* provides hooks to seamlessly integrate an external renderer. See
* sections @ot_svg_driver and @svg_fonts for more.
*
* [Since 2.10, experimental] If the glyph index maps to an entry in
* the face's 'COLR' table with a 'CPAL' palette table (as defined in
@ -3189,6 +3443,9 @@ FT_BEGIN_HEADER
* @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering
* so that the client application can handle blending by itself.
*
* FT_LOAD_NO_SVG ::
* [Since 2.13.1] Ignore SVG glyph data when loading.
*
* FT_LOAD_COMPUTE_METRICS ::
* [Since 2.6.1] Compute glyph metrics from the glyph data, without the
* use of bundled metrics tables (for example, the 'hdmx' table in
@ -3254,6 +3511,7 @@ FT_BEGIN_HEADER
#define FT_LOAD_COLOR ( 1L << 20 )
#define FT_LOAD_COMPUTE_METRICS ( 1L << 21 )
#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 )
#define FT_LOAD_NO_SVG ( 1L << 24 )
/* */
@ -3372,6 +3630,13 @@ FT_BEGIN_HEADER
FT_STATIC_CAST( FT_Render_Mode, ( (x) >> 16 ) & 15 )
/**************************************************************************
*
* @section:
* sizing_and_scaling
*
*/
/**************************************************************************
*
* @function:
@ -3447,6 +3712,13 @@ FT_BEGIN_HEADER
FT_Vector* delta );
/**************************************************************************
*
* @section:
* glyph_retrieval
*
*/
/**************************************************************************
*
* @enum:
@ -3841,6 +4113,13 @@ FT_BEGIN_HEADER
FT_Fixed* akerning );
/**************************************************************************
*
* @section:
* character_mapping
*
*/
/**************************************************************************
*
* @function:
@ -4057,6 +4336,13 @@ FT_BEGIN_HEADER
FT_UInt *agindex );
/**************************************************************************
*
* @section:
* face_creation
*
*/
/**************************************************************************
*
* @function:
@ -4155,6 +4441,13 @@ FT_BEGIN_HEADER
FT_Parameter* properties );
/**************************************************************************
*
* @section:
* information_retrieval
*
*/
/**************************************************************************
*
* @function:
@ -4266,9 +4559,10 @@ FT_BEGIN_HEADER
*
* [Since 2.9] Special PostScript names for named instances are only
* returned if the named instance is set with @FT_Set_Named_Instance (and
* the font has corresponding entries in its 'fvar' table). If
* @FT_IS_VARIATION returns true, the algorithmically derived PostScript
* name is provided, not looking up special entries for named instances.
* the font has corresponding entries in its 'fvar' table or is the
* default named instance). If @FT_IS_VARIATION returns true, the
* algorithmically derived PostScript name is provided, not looking up
* special entries for named instances.
*/
FT_EXPORT( const char* )
FT_Get_Postscript_Name( FT_Face face );
@ -4900,32 +5194,10 @@ FT_BEGIN_HEADER
/**************************************************************************
*
* @section:
* version
*
* @title:
* FreeType Version
*
* @abstract:
* Functions and macros related to FreeType versions.
*
* @description:
* Note that those functions and macros are of limited use because even a
* new release of FreeType with only documentation changes increases the
* version number.
*
* @order:
* FT_Library_Version
*
* FREETYPE_MAJOR
* FREETYPE_MINOR
* FREETYPE_PATCH
*
* FT_Face_CheckTrueTypePatents
* FT_Face_SetUnpatentedHinting
* library_setup
*
*/
/**************************************************************************
*
* @enum:
@ -4950,7 +5222,7 @@ FT_BEGIN_HEADER
*/
#define FREETYPE_MAJOR 2
#define FREETYPE_MINOR 13
#define FREETYPE_PATCH 0
#define FREETYPE_PATCH 2
/**************************************************************************
@ -4992,6 +5264,13 @@ FT_BEGIN_HEADER
FT_Int *apatch );
/**************************************************************************
*
* @section:
* other_api_data
*
*/
/**************************************************************************
*
* @function:

View file

@ -43,61 +43,61 @@ FT_BEGIN_HEADER
* objects, as well as caching information like character maps and glyph
* images while limiting their maximum memory usage.
*
* Note that all types and functions begin with the `FTC_` prefix.
* Note that all types and functions begin with the `FTC_` prefix rather
* than the usual `FT_` prefix in the rest of FreeType.
*
* The cache is highly portable and thus doesn't know anything about the
* fonts installed on your system, or how to access them. This implies
* the following scheme:
* The cache is highly portable and, thus, doesn't know anything about
* the fonts installed on your system, or how to access them. Therefore,
* it requires the following.
*
* First, available or installed font faces are uniquely identified by
* @FTC_FaceID values, provided to the cache by the client. Note that
* the cache only stores and compares these values, and doesn't try to
* interpret them in any way.
* * @FTC_FaceID, an arbitrary non-zero value that uniquely identifies
* available or installed font faces, has to be provided to the
* cache by the client. Note that the cache only stores and compares
* these values and doesn't try to interpret them in any way, but they
* have to be persistent on the client side.
*
* Second, the cache calls, only when needed, a client-provided function
* to convert an @FTC_FaceID into a new @FT_Face object. The latter is
* then completely managed by the cache, including its termination
* through @FT_Done_Face. To monitor termination of face objects, the
* finalizer callback in the `generic` field of the @FT_Face object can
* be used, which might also be used to store the @FTC_FaceID of the
* face.
* * @FTC_Face_Requester, a method to convert an @FTC_FaceID into a new
* @FT_Face object when necessary, has to be provided to the cache by
* the client. The @FT_Face object is completely managed by the cache,
* including its termination through @FT_Done_Face. To monitor
* termination of face objects, the finalizer callback in the `generic`
* field of the @FT_Face object can be used, which might also be used
* to store the @FTC_FaceID of the face.
*
* Clients are free to map face IDs to anything else. The most simple
* usage is to associate them to a (pathname,face_index) pair that is
* used to call @FT_New_Face. However, more complex schemes are also
* possible.
* Clients are free to map face IDs to anything useful. The most simple
* usage is, for example, to associate them to a `{pathname,face_index}`
* pair that is then used by @FTC_Face_Requester to call @FT_New_Face.
* However, more complex schemes are also possible.
*
* Note that for the cache to work correctly, the face ID values must be
* **persistent**, which means that the contents they point to should not
* change at runtime, or that their value should not become invalid.
*
* If this is unavoidable (e.g., when a font is uninstalled at runtime),
* you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
* you should call @FTC_Manager_RemoveFaceID as soon as possible to let
* the cache get rid of any references to the old @FTC_FaceID it may keep
* internally. Failure to do so will lead to incorrect behaviour or even
* crashes.
* crashes in @FTC_Face_Requester.
*
* To use the cache, start with calling @FTC_Manager_New to create a new
* @FTC_Manager object, which models a single cache instance. You can
* then look up @FT_Face and @FT_Size objects with
* @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
* @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively, and
* use them in any FreeType work stream. You can also cache other
* FreeType objects as follows.
*
* If you want to use the charmap caching, call @FTC_CMapCache_New, then
* later use @FTC_CMapCache_Lookup to perform the equivalent of
* * If you want to use the charmap caching, call @FTC_CMapCache_New,
* then later use @FTC_CMapCache_Lookup to perform the equivalent of
* @FT_Get_Char_Index, only much faster.
*
* If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New,
* * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New,
* then later use @FTC_ImageCache_Lookup to retrieve the corresponding
* @FT_Glyph objects from the cache.
*
* If you need lots of small bitmaps, it is much more memory efficient to
* call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This
* returns @FTC_SBitRec structures, which are used to store small bitmaps
* directly. (A small bitmap is one whose metrics and dimensions all fit
* into 8-bit integers).
*
* We hope to also provide a kerning cache in the near future.
*
* * If you need lots of small bitmaps, it is much more memory-efficient
* to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This
* returns @FTC_SBitRec structures, which are used to store small
* bitmaps directly. (A small bitmap is one whose metrics and
* dimensions all fit into 8-bit integers).
*
* @order:
* FTC_Manager

View file

@ -31,9 +31,28 @@
* Core API
*
* @sections:
* version
* basic_types
* base_interface
* library_setup
* face_creation
* font_testing_macros
* sizing_and_scaling
* glyph_retrieval
* character_mapping
* information_retrieval
* other_api_data
*
*/
/**************************************************************************
*
* @chapter:
* extended_api
*
* @title:
* Extended API
*
* @sections:
* glyph_variants
* color_management
* layer_management

View file

@ -134,7 +134,7 @@ FT_BEGIN_HEADER
* each being rounded to the nearest pixel edge, taking care of overshoot
* suppression at small sizes, stem darkening, and scaling.
*
* Hstems (this is, hint values defined in the font to help align
* Hstems (that is, hint values defined in the font to help align
* horizontal features) that fall within a blue zone are said to be
* 'captured' and are aligned to that zone. Uncaptured stems are moved
* in one of four ways, top edge up or down, bottom edge up or down.
@ -446,7 +446,7 @@ FT_BEGIN_HEADER
* at smaller sizes.
*
* For the auto-hinter, stem-darkening is experimental currently and thus
* switched off by default (this is, `no-stem-darkening` is set to TRUE
* switched off by default (that is, `no-stem-darkening` is set to TRUE
* by default). Total consistency with the CFF driver is not achieved
* right now because the emboldening method differs and glyphs must be
* scaled down on the Y-axis to keep outline points inside their
@ -651,11 +651,8 @@ FT_BEGIN_HEADER
* Windows~98; only grayscale and B/W rasterizing is supported.
*
* TT_INTERPRETER_VERSION_38 ::
* Version~38 corresponds to MS rasterizer v.1.9; it is roughly
* equivalent to the hinting provided by DirectWrite ClearType (as can
* be found, for example, in the Internet Explorer~9 running on
* Windows~7). It is used in FreeType to select the 'Infinality'
* subpixel hinting code. The code may be removed in a future version.
* Version~38 is the same Version~40. The original 'Infinality' code is
* no longer available.
*
* TT_INTERPRETER_VERSION_40 ::
* Version~40 corresponds to MS rasterizer v.2.1; it is roughly

View file

@ -19,7 +19,7 @@
/**************************************************************************
*
* Note: A 'raster' is simply a scan-line converter, used to render
* FT_Outlines into FT_Bitmaps.
* `FT_Outline`s into `FT_Bitmap`s.
*
*/
@ -256,6 +256,12 @@ FT_BEGIN_HEADER
* palette ::
* A typeless pointer to the bitmap palette; this field is intended for
* paletted pixel modes. Not used currently.
*
* @note:
* `width` and `rows` refer to the *physical* size of the bitmap, not the
* *logical* one. For example, if @FT_Pixel_Mode is set to
* `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the
* physical one.
*/
typedef struct FT_Bitmap_
{
@ -856,7 +862,7 @@ FT_BEGIN_HEADER
* @FT_SpanFunc that takes the y~coordinate of the span as a parameter.
*
* The anti-aliased rasterizer produces coverage values from 0 to 255,
* this is, from completely transparent to completely opaque.
* that is, from completely transparent to completely opaque.
*/
typedef struct FT_Span_
{

View file

@ -62,7 +62,7 @@ FT_BEGIN_HEADER
* component.
*
* ```
* FT_Trace_Set_Level( "any:7 memory:0 );
* FT_Trace_Set_Level( "any:7 memory:0" );
* ```
*
* @note:

View file

@ -153,7 +153,7 @@ FT_BEGIN_HEADER
* @note:
* The fields `minimum`, `def`, and `maximum` are 16.16 fractional values
* for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the
* values are integers.
* values are whole numbers (i.e., the fractional part is zero).
*/
typedef struct FT_Var_Axis_
{
@ -399,8 +399,8 @@ FT_BEGIN_HEADER
*
* @note:
* The design coordinates are 16.16 fractional values for TrueType GX and
* OpenType variation fonts. For Adobe MM fonts, the values are
* integers.
* OpenType variation fonts. For Adobe MM fonts, the values are supposed
* to be whole numbers (i.e., the fractional part is zero).
*
* [Since 2.8.1] To reset all axes to the default values, call the
* function with `num_coords` set to zero and `coords` set to `NULL`.
@ -446,8 +446,8 @@ FT_BEGIN_HEADER
*
* @note:
* The design coordinates are 16.16 fractional values for TrueType GX and
* OpenType variation fonts. For Adobe MM fonts, the values are
* integers.
* OpenType variation fonts. For Adobe MM fonts, the values are whole
* numbers (i.e., the fractional part is zero).
*
* @since:
* 2.7.1
@ -602,10 +602,12 @@ FT_BEGIN_HEADER
*
* @note:
* Adobe Multiple Master fonts limit the number of designs, and thus the
* length of the weight vector to~16.
* length of the weight vector to 16~elements.
*
* If `len` is zero and `weightvector` is `NULL`, the weight vector array
* is reset to the default values.
* If `len` is larger than zero, this function sets the
* @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field (i.e.,
* @FT_IS_VARIATION will return true). If `len` is zero, this bit flag
* is unset and the weight vector array is reset to the default values.
*
* The Adobe documentation also states that the values in the
* WeightVector array must total 1.0 +/-~0.001. In practice this does
@ -753,6 +755,45 @@ FT_BEGIN_HEADER
FT_Set_Named_Instance( FT_Face face,
FT_UInt instance_index );
/**************************************************************************
*
* @function:
* FT_Get_Default_Named_Instance
*
* @description:
* Retrieve the index of the default named instance, to be used with
* @FT_Set_Named_Instance.
*
* The default instance of a variation font is that instance for which
* the nth axis coordinate is equal to `axis[n].def` (as specified in the
* @FT_MM_Var structure), with~n covering all axes.
*
* FreeType synthesizes a named instance for the default instance if the
* font does not contain such an entry.
*
* @input:
* face ::
* A handle to the source face.
*
* @output:
* instance_index ::
* The index of the default named instance.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* For Adobe MM fonts (which don't have named instances) this function
* always returns zero for `instance_index`.
*
* @since:
* 2.13.1
*/
FT_EXPORT( FT_Error )
FT_Get_Default_Named_Instance( FT_Face face,
FT_UInt *instance_index );
/* */

View file

@ -118,7 +118,7 @@ FT_BEGIN_HEADER
* attachement.
*
* Similarly, the function returns success for an empty outline also
* (doing nothing, this is, not calling any emitter); if necessary, you
* (doing nothing, that is, not calling any emitter); if necessary, you
* should filter this out, too.
*/
FT_EXPORT( FT_Error )

View file

@ -158,7 +158,7 @@ FT_BEGIN_HEADER
FT_Renderer_GetCBoxFunc get_glyph_cbox;
FT_Renderer_SetModeFunc set_mode;
FT_Raster_Funcs* raster_class;
const FT_Raster_Funcs* raster_class;
} FT_Renderer_Class;

View file

@ -68,6 +68,18 @@ FT_BEGIN_HEADER
FT_EXPORT( void )
FT_GlyphSlot_Embolden( FT_GlyphSlot slot );
/* Precisely adjust the glyph weight either horizontally or vertically. */
/* The `xdelta` and `ydelta` values are fractions of the face Em size */
/* (in fixed-point format). Considering that a regular face would have */
/* stem widths on the order of 0.1 Em, a delta of 0.05 (0x0CCC) should */
/* be very noticeable. To increase or decrease the weight, use positive */
/* or negative values, respectively. */
FT_EXPORT( void )
FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot,
FT_Fixed xdelta,
FT_Fixed ydelta );
/* Slant an outline glyph to the right by about 12 degrees. */
FT_EXPORT( void )
FT_GlyphSlot_Oblique( FT_GlyphSlot slot );

View file

@ -229,8 +229,7 @@ FT_BEGIN_HEADER
* A handle to the source stream.
*
* offset ::
* The offset from the start of the stream to seek to if this is a seek
* operation (see note).
* The offset from the start of the stream to seek to.
*
* buffer ::
* The address of the read buffer.
@ -239,16 +238,9 @@ FT_BEGIN_HEADER
* The number of bytes to read from the stream.
*
* @return:
* The number of bytes effectively read by the stream.
*
* @note:
* This function performs a seek *or* a read operation depending on the
* argument values. If `count` is zero, the operation is a seek to
* `offset` bytes. If `count` is >~0, the operation is a read of `count`
* bytes from the current position in the stream, and the `offset` value
* should be ignored.
*
* For seek operations, a non-zero return value indicates an error.
* If count >~0, return the number of bytes effectively read by the
* stream (after seeking to `offset`). If count ==~0, return the status
* of the seek operation (non-zero indicates an error).
*
*/
typedef unsigned long

View file

@ -42,7 +42,10 @@ FT_BEGIN_HEADER
( defined( __cplusplus ) && __cplusplus > 201402L )
# define FALL_THROUGH [[__fallthrough__]]
# elif ( defined( __GNUC__ ) && __GNUC__ >= 7 ) || \
( defined( __clang__ ) && __clang_major__ >= 10 )
( defined( __clang__ ) && \
( defined( __apple_build_version__ ) \
? __apple_build_version__ >= 12000000 \
: __clang_major__ >= 10 ) )
# define FALL_THROUGH __attribute__(( __fallthrough__ ))
# else
# define FALL_THROUGH ( (void)0 )

View file

@ -332,9 +332,9 @@ FT_BEGIN_HEADER
* Based on geometric considerations we use the following inequality to
* identify a degenerate matrix.
*
* 50 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2
* 32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2
*
* Value 50 is heuristic.
* Value 32 is heuristic.
*/
FT_BASE( FT_Bool )
FT_Matrix_Check( const FT_Matrix* matrix );

View file

@ -157,6 +157,7 @@ FT_BEGIN_HEADER
* A handle to a function used to select a new fixed size. It is used
* only if @FT_FACE_FLAG_FIXED_SIZES is set. Can be set to 0 if the
* scaling done in the base layer suffices.
*
* @note:
* Most function pointers, with the exception of `load_glyph`, can be set
* to 0 to indicate a default behaviour.

View file

@ -28,13 +28,19 @@ FT_BEGIN_HEADER
typedef struct GX_ItemVarDataRec_
{
FT_UInt itemCount; /* number of delta sets per item */
FT_UInt regionIdxCount; /* number of region indices */
FT_UInt* regionIndices; /* array of `regionCount' indices; */
/* these index `varRegionList' */
FT_ItemVarDelta* deltaSet; /* array of `itemCount' deltas */
/* use `innerIndex' for this array */
FT_UInt itemCount; /* Number of delta sets per item. */
FT_UInt regionIdxCount; /* Number of region indices. */
FT_UInt* regionIndices; /* Array of `regionCount` indices; */
/* these index `varRegionList`. */
FT_Byte* deltaSet; /* Array of `itemCount` deltas; */
/* use `innerIndex` for this array. */
FT_UShort wordDeltaCount; /* Number of the first 32-bit ints */
/* or 16-bit ints of `deltaSet` */
/* depending on `longWords`. */
FT_Bool longWords; /* If true, `deltaSet` is a 32-bit */
/* array followed by a 16-bit */
/* array, otherwise a 16-bit array */
/* followed by an 8-bit array. */
} GX_ItemVarDataRec, *GX_ItemVarData;

View file

@ -77,6 +77,9 @@ FT_BEGIN_HEADER
typedef void
(*FT_Metrics_Adjust_Func)( FT_Face face );
typedef FT_Error
(*FT_Size_Reset_Func)( FT_Size size );
FT_DEFINE_SERVICE( MetricsVariations )
{
@ -90,6 +93,7 @@ FT_BEGIN_HEADER
FT_VOrg_Adjust_Func vorg_adjust;
FT_Metrics_Adjust_Func metrics_adjust;
FT_Size_Reset_Func size_reset;
};
@ -101,7 +105,8 @@ FT_BEGIN_HEADER
tsb_adjust_, \
bsb_adjust_, \
vorg_adjust_, \
metrics_adjust_ ) \
metrics_adjust_, \
size_reset_ ) \
static const FT_Service_MetricsVariationsRec class_ = \
{ \
hadvance_adjust_, \
@ -111,7 +116,8 @@ FT_BEGIN_HEADER
tsb_adjust_, \
bsb_adjust_, \
vorg_adjust_, \
metrics_adjust_ \
metrics_adjust_, \
size_reset_ \
};
/* */

View file

@ -62,7 +62,7 @@ FT_BEGIN_HEADER
typedef FT_Error
(*FT_Set_MM_Blend_Func)( FT_Face face,
FT_UInt num_coords,
FT_Long* coords );
FT_Fixed* coords );
typedef FT_Error
(*FT_Get_Var_Design_Func)( FT_Face face,
@ -70,13 +70,17 @@ FT_BEGIN_HEADER
FT_Fixed* coords );
typedef FT_Error
(*FT_Set_Instance_Func)( FT_Face face,
(*FT_Set_Named_Instance_Func)( FT_Face face,
FT_UInt instance_index );
typedef FT_Error
(*FT_Get_Default_Named_Instance_Func)( FT_Face face,
FT_UInt *instance_index );
typedef FT_Error
(*FT_Get_MM_Blend_Func)( FT_Face face,
FT_UInt num_coords,
FT_Long* coords );
FT_Fixed* coords );
typedef FT_Error
(*FT_Get_Var_Blend_Func)( FT_Face face,
@ -86,7 +90,7 @@ FT_BEGIN_HEADER
FT_MM_Var* *mm_var );
typedef void
(*FT_Done_Blend_Func)( FT_Face );
(*FT_Done_Blend_Func)( FT_Face face );
typedef FT_Error
(*FT_Set_MM_WeightVector_Func)( FT_Face face,
@ -98,6 +102,9 @@ FT_BEGIN_HEADER
FT_UInt* len,
FT_Fixed* weight_vector );
typedef void
(*FT_Construct_PS_Name_Func)( FT_Face face );
typedef FT_Error
(*FT_Var_Load_Delta_Set_Idx_Map_Func)( FT_Face face,
FT_ULong offset,
@ -134,11 +141,13 @@ FT_BEGIN_HEADER
FT_Get_MM_Var_Func get_mm_var;
FT_Set_Var_Design_Func set_var_design;
FT_Get_Var_Design_Func get_var_design;
FT_Set_Instance_Func set_instance;
FT_Set_Named_Instance_Func set_named_instance;
FT_Get_Default_Named_Instance_Func get_default_named_instance;
FT_Set_MM_WeightVector_Func set_mm_weightvector;
FT_Get_MM_WeightVector_Func get_mm_weightvector;
/* for internal use; only needed for code sharing between modules */
FT_Construct_PS_Name_Func construct_ps_name;
FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map;
FT_Var_Load_Item_Var_Store_Func load_item_var_store;
FT_Var_Get_Item_Delta_Func get_item_delta;
@ -157,9 +166,12 @@ FT_BEGIN_HEADER
get_mm_var_, \
set_var_design_, \
get_var_design_, \
set_instance_, \
set_weightvector_, \
get_weightvector_, \
set_named_instance_, \
get_default_named_instance_, \
set_mm_weightvector_, \
get_mm_weightvector_, \
\
construct_ps_name_, \
load_delta_set_idx_map_, \
load_item_var_store_, \
get_item_delta_, \
@ -176,9 +188,12 @@ FT_BEGIN_HEADER
get_mm_var_, \
set_var_design_, \
get_var_design_, \
set_instance_, \
set_weightvector_, \
get_weightvector_, \
set_named_instance_, \
get_default_named_instance_, \
set_mm_weightvector_, \
get_mm_weightvector_, \
\
construct_ps_name_, \
load_delta_set_idx_map_, \
load_item_var_store_, \
get_item_delta_, \

View file

@ -97,7 +97,7 @@ FT_BEGIN_HEADER
(*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes,
FT_UInt32 unicode );
typedef FT_UInt32
typedef FT_UInt
(*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes,
FT_UInt32 *unicode );

View file

@ -779,13 +779,15 @@ FT_BEGIN_HEADER
/**************************************************************************
*
* @struct:
* TT_Post_20Rec
* TT_Post_NamesRec
*
* @description:
* Postscript names sub-table, format 2.0. Stores the PS name of each
* glyph in the font face.
* Postscript names table, either format 2.0 or 2.5.
*
* @fields:
* loaded ::
* A flag to indicate whether the PS names are loaded.
*
* num_glyphs ::
* The number of named glyphs in the table.
*
@ -798,68 +800,13 @@ FT_BEGIN_HEADER
* glyph_names ::
* The PS names not in Mac Encoding.
*/
typedef struct TT_Post_20Rec_
{
FT_UShort num_glyphs;
FT_UShort num_names;
FT_UShort* glyph_indices;
FT_Char** glyph_names;
} TT_Post_20Rec, *TT_Post_20;
/**************************************************************************
*
* @struct:
* TT_Post_25Rec
*
* @description:
* Postscript names sub-table, format 2.5. Stores the PS name of each
* glyph in the font face.
*
* @fields:
* num_glyphs ::
* The number of glyphs in the table.
*
* offsets ::
* An array of signed offsets in a normal Mac Postscript name encoding.
*/
typedef struct TT_Post_25_
{
FT_UShort num_glyphs;
FT_Char* offsets;
} TT_Post_25Rec, *TT_Post_25;
/**************************************************************************
*
* @struct:
* TT_Post_NamesRec
*
* @description:
* Postscript names table, either format 2.0 or 2.5.
*
* @fields:
* loaded ::
* A flag to indicate whether the PS names are loaded.
*
* format_20 ::
* The sub-table used for format 2.0.
*
* format_25 ::
* The sub-table used for format 2.5.
*/
typedef struct TT_Post_NamesRec_
{
FT_Bool loaded;
union
{
TT_Post_20Rec format_20;
TT_Post_25Rec format_25;
} names;
FT_UShort num_glyphs;
FT_UShort num_names;
FT_UShort* glyph_indices;
FT_Byte** glyph_names;
} TT_Post_NamesRec, *TT_Post_Names;
@ -1253,12 +1200,16 @@ FT_BEGIN_HEADER
* mm ::
* A pointer to the Multiple Masters service.
*
* var ::
* A pointer to the Metrics Variations service.
* tt_var ::
* A pointer to the Metrics Variations service for the "truetype"
* driver.
*
* hdmx ::
* The face's horizontal device metrics ('hdmx' table). This table is
* optional in TrueType/OpenType fonts.
* face_var ::
* A pointer to the Metrics Variations service for this `TT_Face`'s
* driver.
*
* psaux ::
* A pointer to the PostScript Auxiliary service.
*
* gasp ::
* The grid-fitting and scaling properties table ('gasp'). This table
@ -1364,6 +1315,12 @@ FT_BEGIN_HEADER
* var_postscript_prefix_len ::
* The length of the `var_postscript_prefix` string.
*
* var_default_named_instance ::
* The index of the default named instance.
*
* non_var_style_name ::
* The non-variation style name, used as a backup.
*
* horz_metrics_size ::
* The size of the 'hmtx' table.
*
@ -1410,14 +1367,6 @@ FT_BEGIN_HEADER
* A mapping between the strike indices exposed by the API and the
* indices used in the font's sbit table.
*
* cpal ::
* A pointer to data related to the 'CPAL' table. `NULL` if the table
* is not available.
*
* colr ::
* A pointer to data related to the 'COLR' table. `NULL` if the table
* is not available.
*
* kern_table ::
* A pointer to the 'kern' table.
*
@ -1445,19 +1394,23 @@ FT_BEGIN_HEADER
* vert_metrics_offset ::
* The file offset of the 'vmtx' table.
*
* sph_found_func_flags ::
* Flags identifying special bytecode functions (used by the v38
* implementation of the bytecode interpreter).
*
* sph_compatibility_mode ::
* This flag is set if we are in ClearType backward compatibility mode
* (used by the v38 implementation of the bytecode interpreter).
*
* ebdt_start ::
* The file offset of the sbit data table (CBDT, bdat, etc.).
*
* ebdt_size ::
* The size of the sbit data table.
*
* cpal ::
* A pointer to data related to the 'CPAL' table. `NULL` if the table
* is not available.
*
* colr ::
* A pointer to data related to the 'COLR' table. `NULL` if the table
* is not available.
*
* svg ::
* A pointer to data related to the 'SVG' table. `NULL` if the table
* is not available.
*/
typedef struct TT_FaceRec_
{
@ -1508,8 +1461,14 @@ FT_BEGIN_HEADER
void* mm;
/* a typeless pointer to the FT_Service_MetricsVariationsRec table */
/* used to handle the HVAR, VVAR, and MVAR OpenType tables */
void* var;
/* used to handle the HVAR, VVAR, and MVAR OpenType tables by the */
/* "truetype" driver */
void* tt_var;
/* a typeless pointer to the FT_Service_MetricsVariationsRec table */
/* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */
/* TT_Face's driver */
void* face_var; /* since 2.13.1 */
#endif
/* a typeless pointer to the PostScript Aux service */
@ -1591,6 +1550,9 @@ FT_BEGIN_HEADER
const char* var_postscript_prefix; /* since 2.7.2 */
FT_UInt var_postscript_prefix_len; /* since 2.7.2 */
FT_UInt var_default_named_instance; /* since 2.13.1 */
const char* non_var_style_name; /* since 2.13.1 */
#endif
/* since version 2.2 */
@ -1627,13 +1589,6 @@ FT_BEGIN_HEADER
FT_ULong horz_metrics_offset;
FT_ULong vert_metrics_offset;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
/* since 2.4.12 */
FT_ULong sph_found_func_flags; /* special functions found */
/* for this face */
FT_Bool sph_compatibility_mode;
#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/* since 2.7 */
FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */

View file

@ -1,4 +1,4 @@
major=30
minor=3
minor=4
# note: If bumping the major, also bump major for libXft, libXfont2
# and libfontconfig

View file

@ -89,7 +89,7 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
"ت ث ط ظ ك"
// We don't necessarily have access to medial forms via Unicode in case
// Arabic presentational forms are missing. The only character that is
// guaranteed to have the same vertical position with joining (this is,
// guaranteed to have the same vertical position with joining (that is,
// non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both
// round and flat curves.
AF_BLUE_STRING_ARABIC_JOIN

View file

@ -417,15 +417,13 @@
{
FT_Int nn;
FT_Int first = 0;
FT_Int last = -1;
FT_Int pp, first, last;
for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ )
last = -1;
for ( nn = 0; nn < outline.n_contours; nn++ )
{
FT_Int pp;
first = last + 1;
last = outline.contours[nn];
/* Avoid single-point contours since they are never rasterized. */
@ -570,7 +568,7 @@
FT_Face face )
{
FT_Bool started = 0, same_width = 1;
FT_Fixed advance = 0, old_advance = 0;
FT_Long advance = 0, old_advance = 0;
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
@ -635,9 +633,10 @@
/* Initialize global metrics. */
FT_LOCAL_DEF( FT_Error )
af_cjk_metrics_init( AF_CJKMetrics metrics,
af_cjk_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */
FT_Face face )
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
FT_CharMap oldmap = face->charmap;
@ -756,9 +755,12 @@
/* Scale global values in both directions. */
FT_LOCAL_DEF( void )
af_cjk_metrics_scale( AF_CJKMetrics metrics,
af_cjk_metrics_scale( AF_StyleMetrics metrics_, /* AF_CJKMetrics */
AF_Scaler scaler )
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
/* we copy the whole structure since the x and y scaling values */
/* are not modified, contrary to e.g. the `latin' auto-hinter */
metrics->root.scaler = *scaler;
@ -771,11 +773,14 @@
/* Extract standard_width from writing system/script specific */
/* metrics class. */
FT_LOCAL_DEF( void )
af_cjk_get_standard_widths( AF_CJKMetrics metrics,
FT_CALLBACK_DEF( void )
af_cjk_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */
FT_Pos* stdHW,
FT_Pos* stdVW )
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
if ( stdHW )
*stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
@ -1377,8 +1382,9 @@
FT_LOCAL_DEF( FT_Error )
af_cjk_hints_init( AF_GlyphHints hints,
AF_CJKMetrics metrics )
AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
FT_Render_Mode mode;
FT_UInt32 scaler_flags, other_flags;
@ -1628,7 +1634,7 @@
stem_edge->pos = base_edge->pos + fitted_width;
FT_TRACE5(( " CJKLINK: edge %ld @%d (opos=%.2f) linked to %.2f,"
FT_TRACE5(( " CJKLINK: edge %td @%d (opos=%.2f) linked to %.2f,"
" dist was %.2f, now %.2f\n",
stem_edge - hints->axis[dim].edges, stem_edge->fpos,
(double)stem_edge->opos / 64,
@ -1852,7 +1858,7 @@
continue;
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( " CJKBLUE: edge %ld @%d (opos=%.2f) snapped to %.2f,"
FT_TRACE5(( " CJKBLUE: edge %td @%d (opos=%.2f) snapped to %.2f,"
" was %.2f\n",
edge1 - edges, edge1->fpos, (double)edge1->opos / 64,
(double)blue->fit / 64, (double)edge1->pos / 64 ));
@ -1916,7 +1922,7 @@
/* this should not happen, but it's better to be safe */
if ( edge2->blue_edge )
{
FT_TRACE5(( "ASSERTION FAILED for edge %ld\n", edge2-edges ));
FT_TRACE5(( "ASSERTION FAILED for edge %td\n", edge2 - edges ));
af_cjk_align_linked_edge( hints, dim, edge2, edge );
edge->flags |= AF_EDGE_DONE;
@ -2271,8 +2277,10 @@
af_cjk_hints_apply( FT_UInt glyph_index,
AF_GlyphHints hints,
FT_Outline* outline,
AF_CJKMetrics metrics )
AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
FT_Error error;
int dim;

View file

@ -103,22 +103,22 @@ FT_BEGIN_HEADER
#ifdef AF_CONFIG_OPTION_CJK
FT_LOCAL( FT_Error )
af_cjk_metrics_init( AF_CJKMetrics metrics,
af_cjk_metrics_init( AF_StyleMetrics metrics,
FT_Face face );
FT_LOCAL( void )
af_cjk_metrics_scale( AF_CJKMetrics metrics,
af_cjk_metrics_scale( AF_StyleMetrics metrics,
AF_Scaler scaler );
FT_LOCAL( FT_Error )
af_cjk_hints_init( AF_GlyphHints hints,
AF_CJKMetrics metrics );
AF_StyleMetrics metrics );
FT_LOCAL( FT_Error )
af_cjk_hints_apply( FT_UInt glyph_index,
AF_GlyphHints hints,
FT_Outline* outline,
AF_CJKMetrics metrics );
AF_StyleMetrics metrics );
/* shared; called from afindic.c */
FT_LOCAL( void )

View file

@ -376,8 +376,11 @@
FT_LOCAL_DEF( void )
af_face_globals_free( AF_FaceGlobals globals )
af_face_globals_free( void* globals_ )
{
AF_FaceGlobals globals = (AF_FaceGlobals)globals_;
if ( globals )
{
FT_Memory memory = globals->face->memory;

View file

@ -156,7 +156,7 @@ FT_BEGIN_HEADER
AF_StyleMetrics *ametrics );
FT_LOCAL( void )
af_face_globals_free( AF_FaceGlobals globals );
af_face_globals_free( void* globals );
FT_LOCAL( FT_Bool )
af_face_globals_is_digit( AF_FaceGlobals globals,

View file

@ -321,6 +321,7 @@
static char*
af_print_idx( char* p,
size_t n,
int idx )
{
if ( idx == -1 )
@ -330,7 +331,7 @@
p[2] = '\0';
}
else
ft_sprintf( p, "%d", idx );
ft_snprintf( p, n, "%d", idx );
return p;
}
@ -457,12 +458,12 @@
" %5d %5d %7.2f %7.2f %7.2f %7.2f"
" %5s %5s %5s %5s\n",
point_idx,
af_print_idx( buf1,
af_print_idx( buf1, 16,
af_get_edge_index( hints, segment_idx_1, 1 ) ),
af_print_idx( buf2, segment_idx_1 ),
af_print_idx( buf3,
af_print_idx( buf2, 16, segment_idx_1 ),
af_print_idx( buf3, 16,
af_get_edge_index( hints, segment_idx_0, 0 ) ),
af_print_idx( buf4, segment_idx_0 ),
af_print_idx( buf4, 16, segment_idx_0 ),
( point->flags & AF_FLAG_NEAR )
? " near "
: ( point->flags & AF_FLAG_WEAK_INTERPOLATION )
@ -476,16 +477,20 @@
(double)point->x / 64,
(double)point->y / 64,
af_print_idx( buf5, af_get_strong_edge_index( hints,
af_print_idx( buf5, 16,
af_get_strong_edge_index( hints,
point->before,
1 ) ),
af_print_idx( buf6, af_get_strong_edge_index( hints,
af_print_idx( buf6, 16,
af_get_strong_edge_index( hints,
point->after,
1 ) ),
af_print_idx( buf7, af_get_strong_edge_index( hints,
af_print_idx( buf7, 16,
af_get_strong_edge_index( hints,
point->before,
0 ) ),
af_print_idx( buf8, af_get_strong_edge_index( hints,
af_print_idx( buf8, 16,
af_get_strong_edge_index( hints,
point->after,
0 ) ) ));
}
@ -574,9 +579,12 @@
AF_INDEX_NUM( seg->first, points ),
AF_INDEX_NUM( seg->last, points ),
af_print_idx( buf1, AF_INDEX_NUM( seg->link, segments ) ),
af_print_idx( buf2, AF_INDEX_NUM( seg->serif, segments ) ),
af_print_idx( buf3, AF_INDEX_NUM( seg->edge, edges ) ),
af_print_idx( buf1, 16,
AF_INDEX_NUM( seg->link, segments ) ),
af_print_idx( buf2, 16,
AF_INDEX_NUM( seg->serif, segments ) ),
af_print_idx( buf3, 16,
AF_INDEX_NUM( seg->edge, edges ) ),
seg->height,
seg->height - ( seg->max_coord - seg->min_coord ),
@ -716,8 +724,10 @@
AF_INDEX_NUM( edge, edges ),
(double)(int)edge->opos / 64,
af_dir_str( (AF_Direction)edge->dir ),
af_print_idx( buf1, AF_INDEX_NUM( edge->link, edges ) ),
af_print_idx( buf2, AF_INDEX_NUM( edge->serif, edges ) ),
af_print_idx( buf1, 16,
AF_INDEX_NUM( edge->link, edges ) ),
af_print_idx( buf2, 16,
AF_INDEX_NUM( edge->serif, edges ) ),
edge->blue_edge ? 'y' : 'n',
(double)edge->opos / 64,

View file

@ -28,9 +28,12 @@
static FT_Error
af_indic_metrics_init( AF_CJKMetrics metrics,
af_indic_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */
FT_Face face )
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
/* skip blue zone init in CJK routines */
FT_CharMap oldmap = face->charmap;
@ -55,7 +58,7 @@
static void
af_indic_metrics_scale( AF_CJKMetrics metrics,
af_indic_metrics_scale( AF_StyleMetrics metrics,
AF_Scaler scaler )
{
/* use CJK routines */
@ -65,7 +68,7 @@
static FT_Error
af_indic_hints_init( AF_GlyphHints hints,
AF_CJKMetrics metrics )
AF_StyleMetrics metrics )
{
/* use CJK routines */
return af_cjk_hints_init( hints, metrics );
@ -76,7 +79,7 @@
af_indic_hints_apply( FT_UInt glyph_index,
AF_GlyphHints hints,
FT_Outline* outline,
AF_CJKMetrics metrics )
AF_StyleMetrics metrics )
{
/* use CJK routines */
return af_cjk_hints_apply( glyph_index, hints, outline, metrics );
@ -87,10 +90,13 @@
/* metrics class. */
static void
af_indic_get_standard_widths( AF_CJKMetrics metrics,
af_indic_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */
FT_Pos* stdHW,
FT_Pos* stdVW )
{
AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_;
if ( stdHW )
*stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;

View file

@ -496,22 +496,19 @@
/* now compute min or max point indices and coordinates */
points = outline.points;
best_point = -1;
best_contour_first = -1;
best_contour_last = -1;
best_y = 0; /* make compiler happy */
best_contour_first = 0; /* ditto */
best_contour_last = 0; /* ditto */
{
FT_Int nn;
FT_Int first = 0;
FT_Int last = -1;
FT_Int pp, first, last;
for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ )
last = -1;
for ( nn = 0; nn < outline.n_contours; nn++ )
{
FT_Int old_best_point = best_point;
FT_Int pp;
first = last + 1;
last = outline.contours[nn];
/* Avoid single-point contours since they are never */
@ -551,7 +548,7 @@
}
}
if ( best_point != old_best_point )
if ( best_point > best_contour_last )
{
best_contour_first = first;
best_contour_last = last;
@ -1025,7 +1022,7 @@
{
*a = *b;
FT_TRACE5(( "blue zone overlap:"
" adjusting %s %ld to %ld\n",
" adjusting %s %td to %ld\n",
a_is_top ? "overshoot" : "reference",
blue_sorted[i] - axis->blues,
*a ));
@ -1069,7 +1066,7 @@
FT_Face face )
{
FT_Bool started = 0, same_width = 1;
FT_Fixed advance = 0, old_advance = 0;
FT_Long advance = 0, old_advance = 0;
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
@ -1134,9 +1131,11 @@
/* Initialize global metrics. */
FT_LOCAL_DEF( FT_Error )
af_latin_metrics_init( AF_LatinMetrics metrics,
af_latin_metrics_init( AF_StyleMetrics metrics_, /* AF_LatinMetrics */
FT_Face face )
{
AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
FT_Error error = FT_Err_Ok;
FT_CharMap oldmap = face->charmap;
@ -1489,9 +1488,12 @@
/* Scale global values in both directions. */
FT_LOCAL_DEF( void )
af_latin_metrics_scale( AF_LatinMetrics metrics,
af_latin_metrics_scale( AF_StyleMetrics metrics_, /* AF_LatinMetrics */
AF_Scaler scaler )
{
AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
metrics->root.scaler.render_mode = scaler->render_mode;
metrics->root.scaler.face = scaler->face;
metrics->root.scaler.flags = scaler->flags;
@ -1504,11 +1506,14 @@
/* Extract standard_width from writing system/script specific */
/* metrics class. */
FT_LOCAL_DEF( void )
af_latin_get_standard_widths( AF_LatinMetrics metrics,
FT_CALLBACK_DEF( void )
af_latin_get_standard_widths( AF_StyleMetrics metrics_, /* AF_LatinMetrics */
FT_Pos* stdHW,
FT_Pos* stdVW )
{
AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
if ( stdHW )
*stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
@ -2041,7 +2046,7 @@
max = seg2->max_coord;
/* compute maximum coordinate difference of the two segments */
/* (this is, how much they overlap) */
/* (that is, how much they overlap) */
len = max - min;
if ( len >= len_threshold )
{
@ -2610,8 +2615,10 @@
static FT_Error
af_latin_hints_init( AF_GlyphHints hints,
AF_LatinMetrics metrics )
AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */
{
AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
FT_Render_Mode mode;
FT_UInt32 scaler_flags, other_flags;
FT_Face face = metrics->root.scaler.face;
@ -2953,7 +2960,7 @@
stem_edge->pos = base_edge->pos + fitted_width;
FT_TRACE5(( " LINK: edge %ld (opos=%.2f) linked to %.2f,"
FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f,"
" dist was %.2f, now %.2f\n",
stem_edge - hints->axis[dim].edges,
(double)stem_edge->opos / 64, (double)stem_edge->pos / 64,
@ -3078,13 +3085,13 @@
#ifdef FT_DEBUG_LEVEL_TRACE
if ( !anchor )
FT_TRACE5(( " BLUE_ANCHOR: edge %ld (opos=%.2f) snapped to %.2f,"
" was %.2f (anchor=edge %ld)\n",
FT_TRACE5(( " BLUE_ANCHOR: edge %td (opos=%.2f) snapped to %.2f,"
" was %.2f (anchor=edge %td)\n",
edge1 - edges,
(double)edge1->opos / 64, (double)blue->fit / 64,
(double)edge1->pos / 64, edge - edges ));
else
FT_TRACE5(( " BLUE: edge %ld (opos=%.2f) snapped to %.2f,"
FT_TRACE5(( " BLUE: edge %td (opos=%.2f) snapped to %.2f,"
" was %.2f\n",
edge1 - edges,
(double)edge1->opos / 64, (double)blue->fit / 64,
@ -3134,7 +3141,7 @@
/* this should not happen, but it's better to be safe */
if ( edge2->blue_edge )
{
FT_TRACE5(( " ASSERTION FAILED for edge %ld\n", edge2 - edges ));
FT_TRACE5(( " ASSERTION FAILED for edge %td\n", edge2 - edges ));
af_latin_align_linked_edge( hints, dim, edge2, edge );
edge->flags |= AF_EDGE_DONE;
@ -3202,7 +3209,7 @@
anchor = edge;
edge->flags |= AF_EDGE_DONE;
FT_TRACE5(( " ANCHOR: edge %ld (opos=%.2f) and %ld (opos=%.2f)"
FT_TRACE5(( " ANCHOR: edge %td (opos=%.2f) and %td (opos=%.2f)"
" snapped to %.2f and %.2f\n",
edge - edges, (double)edge->opos / 64,
edge2 - edges, (double)edge2->opos / 64,
@ -3231,7 +3238,7 @@
if ( edge2->flags & AF_EDGE_DONE )
{
FT_TRACE5(( " ADJUST: edge %ld (pos=%.2f) moved to %.2f\n",
FT_TRACE5(( " ADJUST: edge %td (pos=%.2f) moved to %.2f\n",
edge - edges, (double)edge->pos / 64,
(double)( edge2->pos - cur_len ) / 64 ));
@ -3272,7 +3279,7 @@
edge->pos = cur_pos1 - cur_len / 2;
edge2->pos = cur_pos1 + cur_len / 2;
FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)"
FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)"
" snapped to %.2f and %.2f\n",
edge - edges, (double)edge->opos / 64,
edge2 - edges, (double)edge2->opos / 64,
@ -3303,7 +3310,7 @@
edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
edge2->pos = edge->pos + cur_len;
FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)"
FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)"
" snapped to %.2f and %.2f\n",
edge - edges, (double)edge->opos / 64,
edge2 - edges, (double)edge2->opos / 64,
@ -3326,7 +3333,7 @@
if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
{
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n",
edge - edges,
(double)edge->pos / 64,
(double)edge[-1].pos / 64 ));
@ -3428,7 +3435,7 @@
if ( delta < 64 + 16 )
{
af_latin_align_serif_edge( hints, edge->serif, edge );
FT_TRACE5(( " SERIF: edge %ld (opos=%.2f) serif to %ld (opos=%.2f)"
FT_TRACE5(( " SERIF: edge %td (opos=%.2f) serif to %td (opos=%.2f)"
" aligned to %.2f\n",
edge - edges, (double)edge->opos / 64,
edge->serif - edges, (double)edge->serif->opos / 64,
@ -3438,7 +3445,7 @@
{
edge->pos = FT_PIX_ROUND( edge->opos );
anchor = edge;
FT_TRACE5(( " SERIF_ANCHOR: edge %ld (opos=%.2f)"
FT_TRACE5(( " SERIF_ANCHOR: edge %td (opos=%.2f)"
" snapped to %.2f\n",
edge - edges,
(double)edge->opos / 64, (double)edge->pos / 64 ));
@ -3467,8 +3474,8 @@
after->pos - before->pos,
after->opos - before->opos );
FT_TRACE5(( " SERIF_LINK1: edge %ld (opos=%.2f) snapped to %.2f"
" from %ld (opos=%.2f)\n",
FT_TRACE5(( " SERIF_LINK1: edge %td (opos=%.2f) snapped to %.2f"
" from %td (opos=%.2f)\n",
edge - edges, (double)edge->opos / 64,
(double)edge->pos / 64,
before - edges, (double)before->opos / 64 ));
@ -3477,7 +3484,7 @@
{
edge->pos = anchor->pos +
( ( edge->opos - anchor->opos + 16 ) & ~31 );
FT_TRACE5(( " SERIF_LINK2: edge %ld (opos=%.2f)"
FT_TRACE5(( " SERIF_LINK2: edge %td (opos=%.2f)"
" snapped to %.2f\n",
edge - edges,
(double)edge->opos / 64, (double)edge->pos / 64 ));
@ -3498,7 +3505,7 @@
if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
{
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n",
edge - edges,
(double)edge->pos / 64,
(double)edge[-1].pos / 64 ));
@ -3519,7 +3526,7 @@
if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
{
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n",
edge - edges,
(double)edge->pos / 64,
(double)edge[1].pos / 64 ));
@ -3547,8 +3554,10 @@
af_latin_hints_apply( FT_UInt glyph_index,
AF_GlyphHints hints,
FT_Outline* outline,
AF_LatinMetrics metrics )
AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */
{
AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
FT_Error error;
int dim;

View file

@ -116,11 +116,11 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_Error )
af_latin_metrics_init( AF_LatinMetrics metrics,
af_latin_metrics_init( AF_StyleMetrics metrics,
FT_Face face );
FT_LOCAL( void )
af_latin_metrics_scale( AF_LatinMetrics metrics,
af_latin_metrics_scale( AF_StyleMetrics metrics,
AF_Scaler scaler );
FT_LOCAL( void )

View file

@ -55,10 +55,8 @@
error = af_face_globals_new( face, &loader->globals, module );
if ( !error )
{
face->autohint.data =
(FT_Pointer)loader->globals;
face->autohint.finalizer =
(FT_Generic_Finalizer)af_face_globals_free;
face->autohint.data = (FT_Pointer)loader->globals;
face->autohint.finalizer = af_face_globals_free;
}
}

View file

@ -89,10 +89,8 @@
error = af_face_globals_new( face, &globals, module );
if ( !error )
{
face->autohint.data =
(FT_Pointer)globals;
face->autohint.finalizer =
(FT_Generic_Finalizer)af_face_globals_free;
face->autohint.data = (FT_Pointer)globals;
face->autohint.finalizer = af_face_globals_free;
}
}
@ -374,8 +372,9 @@
FT_DEFINE_SERVICE_PROPERTIESREC(
af_service_properties,
(FT_Properties_SetFunc)af_property_set, /* set_property */
(FT_Properties_GetFunc)af_property_get ) /* get_property */
af_property_set, /* FT_Properties_SetFunc set_property */
af_property_get /* FT_Properties_GetFunc get_property */
)
FT_DEFINE_SERVICEDESCREC1(
@ -430,12 +429,14 @@
FT_CALLBACK_DEF( FT_Error )
af_autofitter_load_glyph( AF_Module module,
af_autofitter_load_glyph( FT_AutoHinter module_,
FT_GlyphSlot slot,
FT_Size size,
FT_UInt glyph_index,
FT_Int32 load_flags )
{
AF_Module module = (AF_Module)module_;
FT_Error error = FT_Err_Ok;
FT_Memory memory = module->root.library->memory;
@ -499,10 +500,10 @@
FT_DEFINE_AUTOHINTER_INTERFACE(
af_autofitter_interface,
NULL, /* reset_face */
NULL, /* get_global_hints */
NULL, /* done_global_hints */
(FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph /* load_glyph */
NULL, /* FT_AutoHinter_GlobalResetFunc reset_face */
NULL, /* FT_AutoHinter_GlobalGetFunc get_global_hints */
NULL, /* FT_AutoHinter_GlobalDoneFunc done_global_hints */
af_autofitter_load_glyph /* FT_AutoHinter_GlyphLoadFunc load_glyph */
)
FT_DEFINE_MODULE(
@ -517,9 +518,9 @@
(const void*)&af_autofitter_interface,
(FT_Module_Constructor)af_autofitter_init, /* module_init */
(FT_Module_Destructor) af_autofitter_done, /* module_done */
(FT_Module_Requester) af_get_interface /* get_interface */
af_autofitter_init, /* FT_Module_Constructor module_init */
af_autofitter_done, /* FT_Module_Destructor module_done */
af_get_interface /* FT_Module_Requester get_interface */
)

View file

@ -258,7 +258,7 @@
/*
* We now check whether we can construct blue zones, using glyphs
* covered by the feature only. In case there is not a single zone
* (this is, not a single character is covered), we skip this coverage.
* (that is, not a single character is covered), we skip this coverage.
*
*/
if ( style_class->coverage != AF_COVERAGE_DEFAULT )
@ -313,9 +313,9 @@
* hinted and usually rendered glyph.
*
* Consider the superscript feature of font `pala.ttf': Some of the
* glyphs are `real', this is, they have a zero vertical offset, but
* glyphs are `real', that is, they have a zero vertical offset, but
* most of them are small caps glyphs shifted up to the superscript
* position (this is, the `sups' feature is present in both the GSUB and
* position (that is, the `sups' feature is present in both the GSUB and
* GPOS tables). The code for blue zones computation actually uses a
* feature's y offset so that the `real' glyphs get correct hints. But
* later on it is impossible to decide whether a glyph index belongs to,

View file

@ -108,7 +108,7 @@ hb_ft_font_create_ (FT_Face ft_face,
#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
/* ANSI C doesn't like empty source files */
typedef int _ft_hb_dummy;
typedef int ft_hb_dummy_;
#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */

View file

@ -82,10 +82,13 @@
* @Return:
* Always 0. Needed for the interface only.
*/
static int
BBox_Move_To( FT_Vector* to,
TBBox_Rec* user )
FT_CALLBACK_DEF( int )
BBox_Move_To( const FT_Vector* to,
void* user_ )
{
TBBox_Rec* user = (TBBox_Rec*)user_;
FT_UPDATE_BBOX( to, user->bbox );
user->last = *to;
@ -116,10 +119,13 @@
* @Return:
* Always 0. Needed for the interface only.
*/
static int
BBox_Line_To( FT_Vector* to,
TBBox_Rec* user )
FT_CALLBACK_DEF( int )
BBox_Line_To( const FT_Vector* to,
void* user_ )
{
TBBox_Rec* user = (TBBox_Rec*)user_;
user->last = *to;
return 0;
@ -205,11 +211,14 @@
* In the case of a non-monotonous arc, we compute directly the
* extremum coordinates, as it is sufficiently fast.
*/
static int
BBox_Conic_To( FT_Vector* control,
FT_Vector* to,
TBBox_Rec* user )
FT_CALLBACK_DEF( int )
BBox_Conic_To( const FT_Vector* control,
const FT_Vector* to,
void* user_ )
{
TBBox_Rec* user = (TBBox_Rec*)user_;
/* in case `to' is implicit and not included in bbox yet */
FT_UPDATE_BBOX( to, user->bbox );
@ -410,12 +419,15 @@
* In the case of a non-monotonous arc, we don't compute directly
* extremum coordinates, we subdivide instead.
*/
static int
BBox_Cubic_To( FT_Vector* control1,
FT_Vector* control2,
FT_Vector* to,
TBBox_Rec* user )
FT_CALLBACK_DEF( int )
BBox_Cubic_To( const FT_Vector* control1,
const FT_Vector* control2,
const FT_Vector* to,
void* user_ )
{
TBBox_Rec* user = (TBBox_Rec*)user_;
/* We don't need to check `to' since it is always an on-point, */
/* thus within the bbox. Only segments with an off-point outside */
/* the bbox can possibly reach new extreme values. */

View file

@ -749,65 +749,43 @@
FT_BASE_DEF( FT_Bool )
FT_Matrix_Check( const FT_Matrix* matrix )
{
FT_Matrix m;
FT_Fixed val[4];
FT_Fixed nonzero_minval, maxval;
FT_Fixed temp1, temp2;
FT_UInt i;
FT_Fixed xx, xy, yx, yy;
FT_Fixed val;
FT_Int shift;
FT_ULong temp1, temp2;
if ( !matrix )
return 0;
val[0] = FT_ABS( matrix->xx );
val[1] = FT_ABS( matrix->xy );
val[2] = FT_ABS( matrix->yx );
val[3] = FT_ABS( matrix->yy );
xx = matrix->xx;
xy = matrix->xy;
yx = matrix->yx;
yy = matrix->yy;
val = FT_ABS( xx ) | FT_ABS( xy ) | FT_ABS( yx ) | FT_ABS( yy );
/*
* To avoid overflow, we ensure that each value is not larger than
*
* int(sqrt(2^31 / 4)) = 23170 ;
*
* we also check that no value becomes zero if we have to scale.
*/
maxval = 0;
nonzero_minval = FT_LONG_MAX;
for ( i = 0; i < 4; i++ )
{
if ( val[i] > maxval )
maxval = val[i];
if ( val[i] && val[i] < nonzero_minval )
nonzero_minval = val[i];
}
/* we only handle 32bit values */
if ( maxval > 0x7FFFFFFFL )
/* we only handle non-zero 32-bit values */
if ( !val || val > 0x7FFFFFFFL )
return 0;
if ( maxval > 23170 )
/* Scale matrix to avoid the temp1 overflow, which is */
/* more stringent than avoiding the temp2 overflow. */
shift = FT_MSB( val ) - 12;
if ( shift > 0 )
{
FT_Fixed scale = FT_DivFix( maxval, 23170 );
if ( !FT_DivFix( nonzero_minval, scale ) )
return 0; /* value range too large */
m.xx = FT_DivFix( matrix->xx, scale );
m.xy = FT_DivFix( matrix->xy, scale );
m.yx = FT_DivFix( matrix->yx, scale );
m.yy = FT_DivFix( matrix->yy, scale );
xx >>= shift;
xy >>= shift;
yx >>= shift;
yy >>= shift;
}
else
m = *matrix;
temp1 = FT_ABS( m.xx * m.yy - m.xy * m.yx );
temp2 = m.xx * m.xx + m.xy * m.xy + m.yx * m.yx + m.yy * m.yy;
temp1 = 32U * (FT_ULong)FT_ABS( xx * yy - xy * yx );
temp2 = (FT_ULong)( xx * xx ) + (FT_ULong)( xy * xy ) +
(FT_ULong)( yx * yx ) + (FT_ULong)( yy * yy );
if ( temp1 == 0 ||
temp2 / temp1 > 50 )
if ( temp1 <= temp2 )
return 0;
return 1;
@ -1061,7 +1039,7 @@
/* */
/* This approach has the advantage that the angle between */
/* `in' and `out' is not checked. In case one of the two */
/* vectors is `dominant', this is, much larger than the */
/* vectors is `dominant', that is, much larger than the */
/* other vector, we thus always have a flat corner. */
/* */
/* hypotenuse */
@ -1092,9 +1070,6 @@
{
FT_UInt i;
FT_Int64 temp;
#ifndef FT_INT64
FT_Int64 halfUnit;
#endif
#ifdef FT_INT64
@ -1103,7 +1078,7 @@
for ( i = 0; i < count; ++i )
temp += (FT_Int64)s[i] * f[i];
return ( temp + 0x8000 ) >> 16;
return (FT_Int32)( ( temp + 0x8000 ) >> 16 );
#else
temp.hi = 0;
temp.lo = 0;
@ -1139,13 +1114,10 @@
FT_Add64( &temp, &multResult, &temp );
}
/* Round value. */
halfUnit.hi = 0;
halfUnit.lo = 0x8000;
FT_Add64( &temp, &halfUnit, &temp );
/* Shift and round value. */
return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) )
+ ( 1 & ( temp.lo >> 15 ) ) );
return (FT_Int32)( ( (FT_Int32)( temp.hi & 0xFFFF ) << 16 ) |
( temp.lo >> 16 ) );
#endif /* !FT_INT64 */

View file

@ -963,7 +963,7 @@
#else /* !FT_DEBUG_MEMORY */
/* ANSI C doesn't like empty source files */
typedef int _debug_mem_dummy;
typedef int debug_mem_dummy_;
#endif /* !FT_DEBUG_MEMORY */

View file

@ -1082,7 +1082,7 @@
#else /* !FT_MACINTOSH */
/* ANSI C doesn't like empty source files */
typedef int _ft_mac_dummy;
typedef int ft_mac_dummy_;
#endif /* !FT_MACINTOSH */

View file

@ -185,6 +185,14 @@
error = FT_ERR( Invalid_Argument );
if ( service->set_mm_design )
error = service->set_mm_design( face, num_coords, coords );
if ( !error )
{
if ( num_coords )
face->face_flags |= FT_FACE_FLAG_VARIATION;
else
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
}
}
/* enforce recomputation of auto-hinting data */
@ -220,6 +228,14 @@
error = FT_ERR( Invalid_Argument );
if ( service->set_mm_weightvector )
error = service->set_mm_weightvector( face, len, weightvector );
if ( !error )
{
if ( len )
face->face_flags |= FT_FACE_FLAG_VARIATION;
else
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
}
}
/* enforce recomputation of auto-hinting data */
@ -283,6 +299,30 @@
if ( service_mm->set_var_design )
error = service_mm->set_var_design( face, num_coords, coords );
if ( !error || error == -1 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
if ( num_coords )
face->face_flags |= FT_FACE_FLAG_VARIATION;
else
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
if ( service_mm->construct_ps_name )
{
if ( error == -1 )
{
/* The PS name of a named instance and a non-named instance */
/* usually differs, even if the axis values are identical. */
if ( is_variation_old != FT_IS_VARIATION( face ) )
service_mm->construct_ps_name( face );
}
else
service_mm->construct_ps_name( face );
}
}
/* internal error code -1 means `no change'; we can exit immediately */
if ( error == -1 )
return FT_Err_Ok;
@ -359,6 +399,30 @@
if ( service_mm->set_mm_blend )
error = service_mm->set_mm_blend( face, num_coords, coords );
if ( !error || error == -1 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
if ( num_coords )
face->face_flags |= FT_FACE_FLAG_VARIATION;
else
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
if ( service_mm->construct_ps_name )
{
if ( error == -1 )
{
/* The PS name of a named instance and a non-named instance */
/* usually differs, even if the axis values are identical. */
if ( is_variation_old != FT_IS_VARIATION( face ) )
service_mm->construct_ps_name( face );
}
else
service_mm->construct_ps_name( face );
}
}
/* internal error code -1 means `no change'; we can exit immediately */
if ( error == -1 )
return FT_Err_Ok;
@ -410,6 +474,30 @@
if ( service_mm->set_mm_blend )
error = service_mm->set_mm_blend( face, num_coords, coords );
if ( !error || error == -1 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
if ( num_coords )
face->face_flags |= FT_FACE_FLAG_VARIATION;
else
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
if ( service_mm->construct_ps_name )
{
if ( error == -1 )
{
/* The PS name of a named instance and a non-named instance */
/* usually differs, even if the axis values are identical. */
if ( is_variation_old != FT_IS_VARIATION( face ) )
service_mm->construct_ps_name( face );
}
else
service_mm->construct_ps_name( face );
}
}
/* internal error code -1 means `no change'; we can exit immediately */
if ( error == -1 )
return FT_Err_Ok;
@ -535,8 +623,35 @@
if ( !error )
{
error = FT_ERR( Invalid_Argument );
if ( service_mm->set_instance )
error = service_mm->set_instance( face, instance_index );
if ( service_mm->set_named_instance )
error = service_mm->set_named_instance( face, instance_index );
if ( !error || error == -1 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
face->face_index = ( instance_index << 16 ) |
( face->face_index & 0xFFFFL );
if ( service_mm->construct_ps_name )
{
if ( error == -1 )
{
/* The PS name of a named instance and a non-named instance */
/* usually differs, even if the axis values are identical. */
if ( is_variation_old != FT_IS_VARIATION( face ) )
service_mm->construct_ps_name( face );
}
else
service_mm->construct_ps_name( face );
}
}
/* internal error code -1 means `no change'; we can exit immediately */
if ( error == -1 )
return FT_Err_Ok;
}
if ( !error )
@ -554,11 +669,32 @@
face->autohint.data = NULL;
}
return error;
}
/* documentation is in ftmm.h */
FT_EXPORT_DEF( FT_Error )
FT_Get_Default_Named_Instance( FT_Face face,
FT_UInt *instance_index )
{
FT_Error error;
FT_Service_MultiMasters service_mm = NULL;
/* check of `face' delayed to `ft_face_get_mm_service' */
error = ft_face_get_mm_service( face, &service_mm );
if ( !error )
{
face->face_index = ( instance_index << 16 ) |
( face->face_index & 0xFFFFL );
face->face_flags &= ~FT_FACE_FLAG_VARIATION;
/* no error if `get_default_named_instance` is not available */
if ( service_mm->get_default_named_instance )
error = service_mm->get_default_named_instance( face,
instance_index );
else
error = FT_Err_Ok;
}
return error;

View file

@ -1019,7 +1019,8 @@
/* elegant. */
/* try to load SVG documents if available */
if ( FT_HAS_SVG( face ) )
if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 &&
FT_HAS_SVG( face ) )
{
error = driver->clazz->load_glyph( slot, face->size,
glyph_index,
@ -1245,9 +1246,13 @@
/* destructor for sizes list */
static void
destroy_size( FT_Memory memory,
FT_Size size,
FT_Driver driver )
void* size_,
void* driver_ )
{
FT_Size size = (FT_Size)size_;
FT_Driver driver = (FT_Driver)driver_;
/* finalize client-specific data */
if ( size->generic.finalizer )
size->generic.finalizer( size );
@ -1293,9 +1298,11 @@
/* destructor for faces list */
static void
destroy_face( FT_Memory memory,
FT_Face face,
FT_Driver driver )
void* face_,
void* driver_ )
{
FT_Face face = (FT_Face)face_;
FT_Driver driver = (FT_Driver)driver_;
FT_Driver_Class clazz = driver->clazz;
@ -1310,7 +1317,7 @@
/* discard all sizes for this face */
FT_List_Finalize( &face->sizes_list,
(FT_List_Destructor)destroy_size,
destroy_size,
memory,
driver );
face->size = NULL;
@ -1346,7 +1353,7 @@
Destroy_Driver( FT_Driver driver )
{
FT_List_Finalize( &driver->faces_list,
(FT_List_Destructor)destroy_face,
destroy_face,
driver->root.memory,
driver );
}
@ -1740,6 +1747,7 @@
FT_Memory memory = library->memory;
args.driver = NULL;
args.flags = 0;
if ( driver_name )

View file

@ -58,7 +58,9 @@
FT_Error error;
FT_Int n; /* index of contour in outline */
FT_UInt first; /* index of first point in contour */
FT_Int first; /* index of first point in contour */
FT_Int last; /* index of last point in contour */
FT_Int tag; /* current point's state */
FT_Int shift;
@ -73,18 +75,17 @@
shift = func_interface->shift;
delta = func_interface->delta;
first = 0;
last = -1;
for ( n = 0; n < outline->n_contours; n++ )
{
FT_Int last; /* index of last point in contour */
FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
FT_TRACE5(( "FT_Outline_Decompose: Contour %d\n", n ));
first = last + 1;
last = outline->contours[n];
if ( last < 0 )
if ( last < first )
goto Invalid_Outline;
limit = outline->points + last;
v_start = outline->points[first];
@ -282,8 +283,6 @@
Close:
if ( error )
goto Exit;
first = (FT_UInt)last + 1;
}
FT_TRACE5(( "FT_Outline_Decompose: Done\n" ));
@ -368,7 +367,7 @@
if ( n_points <= 0 || n_contours <= 0 )
goto Bad;
end0 = end = -1;
end0 = -1;
for ( n = 0; n < n_contours; n++ )
{
end = outline->contours[n];
@ -380,7 +379,7 @@
end0 = end;
}
if ( end != n_points - 1 )
if ( end0 != n_points - 1 )
goto Bad;
/* XXX: check the tags array */
@ -388,7 +387,7 @@
}
Bad:
return FT_THROW( Invalid_Argument );
return FT_THROW( Invalid_Outline );
}
@ -550,10 +549,12 @@
if ( !outline )
return;
first = 0;
last = -1;
for ( n = 0; n < outline->n_contours; n++ )
{
/* keep the first contour point as is and swap points around it */
/* to guarantee that the cubic arches stay valid after reverse */
first = last + 2;
last = outline->contours[n];
/* reverse point table */
@ -591,8 +592,6 @@
q--;
}
}
first = last + 1;
}
outline->flags ^= FT_OUTLINE_REVERSE_FILL;
@ -941,7 +940,7 @@
points = outline->points;
first = 0;
last = -1;
for ( c = 0; c < outline->n_contours; c++ )
{
FT_Vector in, out, anchor, shift;
@ -949,8 +948,9 @@
FT_Int i, j, k;
l_in = 0;
first = last + 1;
last = outline->contours[c];
l_in = 0;
/* pacify compiler */
in.x = in.y = anchor.x = anchor.y = 0;
@ -1037,8 +1037,6 @@
in = out;
l_in = l_out;
}
first = last + 1;
}
return FT_Err_Ok;
@ -1054,7 +1052,7 @@
FT_Int xshift, yshift;
FT_Vector* points;
FT_Vector v_prev, v_cur;
FT_Int c, n, first;
FT_Int c, n, first, last;
FT_Pos area = 0;
@ -1086,11 +1084,11 @@
points = outline->points;
first = 0;
last = -1;
for ( c = 0; c < outline->n_contours; c++ )
{
FT_Int last = outline->contours[c];
first = last + 1;
last = outline->contours[c];
v_prev.x = points[last].x >> xshift;
v_prev.y = points[last].y >> yshift;
@ -1106,8 +1104,6 @@
v_prev = v_cur;
}
first = last + 1;
}
if ( area > 0 )

View file

@ -141,6 +141,8 @@
if ( read_bytes > count )
read_bytes = count;
/* Allow "reading" zero bytes without UB even if buffer is NULL */
if ( count )
FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
}
@ -178,6 +180,8 @@
if ( read_bytes > count )
read_bytes = count;
/* Allow "reading" zero bytes without UB even if buffer is NULL */
if ( count )
FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
}

View file

@ -2055,7 +2055,9 @@
FT_Error error;
FT_Int n; /* index of contour in outline */
FT_UInt first; /* index of first point in contour */
FT_Int first; /* index of first point in contour */
FT_Int last; /* index of last point in contour */
FT_Int tag; /* current point's state */
@ -2067,22 +2069,17 @@
FT_Stroker_Rewind( stroker );
first = 0;
last = -1;
for ( n = 0; n < outline->n_contours; n++ )
{
FT_UInt last; /* index of last point in contour */
last = (FT_UInt)outline->contours[n];
limit = outline->points + last;
first = last + 1;
last = outline->contours[n];
/* skip empty points; we don't stroke these */
if ( last <= first )
{
first = last + 1;
continue;
}
limit = outline->points + last;
v_start = outline->points[first];
v_last = outline->points[last];
@ -2231,8 +2228,6 @@
if ( error )
goto Exit;
}
first = last + 1;
}
return FT_Err_Ok;

View file

@ -97,9 +97,18 @@
FT_EXPORT_DEF( void )
FT_GlyphSlot_Embolden( FT_GlyphSlot slot )
{
FT_GlyphSlot_AdjustWeight( slot, 0x0AAA, 0x0AAA );
}
FT_EXPORT_DEF( void )
FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot,
FT_Fixed xdelta,
FT_Fixed ydelta )
{
FT_Library library;
FT_Face face;
FT_Size size;
FT_Error error;
FT_Pos xstr, ystr;
@ -108,16 +117,15 @@
return;
library = slot->library;
face = slot->face;
size = slot->face->size;
if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
slot->format != FT_GLYPH_FORMAT_BITMAP )
return;
/* some reasonable strength */
xstr = FT_MulFix( face->units_per_EM,
face->size->metrics.y_scale ) / 24;
ystr = xstr;
/* express deltas in pixels in 26.6 format */
xstr = (FT_Pos)size->metrics.x_ppem * xdelta / 1024;
ystr = (FT_Pos)size->metrics.y_ppem * ydelta / 1024;
if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );

View file

@ -206,7 +206,7 @@
* The number of bytes to read from the stream.
*
* @Return:
* The number of bytes actually read. If `count' is zero (this is,
* The number of bytes actually read. If `count' is zero (that is,
* the function is used for seeking), a non-zero return value
* indicates an error.
*/
@ -219,7 +219,7 @@
FT_FILE* file;
if ( !count && offset > stream->size )
if ( offset > stream->size && !count )
return 1;
file = STREAM_FILE( stream );
@ -227,6 +227,11 @@
if ( stream->pos != offset )
ft_fseek( file, (long)offset, SEEK_SET );
/* Avoid calling `fread` with `buffer=NULL` and `count=0`, */
/* which is undefined behaviour. */
if ( !count )
return 0;
return (unsigned long)ft_fread( buffer, 1, count, file );
}

View file

@ -18,8 +18,8 @@
#include<windows.h>
#define FT_VERSION 2,13,0,0
#define FT_VERSION_STR "2.13.0"
#define FT_VERSION 2,13,2,0
#define FT_VERSION_STR "2.13.2"
VS_VERSION_INFO VERSIONINFO
FILEVERSION FT_VERSION

View file

@ -239,10 +239,6 @@ FT_BEGIN_HEADER
FT_LOCAL( void )
bdf_free_font( bdf_font_t* font );
FT_LOCAL( bdf_property_t * )
bdf_get_property( char* name,
bdf_font_t* font );
FT_LOCAL( bdf_property_t * )
bdf_get_font_property( bdf_font_t* font,
const char* name );

View file

@ -311,9 +311,9 @@ THE SOFTWARE.
FT_CALLBACK_DEF( void )
BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */
BDF_Face_Done( FT_Face face ) /* BDF_Face */
{
BDF_Face face = (BDF_Face)bdfface;
BDF_Face bdfface = (BDF_Face)face;
FT_Memory memory;
@ -322,30 +322,30 @@ THE SOFTWARE.
memory = FT_FACE_MEMORY( face );
bdf_free_font( face->bdffont );
bdf_free_font( bdfface->bdffont );
FT_FREE( face->en_table );
FT_FREE( bdfface->en_table );
FT_FREE( face->charset_encoding );
FT_FREE( face->charset_registry );
FT_FREE( bdfface->family_name );
FT_FREE( bdfface->style_name );
FT_FREE( bdfface->charset_encoding );
FT_FREE( bdfface->charset_registry );
FT_FREE( face->family_name );
FT_FREE( face->style_name );
FT_FREE( bdfface->available_sizes );
FT_FREE( face->available_sizes );
FT_FREE( face->bdffont );
FT_FREE( bdfface->bdffont );
}
FT_CALLBACK_DEF( FT_Error )
BDF_Face_Init( FT_Stream stream,
FT_Face bdfface, /* BDF_Face */
FT_Face face, /* BDF_Face */
FT_Int face_index,
FT_Int num_params,
FT_Parameter* params )
{
FT_Error error = FT_Err_Ok;
BDF_Face face = (BDF_Face)bdfface;
BDF_Face bdfface = (BDF_Face)face;
FT_Memory memory = FT_FACE_MEMORY( face );
bdf_font_t* font = NULL;
@ -375,7 +375,7 @@ THE SOFTWARE.
goto Exit;
/* we have a bdf font: let's construct the face object */
face->bdffont = font;
bdfface->bdffont = font;
/* BDF cannot have multiple faces in a single font file.
* XXX: non-zero face_index is already invalid argument, but
@ -386,7 +386,7 @@ THE SOFTWARE.
if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "BDF_Face_Init: invalid face index\n" ));
BDF_Face_Done( bdfface );
BDF_Face_Done( face );
return FT_THROW( Invalid_Argument );
}
@ -401,10 +401,10 @@ THE SOFTWARE.
font->unencoded_size,
font->unencoded_used ));
bdfface->num_faces = 1;
bdfface->face_index = 0;
face->num_faces = 1;
face->face_index = 0;
bdfface->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
face->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
FT_FACE_FLAG_HORIZONTAL;
prop = bdf_get_font_property( font, "SPACING" );
@ -412,7 +412,7 @@ THE SOFTWARE.
prop->value.atom &&
( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||
*(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )
bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
face->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */
/* FZ XXX: I need a font to implement this */
@ -420,26 +420,27 @@ THE SOFTWARE.
prop = bdf_get_font_property( font, "FAMILY_NAME" );
if ( prop && prop->value.atom )
{
if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )
if ( FT_STRDUP( face->family_name, prop->value.atom ) )
goto Exit;
}
else
bdfface->family_name = NULL;
face->family_name = NULL;
if ( FT_SET_ERROR( bdf_interpret_style( face ) ) )
if ( FT_SET_ERROR( bdf_interpret_style( bdfface ) ) )
goto Exit;
/* the number of glyphs (with one slot for the undefined glyph */
/* at position 0 and all unencoded glyphs) */
bdfface->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
face->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
bdfface->num_fixed_sizes = 1;
if ( FT_NEW( bdfface->available_sizes ) )
face->num_fixed_sizes = 1;
if ( FT_NEW( face->available_sizes ) )
goto Exit;
{
FT_Bitmap_Size* bsize = bdfface->available_sizes;
FT_Short resolution_x = 0, resolution_y = 0;
FT_Bitmap_Size* bsize = face->available_sizes;
FT_Short resolution_x = 0;
FT_Short resolution_y = 0;
long value;
@ -598,20 +599,20 @@ THE SOFTWARE.
unsigned long n;
if ( FT_QNEW_ARRAY( face->en_table, font->glyphs_size ) )
if ( FT_QNEW_ARRAY( bdfface->en_table, font->glyphs_size ) )
goto Exit;
face->default_glyph = 0;
bdfface->default_glyph = 0;
for ( n = 0; n < font->glyphs_size; n++ )
{
(face->en_table[n]).enc = cur[n].encoding;
(bdfface->en_table[n]).enc = cur[n].encoding;
FT_TRACE4(( " idx %ld, val 0x%lX\n", n, cur[n].encoding ));
(face->en_table[n]).glyph = (FT_UShort)n;
(bdfface->en_table[n]).glyph = (FT_UShort)n;
if ( cur[n].encoding == font->default_char )
{
if ( n < FT_UINT_MAX )
face->default_glyph = (FT_UInt)n;
bdfface->default_glyph = (FT_UInt)n;
else
FT_TRACE1(( "BDF_Face_Init:"
" idx %ld is too large for this system\n", n ));
@ -639,15 +640,15 @@ THE SOFTWARE.
const char* s;
if ( FT_STRDUP( face->charset_encoding,
if ( FT_STRDUP( bdfface->charset_encoding,
charset_encoding->value.atom ) ||
FT_STRDUP( face->charset_registry,
FT_STRDUP( bdfface->charset_registry,
charset_registry->value.atom ) )
goto Exit;
/* Uh, oh, compare first letters manually to avoid dependency */
/* on locales. */
s = face->charset_registry;
s = bdfface->charset_registry;
if ( ( s[0] == 'i' || s[0] == 'I' ) &&
( s[1] == 's' || s[1] == 'S' ) &&
( s[2] == 'o' || s[2] == 'O' ) )
@ -655,11 +656,11 @@ THE SOFTWARE.
s += 3;
if ( !ft_strcmp( s, "10646" ) ||
( !ft_strcmp( s, "8859" ) &&
!ft_strcmp( face->charset_encoding, "1" ) ) )
!ft_strcmp( bdfface->charset_encoding, "1" ) ) )
unicode_charmap = 1;
/* another name for ASCII */
else if ( !ft_strcmp( s, "646.1991" ) &&
!ft_strcmp( face->charset_encoding, "IRV" ) )
!ft_strcmp( bdfface->charset_encoding, "IRV" ) )
unicode_charmap = 1;
}
@ -667,7 +668,7 @@ THE SOFTWARE.
FT_CharMapRec charmap;
charmap.face = FT_FACE( face );
charmap.face = face;
charmap.encoding = FT_ENCODING_NONE;
/* initial platform/encoding should indicate unset status? */
charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
@ -693,7 +694,7 @@ THE SOFTWARE.
FT_CharMapRec charmap;
charmap.face = FT_FACE( face );
charmap.face = face;
charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
charmap.platform_id = TT_PLATFORM_ADOBE;
charmap.encoding_id = TT_ADOBE_ID_STANDARD;
@ -701,8 +702,8 @@ THE SOFTWARE.
error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
/* Select default charmap */
if ( bdfface->num_charmaps )
bdfface->charmap = bdfface->charmaps[0];
if ( face->num_charmaps )
face->charmap = face->charmaps[0];
}
}
}
@ -711,7 +712,7 @@ THE SOFTWARE.
return error;
Fail:
BDF_Face_Done( bdfface );
BDF_Face_Done( face );
return FT_THROW( Unknown_File_Format );
}
@ -868,17 +869,18 @@ THE SOFTWARE.
*
*/
static FT_Error
bdf_get_bdf_property( BDF_Face face,
FT_CALLBACK_DEF( FT_Error )
bdf_get_bdf_property( FT_Face face, /* BDF_Face */
const char* prop_name,
BDF_PropertyRec *aproperty )
{
BDF_Face bdfface = (BDF_Face)face;
bdf_property_t* prop;
FT_ASSERT( face && face->bdffont );
FT_ASSERT( bdfface && bdfface->bdffont );
prop = bdf_get_font_property( face->bdffont, prop_name );
prop = bdf_get_font_property( bdfface->bdffont, prop_name );
if ( prop )
{
switch ( prop->format )
@ -921,13 +923,16 @@ THE SOFTWARE.
}
static FT_Error
bdf_get_charset_id( BDF_Face face,
FT_CALLBACK_DEF( FT_Error )
bdf_get_charset_id( FT_Face face, /* BDF_Face */
const char* *acharset_encoding,
const char* *acharset_registry )
{
*acharset_encoding = face->charset_encoding;
*acharset_registry = face->charset_registry;
BDF_Face bdfface = (BDF_Face)face;
*acharset_encoding = bdfface->charset_encoding;
*acharset_registry = bdfface->charset_registry;
return 0;
}
@ -964,7 +969,6 @@ THE SOFTWARE.
}
FT_CALLBACK_TABLE_DEF
const FT_Driver_ClassRec bdf_driver_class =
{

View file

@ -51,6 +51,9 @@
#define FT_COMPONENT bdflib
#define BUFSIZE 128
/**************************************************************************
*
* Default BDF font options.
@ -378,7 +381,7 @@
*alen = 0;
if ( list == NULL || list->used == 0 )
return 0;
return NULL;
dp = list->field[0];
for ( i = j = 0; i < list->used; i++ )
@ -887,18 +890,18 @@
}
FT_LOCAL_DEF( bdf_property_t* )
bdf_get_property( char* name,
static bdf_property_t*
bdf_get_property( const char* name,
bdf_font_t* font )
{
size_t* propid;
if ( name == NULL || *name == 0 )
return 0;
return NULL;
if ( ( propid = ft_hash_str_lookup( name, &(font->proptbl) ) ) == NULL )
return 0;
return NULL;
if ( *propid >= num_bdf_properties_ )
return font->user_props + ( *propid - num_bdf_properties_ );
@ -944,7 +947,7 @@
static FT_Error
bdf_add_comment_( bdf_font_t* font,
char* comment,
const char* comment,
unsigned long len )
{
char* cp;
@ -1053,27 +1056,24 @@
bdf_property_t* p;
*name = sp = ep = line;
sp = ep = line;
while ( *ep && *ep != ' ' && *ep != '\t' )
ep++;
hold = -1;
if ( *ep )
{
hold = *ep;
*ep = 0;
}
*ep = '\0';
p = bdf_get_property( sp, font );
/* Restore the character that was saved before any return can happen. */
if ( hold != -1 )
*ep = (char)hold;
/* If the property exists and is not an atom, just return here. */
if ( p && p->format != BDF_ATOM )
{
*ep = (char)hold; /* Undo NUL-termination. */
return 0;
}
*name = sp;
/* The property is an atom. Trim all leading and trailing whitespace */
/* and double quotes for the atom value. */
@ -1081,25 +1081,26 @@
ep = line + linelen;
/* Trim the leading whitespace if it exists. */
if ( *sp )
*sp++ = 0;
while ( *sp &&
( *sp == ' ' || *sp == '\t' ) )
if ( sp < ep )
do
sp++;
while ( *sp == ' ' || *sp == '\t' );
/* Trim the leading double quote if it exists. */
if ( *sp == '"' )
sp++;
*value = sp;
/* Trim the trailing whitespace if it exists. */
while ( ep > sp &&
( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) )
*--ep = 0;
if ( sp < ep )
do
*ep-- = '\0';
while ( *ep == ' ' || *ep == '\t' );
/* Trim the trailing double quote if it exists. */
if ( ep > sp && *( ep - 1 ) == '"' )
*--ep = 0;
if ( *ep == '"' )
*ep = '\0';
return 1;
}
@ -1775,7 +1776,7 @@
bdf_parse_t_* p;
char* name;
char* value;
char nbuf[128];
char nbuf[BUFSIZE];
FT_Error error = FT_Err_Ok;
FT_UNUSED( lineno );
@ -1796,7 +1797,7 @@
if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 )
{
p->font->font_ascent = p->font->bbx.ascent;
ft_sprintf( nbuf, "%hd", p->font->bbx.ascent );
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent );
error = bdf_add_property_( p->font, "FONT_ASCENT",
nbuf, lineno );
if ( error )
@ -1808,7 +1809,7 @@
if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 )
{
p->font->font_descent = p->font->bbx.descent;
ft_sprintf( nbuf, "%hd", p->font->bbx.descent );
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent );
error = bdf_add_property_( p->font, "FONT_DESCENT",
nbuf, lineno );
if ( error )
@ -2116,7 +2117,7 @@
/* Check for the CHARS field -- font properties are optional */
if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 )
{
char nbuf[128];
char nbuf[BUFSIZE];
if ( !( p->flags & BDF_FONT_BBX_ ) )
@ -2130,7 +2131,7 @@
/* Add the two standard X11 properties which are required */
/* for compiling fonts. */
p->font->font_ascent = p->font->bbx.ascent;
ft_sprintf( nbuf, "%hd", p->font->bbx.ascent );
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent );
error = bdf_add_property_( p->font, "FONT_ASCENT",
nbuf, lineno );
if ( error )
@ -2138,7 +2139,7 @@
FT_TRACE2(( "bdf_parse_properties_: " ACMSG1, p->font->bbx.ascent ));
p->font->font_descent = p->font->bbx.descent;
ft_sprintf( nbuf, "%hd", p->font->bbx.descent );
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent );
error = bdf_add_property_( p->font, "FONT_DESCENT",
nbuf, lineno );
if ( error )

View file

@ -62,10 +62,12 @@
static void*
ft_bzip2_alloc( FT_Memory memory,
ft_bzip2_alloc( void* memory_, /* FT_Memory */
int items,
int size )
{
FT_Memory memory = (FT_Memory)memory_;
FT_ULong sz = (FT_ULong)size * (FT_ULong)items;
FT_Error error;
FT_Pointer p = NULL;
@ -77,9 +79,12 @@
static void
ft_bzip2_free( FT_Memory memory,
ft_bzip2_free( void* memory_, /* FT_Memory */
void* address )
{
FT_Memory memory = (FT_Memory)memory_;
FT_MEM_FREE( address );
}
@ -170,8 +175,8 @@
}
/* initialize bzlib */
bzstream->bzalloc = (alloc_func)ft_bzip2_alloc;
bzstream->bzfree = (free_func) ft_bzip2_free;
bzstream->bzalloc = ft_bzip2_alloc;
bzstream->bzfree = ft_bzip2_free;
bzstream->opaque = zip->memory;
bzstream->avail_in = 0;

View file

@ -337,7 +337,7 @@
#if 1 /* inlining is about 50% faster! */
FTC_GCACHE_LOOKUP_CMP( cache,
ftc_basic_family_compare,
FTC_GNode_Compare,
ftc_gnode_compare,
hash, gindex,
&query,
node,
@ -411,7 +411,7 @@
FTC_GCACHE_LOOKUP_CMP( cache,
ftc_basic_family_compare,
FTC_GNode_Compare,
ftc_gnode_compare,
hash, gindex,
&query,
node,
@ -537,7 +537,7 @@
#if 1 /* inlining is about 50% faster! */
FTC_GCACHE_LOOKUP_CMP( cache,
ftc_basic_family_compare,
FTC_SNode_Compare,
ftc_snode_compare,
hash, gindex,
&query,
node,
@ -613,7 +613,7 @@
FTC_GCACHE_LOOKUP_CMP( cache,
ftc_basic_family_compare,
FTC_SNode_Compare,
ftc_snode_compare,
hash, gindex,
&query,
node,

View file

@ -94,8 +94,8 @@
idx = hash & cache->mask;
if ( idx < cache->p )
idx = hash & ( 2 * cache->mask + 1 );
if ( idx >= cache->p )
idx = hash & ( cache->mask >> 1 );
return cache->buckets + idx;
}
@ -114,8 +114,8 @@
{
FTC_Node node, *pnode;
FT_UFast p = cache->p;
FT_UFast mask = cache->mask;
FT_UFast count = mask + p + 1; /* number of buckets */
FT_UFast size = cache->mask + 1; /* available size */
FT_UFast half = size >> 1;
/* do we need to expand the buckets array? */
@ -127,20 +127,22 @@
/* try to expand the buckets array _before_ splitting
* the bucket lists
*/
if ( p >= mask )
if ( p == size )
{
FT_Memory memory = cache->memory;
FT_Error error;
/* if we can't expand the array, leave immediately */
if ( FT_RENEW_ARRAY( cache->buckets,
( mask + 1 ) * 2, ( mask + 1 ) * 4 ) )
if ( FT_QRENEW_ARRAY( cache->buckets, size, size * 2 ) )
break;
cache->mask = 2 * size - 1;
half = size;
}
/* split a single bucket */
pnode = cache->buckets + p;
/* the bucket to split */
pnode = cache->buckets + p - half;
for (;;)
{
@ -148,7 +150,7 @@
if ( !node )
break;
if ( node->hash & ( mask + 1 ) )
if ( node->hash & half )
{
*pnode = node->link;
node->link = new_list;
@ -158,56 +160,50 @@
pnode = &node->link;
}
cache->buckets[p + mask + 1] = new_list;
cache->buckets[p] = new_list;
cache->slack += FTC_HASH_MAX_LOAD;
if ( p >= mask )
{
cache->mask = 2 * mask + 1;
cache->p = 0;
}
else
cache->p = p + 1;
FT_TRACE2(( "ftc_cache_resize: cache %u increased to %u hashes\n",
cache->index, cache->p ));
}
/* do we need to shrink the buckets array? */
else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD )
else if ( cache->slack > (FT_Long)p * FTC_HASH_SUB_LOAD )
{
FT_UFast old_index = p + mask;
FTC_Node* pold;
FTC_Node old_list = cache->buckets[--p];
if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE )
if ( p < FTC_HASH_INITIAL_SIZE )
break;
if ( p == 0 )
if ( p == half )
{
FT_Memory memory = cache->memory;
FT_Error error;
/* if we can't shrink the array, leave immediately */
if ( FT_QRENEW_ARRAY( cache->buckets,
( mask + 1 ) * 2, mask + 1 ) )
if ( FT_QRENEW_ARRAY( cache->buckets, size, half ) )
break;
cache->mask >>= 1;
p = cache->mask;
cache->mask = half - 1;
}
else
p--;
pnode = cache->buckets + p;
/* the bucket to merge */
pnode = cache->buckets + p - half;
while ( *pnode )
pnode = &(*pnode)->link;
pold = cache->buckets + old_index;
*pnode = *pold;
*pold = NULL;
*pnode = old_list;
cache->slack -= FTC_HASH_MAX_LOAD;
cache->p = p;
FT_TRACE2(( "ftc_cache_resize: cache %u decreased to %u hashes\n",
cache->index, cache->p ));
}
/* otherwise, the hash table is balanced */
@ -239,7 +235,7 @@
if ( node == node0 )
break;
pnode = &(*pnode)->link;
pnode = &node->link;
}
*pnode = node0->link;
@ -322,13 +318,6 @@
/*************************************************************************/
FT_LOCAL_DEF( FT_Error )
FTC_Cache_Init( FTC_Cache cache )
{
return ftc_cache_init( cache );
}
FT_LOCAL_DEF( FT_Error )
ftc_cache_init( FTC_Cache cache )
{
@ -336,27 +325,35 @@
FT_Error error;
cache->p = 0;
cache->p = FTC_HASH_INITIAL_SIZE;
cache->mask = FTC_HASH_INITIAL_SIZE - 1;
cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD;
FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 );
FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE );
return error;
}
static void
FTC_Cache_Clear( FTC_Cache cache )
FT_LOCAL_DEF( FT_Error )
FTC_Cache_Init( FTC_Cache cache )
{
if ( cache && cache->buckets )
return ftc_cache_init( cache );
}
FT_LOCAL_DEF( void )
ftc_cache_done( FTC_Cache cache )
{
FT_Memory memory = cache->memory;
if ( cache->buckets )
{
FTC_Manager manager = cache->manager;
FT_UFast count = cache->p;
FT_UFast i;
FT_UFast count;
count = cache->p + cache->mask + 1;
for ( i = 0; i < count; i++ )
{
FTC_Node node = cache->buckets[i], next;
@ -376,30 +373,14 @@
cache->clazz.node_free( node, cache );
node = next;
}
cache->buckets[i] = NULL;
}
ftc_cache_resize( cache );
}
}
FT_LOCAL_DEF( void )
ftc_cache_done( FTC_Cache cache )
{
if ( cache->memory )
{
FT_Memory memory = cache->memory;
FTC_Cache_Clear( cache );
FT_FREE( cache->buckets );
cache->mask = 0;
cache->p = 0;
cache->slack = 0;
cache->memory = NULL;
}
cache->p = 0;
cache->mask = 0;
cache->slack = 0;
}
@ -562,12 +543,12 @@
FTC_Cache_RemoveFaceID( FTC_Cache cache,
FTC_FaceID face_id )
{
FT_UFast i, count;
FTC_Manager manager = cache->manager;
FTC_Node frees = NULL;
FT_UFast count = cache->p;
FT_UFast i;
count = cache->p + cache->mask + 1;
for ( i = 0; i < count; i++ )
{
FTC_Node* pnode = cache->buckets + i;

View file

@ -72,11 +72,12 @@ FT_BEGIN_HEADER
#define FTC_NODE_NEXT( x ) FTC_NODE( (x)->mru.next )
#define FTC_NODE_PREV( x ) FTC_NODE( (x)->mru.prev )
/* address the hash table entries */
#ifdef FTC_INLINE
#define FTC_NODE_TOP_FOR_HASH( cache, hash ) \
( ( cache )->buckets + \
( ( ( ( hash ) & ( cache )->mask ) < ( cache )->p ) \
? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) ) \
( ( ( ( hash ) & ( cache )->mask ) >= ( cache )->p ) \
? ( ( hash ) & ( ( cache )->mask >> 1 ) ) \
: ( ( hash ) & ( cache )->mask ) ) )
#else
FT_LOCAL( FTC_Node* )
@ -139,11 +140,13 @@ FT_BEGIN_HEADER
} FTC_CacheClassRec;
/* each cache really implements a dynamic hash table to manage its nodes */
/* each cache really implements a hash table to manage its nodes */
/* the number of the table entries (buckets) can change dynamically */
/* each bucket contains a linked lists of nodes for a given hash */
typedef struct FTC_CacheRec_
{
FT_UFast p;
FT_UFast mask;
FT_UFast p; /* hash table counter */
FT_UFast mask; /* hash table index range */
FT_Long slack;
FTC_Node* buckets;

View file

@ -79,20 +79,6 @@
}
#ifdef FTC_INLINE
FT_LOCAL_DEF( FT_Bool )
FTC_GNode_Compare( FTC_GNode gnode,
FTC_GQuery gquery,
FTC_Cache cache,
FT_Bool* list_changed )
{
return ftc_gnode_compare( FTC_NODE( gnode ), gquery,
cache, list_changed );
}
#endif
/*************************************************************************/
/*************************************************************************/
/***** *****/
@ -115,22 +101,22 @@
FT_LOCAL_DEF( FT_Error )
ftc_gcache_init( FTC_Cache ftccache )
ftc_gcache_init( FTC_Cache cache )
{
FTC_GCache cache = (FTC_GCache)ftccache;
FTC_GCache gcache = (FTC_GCache)cache;
FT_Error error;
error = FTC_Cache_Init( FTC_CACHE( cache ) );
error = FTC_Cache_Init( cache );
if ( !error )
{
FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
FTC_GCacheClass clazz = (FTC_GCacheClass)cache->org_class;
FTC_MruList_Init( &cache->families,
FTC_MruList_Init( &gcache->families,
clazz->family_class,
0, /* no maximum here! */
cache,
FTC_CACHE( cache )->memory );
cache->memory );
}
return error;
@ -140,31 +126,31 @@
#if 0
FT_LOCAL_DEF( FT_Error )
FTC_GCache_Init( FTC_GCache cache )
FTC_GCache_Init( FTC_GCache gcache )
{
return ftc_gcache_init( FTC_CACHE( cache ) );
return ftc_gcache_init( FTC_CACHE( gcache ) );
}
#endif /* 0 */
FT_LOCAL_DEF( void )
ftc_gcache_done( FTC_Cache ftccache )
ftc_gcache_done( FTC_Cache cache )
{
FTC_GCache cache = (FTC_GCache)ftccache;
FTC_GCache gcache = (FTC_GCache)cache;
FTC_Cache_Done( (FTC_Cache)cache );
FTC_MruList_Done( &cache->families );
FTC_Cache_Done( cache );
FTC_MruList_Done( &gcache->families );
}
#if 0
FT_LOCAL_DEF( void )
FTC_GCache_Done( FTC_GCache cache )
FTC_GCache_Done( FTC_GCache gcache )
{
ftc_gcache_done( FTC_CACHE( cache ) );
ftc_gcache_done( FTC_CACHE( gcache ) );
}
#endif /* 0 */
@ -183,7 +169,7 @@
#ifndef FTC_INLINE
FT_LOCAL_DEF( FT_Error )
FTC_GCache_Lookup( FTC_GCache cache,
FTC_GCache_Lookup( FTC_GCache gcache,
FT_Offset hash,
FT_UInt gindex,
FTC_GQuery query,
@ -204,7 +190,7 @@
/* out-of-memory condition occurs during glyph node initialization. */
family->num_nodes++;
error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
error = FTC_Cache_Lookup( FTC_CACHE( gcache ), hash, query, anode );
if ( --family->num_nodes == 0 )
FTC_FAMILY_FREE( family, cache );

View file

@ -58,7 +58,7 @@
* - FTC_GNode sub-class, e.g. MyNode, with relevant methods:
* my_node_new (must call FTC_GNode_Init)
* my_node_free (must call FTC_GNode_Done)
* my_node_compare (must call FTC_GNode_Compare)
* my_node_compare (must call ftc_gnode_compare)
* my_node_remove_faceid (must call ftc_gnode_unselect in case
* of match)
*
@ -179,19 +179,6 @@ FT_BEGIN_HEADER
FT_UInt gindex, /* glyph index for node */
FTC_Family family );
#ifdef FTC_INLINE
/* returns TRUE iff the query's glyph index correspond to the node; */
/* this assumes that the `family' and `hash' fields of the query are */
/* already correctly set */
FT_LOCAL( FT_Bool )
FTC_GNode_Compare( FTC_GNode gnode,
FTC_GQuery gquery,
FTC_Cache cache,
FT_Bool* list_changed );
#endif
/* call this function to clear a node's family -- this is necessary */
/* to implement the `node_remove_faceid' cache method correctly */
FT_LOCAL( void )

View file

@ -537,7 +537,7 @@
FT_LOCAL_DEF( void )
FTC_Manager_Compress( FTC_Manager manager )
{
FTC_Node node, first;
FTC_Node node, prev, first;
if ( !manager )
@ -557,20 +557,16 @@
return;
/* go to last node -- it's a circular list */
node = FTC_NODE_PREV( first );
prev = FTC_NODE_PREV( first );
do
{
FTC_Node prev;
prev = ( node == first ) ? NULL : FTC_NODE_PREV( node );
node = prev;
prev = FTC_NODE_PREV( node );
if ( node->ref_count <= 0 )
ftc_node_destroy( node, manager );
node = prev;
} while ( node && manager->cur_weight > manager->max_weight );
} while ( node != first && manager->cur_weight > manager->max_weight );
}
@ -633,20 +629,20 @@
FT_UInt count )
{
FTC_Node first = manager->nodes_list;
FTC_Node node;
FT_UInt result;
FTC_Node prev, node;
FT_UInt result = 0;
/* try to remove `count' nodes from the list */
if ( !first ) /* empty list! */
return 0;
if ( !first || !count )
return result;
/* go to last node - it's a circular list */
node = FTC_NODE_PREV(first);
for ( result = 0; result < count; )
/* go to last node -- it's a circular list */
prev = FTC_NODE_PREV( first );
do
{
FTC_Node prev = FTC_NODE_PREV( node );
node = prev;
prev = FTC_NODE_PREV( node );
/* don't touch locked nodes */
if ( node->ref_count <= 0 )
@ -654,12 +650,8 @@
ftc_node_destroy( node, manager );
result++;
}
} while ( node != first && result < count );
if ( node == first )
break;
node = prev;
}
return result;
}

View file

@ -329,29 +329,23 @@
FTC_MruNode_CompareFunc selection,
FT_Pointer key )
{
FTC_MruNode first, node, next;
FTC_MruNode first = list->nodes;
FTC_MruNode prev, node;
first = list->nodes;
while ( first && ( !selection || selection( first, key ) ) )
{
FTC_MruList_Remove( list, first );
first = list->nodes;
}
if ( !first || !selection )
return;
if ( first )
prev = first->prev;
do
{
node = first->next;
while ( node != first )
{
next = node->next;
node = prev;
prev = node->prev;
if ( selection( node, key ) )
FTC_MruList_Remove( list, node );
node = next;
}
}
} while ( node != first );
}

View file

@ -411,19 +411,4 @@
return result;
}
#ifdef FTC_INLINE
FT_LOCAL_DEF( FT_Bool )
FTC_SNode_Compare( FTC_SNode snode,
FTC_GQuery gquery,
FTC_Cache cache,
FT_Bool* list_changed )
{
return ftc_snode_compare( FTC_NODE( snode ), gquery,
cache, list_changed );
}
#endif
/* END */

View file

@ -81,17 +81,6 @@ FT_BEGIN_HEADER
FTC_SNode_Weight( FTC_SNode inode );
#endif
#ifdef FTC_INLINE
FT_LOCAL( FT_Bool )
FTC_SNode_Compare( FTC_SNode snode,
FTC_GQuery gquery,
FTC_Cache cache,
FT_Bool* list_changed);
#endif
/* */
FT_END_HEADER

View file

@ -32,9 +32,10 @@
/*************************************************************************/
FT_CALLBACK_DEF( FT_Error )
cff_cmap_encoding_init( CFF_CMapStd cmap,
cff_cmap_encoding_init( FT_CMap cmap,
FT_Pointer pointer )
{
CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Encoding encoding = &cff->encoding;
@ -42,63 +43,56 @@
FT_UNUSED( pointer );
cmap->gids = encoding->codes;
cffcmap->gids = encoding->codes;
return 0;
}
FT_CALLBACK_DEF( void )
cff_cmap_encoding_done( CFF_CMapStd cmap )
cff_cmap_encoding_done( FT_CMap cmap )
{
cmap->gids = NULL;
CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
cffcmap->gids = NULL;
}
FT_CALLBACK_DEF( FT_UInt )
cff_cmap_encoding_char_index( CFF_CMapStd cmap,
cff_cmap_encoding_char_index( FT_CMap cmap,
FT_UInt32 char_code )
{
CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
FT_UInt result = 0;
if ( char_code < 256 )
result = cmap->gids[char_code];
result = cffcmap->gids[char_code];
return result;
}
FT_CALLBACK_DEF( FT_UInt32 )
cff_cmap_encoding_char_next( CFF_CMapStd cmap,
FT_CALLBACK_DEF( FT_UInt )
cff_cmap_encoding_char_next( FT_CMap cmap,
FT_UInt32 *pchar_code )
{
CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
FT_UInt result = 0;
FT_UInt32 char_code = *pchar_code;
*pchar_code = 0;
if ( char_code < 255 )
while ( char_code < 255 )
{
FT_UInt code = (FT_UInt)( char_code + 1 );
for (;;)
result = cffcmap->gids[++char_code];
if ( result )
{
if ( code >= 256 )
break;
result = cmap->gids[code];
if ( result != 0 )
{
*pchar_code = code;
*pchar_code = char_code;
break;
}
}
code++;
}
}
return result;
}
@ -130,9 +124,10 @@
/*************************************************************************/
FT_CALLBACK_DEF( const char* )
cff_sid_to_glyph_name( TT_Face face,
cff_sid_to_glyph_name( void* face_, /* TT_Face */
FT_UInt idx )
{
TT_Face face = (TT_Face)face_;
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Charset charset = &cff->charset;
FT_UInt sid = charset->sids[idx];
@ -143,10 +138,11 @@
FT_CALLBACK_DEF( FT_Error )
cff_cmap_unicode_init( PS_Unicodes unicodes,
cff_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */
FT_Pointer pointer )
{
TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
PS_Unicodes unicodes = (PS_Unicodes)cmap;
TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
FT_Memory memory = FT_FACE_MEMORY( face );
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Charset charset = &cff->charset;
@ -166,16 +162,17 @@
return psnames->unicodes_init( memory,
unicodes,
cff->num_glyphs,
(PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
&cff_sid_to_glyph_name,
(PS_FreeGlyphNameFunc)NULL,
(FT_Pointer)face );
}
FT_CALLBACK_DEF( void )
cff_cmap_unicode_done( PS_Unicodes unicodes )
cff_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */
{
FT_Face face = FT_CMAP_FACE( unicodes );
PS_Unicodes unicodes = (PS_Unicodes)cmap;
FT_Face face = FT_CMAP_FACE( cmap );
FT_Memory memory = FT_FACE_MEMORY( face );
@ -185,10 +182,11 @@
FT_CALLBACK_DEF( FT_UInt )
cff_cmap_unicode_char_index( PS_Unicodes unicodes,
cff_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */
FT_UInt32 char_code )
{
TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
PS_Unicodes unicodes = (PS_Unicodes)cmap;
TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
CFF_Font cff = (CFF_Font)face->extra.data;
FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
@ -197,11 +195,12 @@
}
FT_CALLBACK_DEF( FT_UInt32 )
cff_cmap_unicode_char_next( PS_Unicodes unicodes,
FT_CALLBACK_DEF( FT_UInt )
cff_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */
FT_UInt32 *pchar_code )
{
TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
PS_Unicodes unicodes = (PS_Unicodes)cmap;
TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
CFF_Font cff = (CFF_Font)face->extra.data;
FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;

View file

@ -108,20 +108,20 @@
* They can be implemented by format-specific interfaces.
*/
FT_CALLBACK_DEF( FT_Error )
cff_get_kerning( FT_Face ttface, /* TT_Face */
cff_get_kerning( FT_Face face, /* CFF_Face */
FT_UInt left_glyph,
FT_UInt right_glyph,
FT_Vector* kerning )
{
TT_Face face = (TT_Face)ttface;
SFNT_Service sfnt = (SFNT_Service)face->sfnt;
CFF_Face cffface = (CFF_Face)face;
SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
kerning->x = 0;
kerning->y = 0;
if ( sfnt )
kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
kerning->x = sfnt->get_kerning( cffface, left_glyph, right_glyph );
return FT_Err_Ok;
}
@ -158,23 +158,23 @@
* FreeType error code. 0 means success.
*/
FT_CALLBACK_DEF( FT_Error )
cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */
FT_Size cffsize, /* CFF_Size */
cff_glyph_load( FT_GlyphSlot slot, /* CFF_GlyphSlot */
FT_Size size, /* CFF_Size */
FT_UInt glyph_index,
FT_Int32 load_flags )
{
FT_Error error;
CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot;
CFF_Size size = (CFF_Size)cffsize;
CFF_GlyphSlot cffslot = (CFF_GlyphSlot)slot;
CFF_Size cffsize = (CFF_Size)size;
if ( !slot )
if ( !cffslot )
return FT_THROW( Invalid_Slot_Handle );
FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index ));
/* check whether we want a scaled outline or bitmap */
if ( !size )
if ( !cffsize )
load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
/* reset the size object if necessary */
@ -184,12 +184,12 @@
if ( size )
{
/* these two objects must have the same parent */
if ( cffsize->face != cffslot->face )
if ( size->face != slot->face )
return FT_THROW( Invalid_Face_Handle );
}
/* now load the glyph outline if necessary */
error = cff_slot_load( slot, size, glyph_index, load_flags );
error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags );
/* force drop-out mode to 2 - irrelevant now */
/* slot->outline.dropout_mode = 2; */
@ -216,7 +216,7 @@
/* it is no longer necessary that those values are identical to */
/* the values in the `CFF' table */
TT_Face ttface = (TT_Face)face;
CFF_Face cffface = (CFF_Face)face;
FT_Short dummy;
@ -225,7 +225,7 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* no fast retrieval for blended MM fonts without VVAR table */
if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
!( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
!( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
return FT_THROW( Unimplemented_Feature );
#endif
@ -233,7 +233,7 @@
/* otherwise we extract the info from the CFF glyphstrings */
/* (instead of synthesizing a global value using the `OS/2' */
/* table) */
if ( !ttface->vertical_info )
if ( !cffface->vertical_info )
goto Missing_Table;
for ( nn = 0; nn < count; nn++ )
@ -241,7 +241,7 @@
FT_UShort ah;
( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
1,
start + nn,
&dummy,
@ -259,12 +259,12 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* no fast retrieval for blended MM fonts without HVAR table */
if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
!( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
!( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
return FT_THROW( Unimplemented_Feature );
#endif
/* check whether we have data from the `hmtx' table at all */
if ( !ttface->horizontal.number_Of_HMetrics )
if ( !cffface->horizontal.number_Of_HMetrics )
goto Missing_Table;
for ( nn = 0; nn < count; nn++ )
@ -272,7 +272,7 @@
FT_UShort aw;
( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
0,
start + nn,
&dummy,
@ -312,13 +312,14 @@
*
*/
static FT_Error
cff_get_glyph_name( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_glyph_name( FT_Face face, /* CFF_Face */
FT_UInt glyph_index,
FT_Pointer buffer,
FT_UInt buffer_max )
{
CFF_Font font = (CFF_Font)face->extra.data;
CFF_Face cffface = (CFF_Face)face;
CFF_Font font = (CFF_Font)cffface->extra.data;
FT_String* gname;
FT_UShort sid;
FT_Error error;
@ -338,10 +339,7 @@
if ( service && service->get_name )
return service->get_name( FT_FACE( face ),
glyph_index,
buffer,
buffer_max );
return service->get_name( face, glyph_index, buffer, buffer_max );
else
{
FT_ERROR(( "cff_get_glyph_name:"
@ -379,21 +377,19 @@
}
static FT_UInt
cff_get_name_index( CFF_Face face,
FT_CALLBACK_DEF( FT_UInt )
cff_get_name_index( FT_Face face, /* CFF_Face */
const FT_String* glyph_name )
{
CFF_Font cff;
CFF_Charset charset;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
CFF_Charset charset = &cff->charset;
FT_Service_PsCMaps psnames;
FT_String* name;
FT_UShort sid;
FT_UInt i;
cff = (CFF_FontRec *)face->extra.data;
charset = &cff->charset;
/* CFF2 table does not have glyph names; */
/* we need to use `post' table method */
if ( cff->version_major == 2 )
@ -408,7 +404,7 @@
if ( service && service->name_index )
return service->name_index( FT_FACE( face ), glyph_name );
return service->name_index( face, glyph_name );
else
{
FT_ERROR(( "cff_get_name_index:"
@ -446,8 +442,8 @@
FT_DEFINE_SERVICE_GLYPHDICTREC(
cff_service_glyph_dict,
(FT_GlyphDict_GetNameFunc) cff_get_glyph_name, /* get_name */
(FT_GlyphDict_NameIndexFunc)cff_get_name_index /* name_index */
cff_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */
cff_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */
)
@ -456,25 +452,32 @@
*
*/
static FT_Int
FT_CALLBACK_DEF( FT_Int )
cff_ps_has_glyph_names( FT_Face face )
{
return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
}
static FT_Error
cff_ps_get_font_info( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_ps_get_font_info( FT_Face face, /* CFF_Face */
PS_FontInfoRec* afont_info )
{
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
FT_Error error = FT_Err_Ok;
if ( cffface->is_cff2 )
{
error = FT_THROW( Invalid_Argument );
goto Fail;
}
if ( cff && !cff->font_info )
{
CFF_FontRecDict dict = &cff->top_font.font_dict;
FT_Memory memory = face->root.memory;
FT_Memory memory = FT_FACE_MEMORY( face );
PS_FontInfoRec* font_info = NULL;
@ -507,18 +510,19 @@
}
static FT_Error
cff_ps_get_font_extra( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_ps_get_font_extra( FT_Face face, /* CFF_Face */
PS_FontExtraRec* afont_extra )
{
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
FT_Error error = FT_Err_Ok;
if ( cff && !cff->font_extra )
{
CFF_FontRecDict dict = &cff->top_font.font_dict;
FT_Memory memory = face->root.memory;
FT_Memory memory = FT_FACE_MEMORY( face );
PS_FontExtraRec* font_extra = NULL;
FT_String* embedded_postscript;
@ -588,13 +592,13 @@
FT_DEFINE_SERVICE_PSINFOREC(
cff_service_ps_info,
(PS_GetFontInfoFunc) cff_ps_get_font_info, /* ps_get_font_info */
(PS_GetFontExtraFunc) cff_ps_get_font_extra, /* ps_get_font_extra */
(PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, /* ps_has_glyph_names */
cff_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */
cff_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */
cff_ps_has_glyph_names, /* PS_HasGlyphNamesFunc ps_has_glyph_names */
/* unsupported with CFF fonts */
(PS_GetFontPrivateFunc)NULL, /* ps_get_font_private */
NULL, /* PS_GetFontPrivateFunc ps_get_font_private */
/* not implemented */
(PS_GetFontValueFunc) NULL /* ps_get_font_value */
NULL /* PS_GetFontValueFunc ps_get_font_value */
)
@ -603,17 +607,18 @@
*
*/
static const char*
cff_get_ps_name( CFF_Face face )
FT_CALLBACK_DEF( const char* )
cff_get_ps_name( FT_Face face ) /* CFF_Face */
{
CFF_Font cff = (CFF_Font)face->extra.data;
SFNT_Service sfnt = (SFNT_Service)face->sfnt;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
/* following the OpenType specification 1.7, we return the name stored */
/* in the `name' table for a CFF wrapped into an SFNT container */
if ( FT_IS_SFNT( FT_FACE( face ) ) && sfnt )
if ( FT_IS_SFNT( face ) && sfnt )
{
FT_Library library = FT_FACE_LIBRARY( face );
FT_Module sfnt_module = FT_Get_Module( library, "sfnt" );
@ -625,17 +630,17 @@
if ( service && service->get_ps_font_name )
return service->get_ps_font_name( FT_FACE( face ) );
return service->get_ps_font_name( face );
}
return (const char*)cff->font_name;
return cff ? (const char*)cff->font_name : NULL;
}
FT_DEFINE_SERVICE_PSFONTNAMEREC(
cff_service_ps_name,
(FT_PsName_GetFunc)cff_get_ps_name /* get_ps_font_name */
cff_get_ps_name /* FT_PsName_GetFunc get_ps_font_name */
)
@ -649,7 +654,7 @@
* Otherwise call the service function in the sfnt module.
*
*/
static FT_Error
FT_CALLBACK_DEF( FT_Error )
cff_get_cmap_info( FT_CharMap charmap,
TT_CMapInfo *cmap_info )
{
@ -683,7 +688,7 @@
FT_DEFINE_SERVICE_TTCMAPSREC(
cff_service_get_cmap_info,
(TT_CMap_Info_GetFunc)cff_get_cmap_info /* get_cmap_info */
cff_get_cmap_info /* TT_CMap_Info_GetFunc get_cmap_info */
)
@ -691,14 +696,15 @@
* CID INFO SERVICE
*
*/
static FT_Error
cff_get_ros( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_ros( FT_Face face, /* FT_Face */
const char* *registry,
const char* *ordering,
FT_Int *supplement )
{
FT_Error error = FT_Err_Ok;
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
if ( cff )
@ -748,12 +754,13 @@
}
static FT_Error
cff_get_is_cid( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_is_cid( FT_Face face, /* CFF_Face */
FT_Bool *is_cid )
{
FT_Error error = FT_Err_Ok;
CFF_Font cff = (CFF_Font)face->extra.data;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
*is_cid = 0;
@ -771,17 +778,16 @@
}
static FT_Error
cff_get_cid_from_glyph_index( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_cid_from_glyph_index( FT_Face face, /* CFF_Face */
FT_UInt glyph_index,
FT_UInt *cid )
{
FT_Error error = FT_Err_Ok;
CFF_Font cff;
CFF_Face cffface = (CFF_Face)face;
CFF_Font cff = (CFF_Font)cffface->extra.data;
cff = (CFF_Font)face->extra.data;
if ( cff )
{
FT_UInt c;
@ -814,12 +820,12 @@
FT_DEFINE_SERVICE_CIDREC(
cff_service_cid_info,
(FT_CID_GetRegistryOrderingSupplementFunc)
cff_get_ros, /* get_ros */
(FT_CID_GetIsInternallyCIDKeyedFunc)
cff_get_is_cid, /* get_is_cid */
(FT_CID_GetCIDFromGlyphIndexFunc)
cff_get_cid_from_glyph_index /* get_cid_from_glyph_index */
cff_get_ros,
/* FT_CID_GetRegistryOrderingSupplementFunc get_ros */
cff_get_is_cid,
/* FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid */
cff_get_cid_from_glyph_index
/* FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index */
)
@ -831,9 +837,9 @@
FT_DEFINE_SERVICE_PROPERTIESREC(
cff_service_properties,
(FT_Properties_SetFunc)ps_property_set, /* set_property */
(FT_Properties_GetFunc)ps_property_get ) /* get_property */
ps_property_set, /* FT_Properties_SetFunc set_property */
ps_property_get /* FT_Properties_GetFunc get_property */
)
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
@ -842,160 +848,195 @@
*
*/
static FT_Error
cff_set_mm_blend( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_set_mm_blend( FT_Face face, /* CFF_Face */
FT_UInt num_coords,
FT_Fixed* coords )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->set_mm_blend( FT_FACE( face ), num_coords, coords );
return mm->set_mm_blend( face, num_coords, coords );
}
static FT_Error
cff_get_mm_blend( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_mm_blend( FT_Face face, /* CFF_Face */
FT_UInt num_coords,
FT_Fixed* coords )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_mm_blend( FT_FACE( face ), num_coords, coords );
return mm->get_mm_blend( face, num_coords, coords );
}
static FT_Error
cff_set_mm_weightvector( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_set_mm_weightvector( FT_Face face, /* CFF_Face */
FT_UInt len,
FT_Fixed* weightvector )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->set_mm_weightvector( FT_FACE( face ), len, weightvector );
return mm->set_mm_weightvector( face, len, weightvector );
}
static FT_Error
cff_get_mm_weightvector( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_mm_weightvector( FT_Face face, /* CFF_Face */
FT_UInt* len,
FT_Fixed* weightvector )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_mm_weightvector( FT_FACE( face ), len, weightvector );
return mm->get_mm_weightvector( face, len, weightvector );
}
static FT_Error
cff_get_mm_var( CFF_Face face,
FT_CALLBACK_DEF( void )
cff_construct_ps_name( FT_Face face ) /* CFF_Face */
{
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
mm->construct_ps_name( face );
}
FT_CALLBACK_DEF( FT_Error )
cff_get_mm_var( FT_Face face, /* CFF_Face */
FT_MM_Var* *master )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_mm_var( FT_FACE( face ), master );
return mm->get_mm_var( face, master );
}
static FT_Error
cff_set_var_design( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_set_var_design( FT_Face face, /* CFF_Face */
FT_UInt num_coords,
FT_Fixed* coords )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->set_var_design( FT_FACE( face ), num_coords, coords );
return mm->set_var_design( face, num_coords, coords );
}
static FT_Error
cff_get_var_design( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_var_design( FT_Face face, /* CFF_Face */
FT_UInt num_coords,
FT_Fixed* coords )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_var_design( FT_FACE( face ), num_coords, coords );
return mm->get_var_design( face, num_coords, coords );
}
static FT_Error
cff_set_instance( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_set_named_instance( FT_Face face, /* CFF_Face */
FT_UInt instance_index )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->set_instance( FT_FACE( face ), instance_index );
return mm->set_named_instance( face, instance_index );
}
static FT_Error
cff_load_item_variation_store( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_get_default_named_instance( FT_Face face, /* CFF_Face */
FT_UInt *instance_index )
{
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_default_named_instance( face, instance_index );
}
FT_CALLBACK_DEF( FT_Error )
cff_load_item_variation_store( FT_Face face, /* CFF_Face */
FT_ULong offset,
GX_ItemVarStore itemStore )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->load_item_var_store( FT_FACE(face), offset, itemStore );
return mm->load_item_var_store( face, offset, itemStore );
}
static FT_Error
cff_load_delta_set_index_mapping( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_load_delta_set_index_mapping( FT_Face face, /* CFF_Face */
FT_ULong offset,
GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore,
FT_ULong table_len )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->load_delta_set_idx_map( FT_FACE( face ), offset, map,
return mm->load_delta_set_idx_map( face, offset, map,
itemStore, table_len );
}
static FT_Int
cff_get_item_delta( CFF_Face face,
FT_CALLBACK_DEF( FT_Int )
cff_get_item_delta( FT_Face face, /* CFF_Face */
GX_ItemVarStore itemStore,
FT_UInt outerIndex,
FT_UInt innerIndex )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_item_delta( FT_FACE( face ), itemStore,
outerIndex, innerIndex );
return mm->get_item_delta( face, itemStore, outerIndex, innerIndex );
}
static void
cff_done_item_variation_store( CFF_Face face,
FT_CALLBACK_DEF( void )
cff_done_item_variation_store( FT_Face face, /* CFF_Face */
GX_ItemVarStore itemStore )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
mm->done_item_var_store( FT_FACE( face ), itemStore );
mm->done_item_var_store( face, itemStore );
}
static void
cff_done_delta_set_index_map( CFF_Face face,
FT_CALLBACK_DEF( void )
cff_done_delta_set_index_map( FT_Face face, /* CFF_Face */
GX_DeltaSetIdxMap deltaSetIdxMap )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
mm->done_delta_set_idx_map( FT_FACE ( face ), deltaSetIdxMap );
mm->done_delta_set_idx_map( face, deltaSetIdxMap );
}
@ -1003,36 +1044,35 @@
FT_DEFINE_SERVICE_MULTIMASTERSREC(
cff_service_multi_masters,
(FT_Get_MM_Func) NULL, /* get_mm */
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */
(FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */
(FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */
(FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */
(FT_Set_Var_Design_Func)cff_set_var_design, /* set_var_design */
(FT_Get_Var_Design_Func)cff_get_var_design, /* get_var_design */
(FT_Set_Instance_Func) cff_set_instance, /* set_instance */
(FT_Set_MM_WeightVector_Func)
NULL, /* FT_Get_MM_Func get_mm */
NULL, /* FT_Set_MM_Design_Func set_mm_design */
cff_set_mm_blend, /* FT_Set_MM_Blend_Func set_mm_blend */
cff_get_mm_blend, /* FT_Get_MM_Blend_Func get_mm_blend */
cff_get_mm_var, /* FT_Get_MM_Var_Func get_mm_var */
cff_set_var_design, /* FT_Set_Var_Design_Func set_var_design */
cff_get_var_design, /* FT_Get_Var_Design_Func get_var_design */
cff_set_named_instance,
/* FT_Set_Named_Instance_Func set_named_instance */
cff_get_default_named_instance,
/* FT_Get_Default_Named_Instance_Func get_default_named_instance */
cff_set_mm_weightvector,
/* set_mm_weightvector */
(FT_Get_MM_WeightVector_Func)
/* FT_Set_MM_WeightVector_Func set_mm_weightvector */
cff_get_mm_weightvector,
/* get_mm_weightvector */
(FT_Var_Load_Delta_Set_Idx_Map_Func)
/* FT_Get_MM_WeightVector_Func get_mm_weightvector */
cff_construct_ps_name,
/* FT_Construct_PS_Name_Func construct_ps_name */
cff_load_delta_set_index_mapping,
/* load_delta_set_idx_map */
(FT_Var_Load_Item_Var_Store_Func)
/* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */
cff_load_item_variation_store,
/* load_item_variation_store */
(FT_Var_Get_Item_Delta_Func)
cff_get_item_delta, /* get_item_delta */
(FT_Var_Done_Item_Var_Store_Func)
/* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */
cff_get_item_delta,
/* FT_Var_Get_Item_Delta_Func get_item_delta */
cff_done_item_variation_store,
/* done_item_variation_store */
(FT_Var_Done_Delta_Set_Idx_Map_Func)
/* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */
cff_done_delta_set_index_map,
/* done_delta_set_index_map */
(FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */
(FT_Done_Blend_Func) cff_done_blend /* done_blend */
/* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */
cff_get_var_blend, /* FT_Get_Var_Blend_Func get_var_blend */
cff_done_blend /* FT_Done_Blend_Func done_blend */
)
@ -1041,41 +1081,46 @@
*
*/
static FT_Error
cff_hadvance_adjust( CFF_Face face,
FT_CALLBACK_DEF( FT_Error )
cff_hadvance_adjust( FT_Face face, /* CFF_Face */
FT_UInt gindex,
FT_Int *avalue )
{
FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MetricsVariations
var = (FT_Service_MetricsVariations)cffface->tt_var;
return var->hadvance_adjust( FT_FACE( face ), gindex, avalue );
return var->hadvance_adjust( face, gindex, avalue );
}
static void
cff_metrics_adjust( CFF_Face face )
FT_CALLBACK_DEF( void )
cff_metrics_adjust( FT_Face face ) /* CFF_Face */
{
FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MetricsVariations
var = (FT_Service_MetricsVariations)cffface->tt_var;
var->metrics_adjust( FT_FACE( face ) );
var->metrics_adjust( face );
}
FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
cff_service_metrics_variations,
(FT_HAdvance_Adjust_Func)cff_hadvance_adjust, /* hadvance_adjust */
(FT_LSB_Adjust_Func) NULL, /* lsb_adjust */
(FT_RSB_Adjust_Func) NULL, /* rsb_adjust */
cff_hadvance_adjust, /* FT_HAdvance_Adjust_Func hadvance_adjust */
NULL, /* FT_LSB_Adjust_Func lsb_adjust */
NULL, /* FT_RSB_Adjust_Func rsb_adjust */
(FT_VAdvance_Adjust_Func)NULL, /* vadvance_adjust */
(FT_TSB_Adjust_Func) NULL, /* tsb_adjust */
(FT_BSB_Adjust_Func) NULL, /* bsb_adjust */
(FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */
NULL, /* FT_VAdvance_Adjust_Func vadvance_adjust */
NULL, /* FT_TSB_Adjust_Func tsb_adjust */
NULL, /* FT_BSB_Adjust_Func bsb_adjust */
NULL, /* FT_VOrg_Adjust_Func vorg_adjust */
(FT_Metrics_Adjust_Func) cff_metrics_adjust /* metrics_adjust */
cff_metrics_adjust, /* FT_Metrics_Adjust_Func metrics_adjust */
NULL /* FT_Size_Reset_Func size_reset */
)
#endif
@ -1088,11 +1133,11 @@
FT_DEFINE_SERVICE_CFFLOADREC(
cff_service_cff_load,
(FT_Get_Standard_Encoding_Func)cff_get_standard_encoding,
(FT_Load_Private_Dict_Func) cff_load_private_dict,
(FT_FD_Select_Get_Func) cff_fd_select_get,
(FT_Blend_Check_Vector_Func) cff_blend_check_vector,
(FT_Blend_Build_Vector_Func) cff_blend_build_vector
cff_get_standard_encoding, /* FT_Get_Standard_Encoding_Func get_standard_encoding */
cff_load_private_dict, /* FT_Load_Private_Dict_Func load_private_dict */
cff_fd_select_get, /* FT_FD_Select_Get_Func fd_select_get */
cff_blend_check_vector, /* FT_Blend_Check_Vector_Func blend_check_vector */
cff_blend_build_vector /* FT_Blend_Build_Vector_Func blend_build_vector */
)

View file

@ -356,7 +356,9 @@
#ifdef FT_CONFIG_OPTION_SVG
/* check for OT-SVG */
if ( ( load_flags & FT_LOAD_COLOR ) && face->svg )
if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 &&
( load_flags & FT_LOAD_COLOR ) &&
face->svg )
{
/*
* We load the SVG document and try to grab the advances from the

View file

@ -400,7 +400,7 @@
/* Allocate a table containing pointers to an index's elements. */
/* The `pool' argument makes this function convert the index */
/* entries to C-style strings (this is, null-terminated). */
/* entries to C-style strings (that is, null-terminated). */
static FT_Error
cff_index_get_pointers( CFF_Index idx,
FT_Byte*** table,
@ -1361,14 +1361,15 @@
for ( i = 0; i < numBlends; i++ )
{
const FT_Int32* weight = &blend->BV[1];
FT_UInt32 sum;
FT_Fixed sum;
/* convert inputs to 16.16 fixed-point */
sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000;
/* convert inputs to 16.16 fixed point */
sum = cff_parse_fixed( parser, &parser->stack[i + base] );
for ( j = 1; j < blend->lenBV; j++ )
sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++;
sum += FT_MulFix( cff_parse_fixed( parser, &parser->stack[delta++] ),
*weight++ );
/* point parser stack to new value on blend_stack */
parser->stack[i + base] = subFont->blend_top;
@ -1589,16 +1590,17 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
FT_LOCAL_DEF( FT_Error )
cff_get_var_blend( CFF_Face face,
cff_get_var_blend( FT_Face face, /* CFF_Face */
FT_UInt *num_coords,
FT_Fixed* *coords,
FT_Fixed* *normalizedcoords,
FT_MM_Var* *mm_var )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
return mm->get_var_blend( FT_FACE( face ),
return mm->get_var_blend( face,
num_coords,
coords,
normalizedcoords,
@ -1607,13 +1609,14 @@
FT_LOCAL_DEF( void )
cff_done_blend( CFF_Face face )
cff_done_blend( FT_Face face ) /* CFF_Face */
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
CFF_Face cffface = (CFF_Face)face;
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
if ( mm )
mm->done_blend( FT_FACE( face ) );
mm->done_blend( face );
}
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
@ -1650,13 +1653,6 @@
goto Exit;
}
/* Zero out the code to gid/sid mappings. */
for ( j = 0; j < 256; j++ )
{
encoding->sids [j] = 0;
encoding->codes[j] = 0;
}
/* Note: The encoding table in a CFF font is indexed by glyph index; */
/* the first encoded glyph index is 1. Hence, we read the character */
/* code (`glyph_code') at index j and make the assignment: */
@ -1671,6 +1667,10 @@
if ( offset > 1 )
{
/* Zero out the code to gid/sid mappings. */
FT_ARRAY_ZERO( encoding->sids, 256 );
FT_ARRAY_ZERO( encoding->codes, 256 );
encoding->offset = base_offset + offset;
/* we need to parse the table to determine its size */
@ -2012,7 +2012,7 @@
/* Top and Font DICTs are not allowed to have blend operators. */
error = cff_parser_init( &parser,
code,
&subfont->font_dict,
top,
font->library,
stackSize,
0,

View file

@ -105,14 +105,14 @@ FT_BEGIN_HEADER
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
FT_LOCAL( FT_Error )
cff_get_var_blend( CFF_Face face,
cff_get_var_blend( FT_Face face,
FT_UInt *num_coords,
FT_Fixed* *coords,
FT_Fixed* *normalizedcoords,
FT_MM_Var* *mm_var );
FT_LOCAL( void )
cff_done_blend( CFF_Face face );
cff_done_blend( FT_Face face );
#endif

View file

@ -69,8 +69,8 @@
FT_Module module;
module = FT_Get_Module( size->root.face->driver->root.library,
"pshinter" );
module = FT_Get_Module( font->library, "pshinter" );
return ( module && pshinter && pshinter->get_globals_funcs )
? pshinter->get_globals_funcs( module )
: 0;
@ -182,8 +182,7 @@
goto Exit;
cff_make_private_dict( &font->top_font, &priv );
error = funcs->create( cffsize->face->memory, &priv,
&internal->topfont );
error = funcs->create( memory, &priv, &internal->topfont );
if ( error )
goto Exit;
@ -193,8 +192,7 @@
cff_make_private_dict( sub, &priv );
error = funcs->create( cffsize->face->memory, &priv,
&internal->subfonts[i - 1] );
error = funcs->create( memory, &priv, &internal->subfonts[i - 1] );
if ( error )
goto Exit;
}
@ -381,8 +379,7 @@
FT_Module module;
module = FT_Get_Module( slot->face->driver->root.library,
"pshinter" );
module = FT_Get_Module( slot->library, "pshinter" );
if ( module )
{
T2_Hints_Funcs funcs;
@ -722,22 +719,15 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var;
FT_UInt instance_index = (FT_UInt)face_index >> 16;
if ( FT_HAS_MULTIPLE_MASTERS( cffface ) &&
mm &&
instance_index > 0 )
{
error = mm->set_instance( cffface, instance_index );
error = FT_Set_Named_Instance( cffface, instance_index );
if ( error )
goto Exit;
if ( var )
var->metrics_adjust( cffface );
}
}
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
@ -1160,7 +1150,7 @@
}
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
cff_done_blend( face );
cff_done_blend( cffface );
face->blend = NULL;
#endif
}

View file

@ -63,10 +63,7 @@
/* allocate the stack buffer */
if ( FT_QNEW_ARRAY( parser->stack, stackSize ) )
{
FT_FREE( parser->stack );
goto Exit;
}
parser->stackSize = stackSize;
parser->top = parser->stack; /* empty stack */
@ -76,23 +73,6 @@
}
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
static void
finalize_t2_strings( FT_Memory memory,
void* data,
void* user )
{
CFF_T2_String t2 = (CFF_T2_String)data;
FT_UNUSED( user );
memory->free( memory, t2->start );
memory->free( memory, data );
}
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
FT_LOCAL_DEF( void )
cff_parser_done( CFF_Parser parser )
{
@ -102,63 +82,19 @@
FT_FREE( parser->stack );
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
FT_List_Finalize( &parser->t2_strings,
finalize_t2_strings,
memory,
NULL );
FT_List_Finalize( &parser->t2_strings, NULL, memory, NULL );
#endif
}
/* Assuming `first >= last'. */
static FT_Error
cff_parser_within_limits( CFF_Parser parser,
FT_Byte* first,
FT_Byte* last )
{
#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
/* Fast path for regular FreeType builds with the "new" engine; */
/* `first >= parser->start' can be assumed. */
FT_UNUSED( first );
return last < parser->limit ? FT_Err_Ok : FT_THROW( Invalid_Argument );
#else /* CFF_CONFIG_OPTION_OLD_ENGINE */
FT_ListNode node;
if ( first >= parser->start &&
last < parser->limit )
return FT_Err_Ok;
node = parser->t2_strings.head;
while ( node )
{
CFF_T2_String t2 = (CFF_T2_String)node->data;
if ( first >= t2->start &&
last < t2->limit )
return FT_Err_Ok;
node = node->next;
}
return FT_THROW( Invalid_Argument );
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
}
/* The parser limit checks in the next two functions are supposed */
/* to detect the immediate crossing of the stream boundary. They */
/* shall not be triggered from the distant t2_strings buffers. */
/* read an integer */
static FT_Long
cff_parse_integer( CFF_Parser parser,
FT_Byte* start )
cff_parse_integer( FT_Byte* start,
FT_Byte* limit )
{
FT_Byte* p = start;
FT_Int v = *p++;
@ -167,14 +103,14 @@
if ( v == 28 )
{
if ( cff_parser_within_limits( parser, p, p + 1 ) )
if ( p + 2 > limit && limit >= p )
goto Bad;
val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
}
else if ( v == 29 )
{
if ( cff_parser_within_limits( parser, p, p + 3 ) )
if ( p + 4 > limit && limit >= p )
goto Bad;
val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
@ -188,14 +124,14 @@
}
else if ( v < 251 )
{
if ( cff_parser_within_limits( parser, p, p ) )
if ( p + 1 > limit && limit >= p )
goto Bad;
val = ( v - 247 ) * 256 + p[0] + 108;
}
else
{
if ( cff_parser_within_limits( parser, p, p ) )
if ( p + 1 > limit && limit >= p )
goto Bad;
val = -( v - 251 ) * 256 - p[0] - 108;
@ -244,8 +180,8 @@
/* read a real */
static FT_Fixed
cff_parse_real( CFF_Parser parser,
FT_Byte* start,
cff_parse_real( FT_Byte* start,
FT_Byte* limit,
FT_Long power_ten,
FT_Long* scaling )
{
@ -282,7 +218,7 @@
p++;
/* Make sure we don't read past the end. */
if ( cff_parser_within_limits( parser, p, p ) )
if ( p + 1 > limit && limit >= p )
goto Bad;
}
@ -319,7 +255,7 @@
p++;
/* Make sure we don't read past the end. */
if ( cff_parser_within_limits( parser, p, p ) )
if ( p + 1 > limit && limit >= p )
goto Bad;
}
@ -358,7 +294,7 @@
p++;
/* Make sure we don't read past the end. */
if ( cff_parser_within_limits( parser, p, p ) )
if ( p + 1 > limit && limit >= p )
goto Bad;
}
@ -525,7 +461,7 @@
if ( **d == 30 )
{
/* binary-coded decimal is truncated to integer */
return cff_parse_real( parser, *d, 0, NULL ) >> 16;
return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16;
}
else if ( **d == 255 )
@ -551,7 +487,7 @@
}
else
return cff_parse_integer( parser, *d );
return cff_parse_integer( *d, parser->limit );
}
@ -562,15 +498,33 @@
FT_Long scaling )
{
if ( **d == 30 )
return cff_parse_real( parser, *d, scaling, NULL );
else
return cff_parse_real( *d, parser->limit, scaling, NULL );
else if ( **d == 255 )
{
FT_Long val = cff_parse_integer( parser, *d );
FT_Fixed val = ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
( (FT_UInt32)*( d[0] + 3 ) << 8 ) |
(FT_UInt32)*( d[0] + 4 ) ) );
if ( scaling )
{
if ( FT_ABS( val ) > power_ten_limits[scaling] )
{
FT_TRACE4(( "!!!OVERFLOW:!!!" ));
return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
}
val *= power_tens[scaling];
}
return val;
}
else
{
FT_Long val = cff_parse_integer( *d, parser->limit );
if ( scaling )
{
if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] )
{
val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
goto Overflow;
@ -600,7 +554,7 @@
/* read a floating point number, either integer or real */
static FT_Fixed
FT_LOCAL_DEF( FT_Fixed )
cff_parse_fixed( CFF_Parser parser,
FT_Byte** d )
{
@ -630,14 +584,14 @@
FT_ASSERT( scaling );
if ( **d == 30 )
return cff_parse_real( parser, *d, 0, scaling );
return cff_parse_real( *d, parser->limit, 0, scaling );
else
{
FT_Long number;
FT_Int integer_length;
number = cff_parse_integer( parser, d[0] );
number = cff_parse_integer( *d, parser->limit );
if ( number > 0x7FFFL )
{
@ -686,7 +640,7 @@
dict->has_font_matrix = TRUE;
/* We expect a well-formed font matrix, this is, the matrix elements */
/* We expect a well-formed font matrix, that is, the matrix elements */
/* `xx' and `yy' are of approximately the same magnitude. To avoid */
/* loss of precision, we use the magnitude of the largest matrix */
/* element to scale all other elements. The scaling factor is then */
@ -1265,10 +1219,7 @@
FT_ULong charstring_len;
FT_Fixed* stack;
FT_ListNode node;
CFF_T2_String t2;
FT_Fixed t2_size;
FT_Byte* q;
FT_Byte* q = NULL;
charstring_base = ++p;
@ -1309,39 +1260,18 @@
/* Now copy the stack data in the temporary decoder object, */
/* converting it back to charstring number representations */
/* (this is ugly, I know). */
/* The maximum required size is 5 bytes per stack element. */
if ( FT_QALLOC( q, (FT_Long)( 2 * sizeof ( FT_ListNode ) ) +
5 * ( decoder.top - decoder.stack ) ) )
goto Exit;
node = (FT_ListNode)memory->alloc( memory,
sizeof ( FT_ListNodeRec ) );
if ( !node )
goto Out_Of_Memory_Error;
FT_List_Add( &parser->t2_strings, (FT_ListNode)q );
FT_List_Add( &parser->t2_strings, node );
q += 2 * sizeof ( FT_ListNode );
t2 = (CFF_T2_String)memory->alloc( memory,
sizeof ( CFF_T2_StringRec ) );
if ( !t2 )
goto Out_Of_Memory_Error;
node->data = t2;
/* `5' is the conservative upper bound of required bytes per stack */
/* element. */
t2_size = 5 * ( decoder.top - decoder.stack );
q = (FT_Byte*)memory->alloc( memory, t2_size );
if ( !q )
goto Out_Of_Memory_Error;
t2->start = q;
t2->limit = q + t2_size;
stack = decoder.stack;
while ( stack < decoder.top )
for ( stack = decoder.stack; stack < decoder.top; stack++ )
{
FT_ULong num;
FT_Bool neg;
FT_Long num = *stack;
if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
@ -1349,59 +1279,30 @@
*parser->top++ = q;
if ( *stack < 0 )
{
num = (FT_ULong)NEG_LONG( *stack );
neg = 1;
}
else
{
num = (FT_ULong)*stack;
neg = 0;
}
if ( num & 0xFFFFU )
{
if ( neg )
num = (FT_ULong)-num;
*q++ = 255;
*q++ = ( num & 0xFF000000U ) >> 24;
*q++ = ( num & 0x00FF0000U ) >> 16;
*q++ = ( num & 0x0000FF00U ) >> 8;
*q++ = num & 0x000000FFU;
*q++ = (FT_Byte)( ( num >> 24 ) & 0xFF );
*q++ = (FT_Byte)( ( num >> 16 ) & 0xFF );
*q++ = (FT_Byte)( ( num >> 8 ) & 0xFF );
*q++ = (FT_Byte)( ( num ) & 0xFF );
}
else
{
num >>= 16;
if ( neg )
{
if ( num <= 107 )
*q++ = (FT_Byte)( 139 - num );
else if ( num <= 1131 )
{
*q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 );
*q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
}
else
{
num = (FT_ULong)-num;
*q++ = 28;
*q++ = (FT_Byte)( num >> 8 );
*q++ = (FT_Byte)( num & 0xFF );
}
}
else
{
if ( num <= 107 )
if ( -107 <= num && num <= 107 )
*q++ = (FT_Byte)( num + 139 );
else if ( num <= 1131 )
else if ( 108 <= num && num <= 1131 )
{
*q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
*q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
}
else if ( -1131 <= num && num <= -108 )
{
*q++ = (FT_Byte)( ( ( -num - 108 ) >> 8 ) + 251 );
*q++ = (FT_Byte)( ( -num - 108) & 0xFF );
}
else
{
*q++ = 28;
@ -1410,9 +1311,6 @@
}
}
}
stack++;
}
}
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
else
@ -1598,12 +1496,6 @@
Exit:
return error;
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
Out_Of_Memory_Error:
error = FT_THROW( Out_Of_Memory );
goto Exit;
#endif
Stack_Overflow:
error = FT_THROW( Invalid_Argument );
goto Exit;

View file

@ -76,6 +76,10 @@ FT_BEGIN_HEADER
cff_parse_num( CFF_Parser parser,
FT_Byte** d );
FT_LOCAL( FT_Fixed )
cff_parse_fixed( CFF_Parser parser,
FT_Byte** d );
FT_LOCAL( FT_Error )
cff_parser_init( CFF_Parser parser,
FT_UInt code,
@ -133,15 +137,6 @@ FT_BEGIN_HEADER
FT_END_HEADER
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
typedef struct CFF_T2_String_
{
FT_Byte* start;
FT_Byte* limit;
} CFF_T2_StringRec, *CFF_T2_String;
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
#endif /* CFFPARSE_H_ */

Some files were not shown because too many files have changed in this diff Show more