Compare commits

..

1 Commits

Author SHA1 Message Date
Anuj Verma a75690c855 [sdf] Fix sdf computation while `USE_SQUARED_DISTANCES`.
Function `map_fixed_to_sdf` expect spread to be absolute
and not squared.

* src/sdf/ftbsdf.c (finalize_sdf): Pass absolute spread
while `map_fixed_to_sdf`.

* src/sdf/ftsdf.c (sdf_generate_bounding_box): Ditto.
2022-01-27 15:23:47 +05:30
105 changed files with 1710 additions and 12209 deletions

View File

@ -5,7 +5,7 @@ stages:
# FIXME: Use --werror once warnings are fixed. # FIXME: Use --werror once warnings are fixed.
variables: variables:
MESON_ARGS: --fatal-meson-warnings --default-library=both MESON_ARGS: --fatal-meson-warnings
MESON_ARGS_WINDOWS: ${MESON_ARGS} --force-fallback-for=zlib MESON_ARGS_WINDOWS: ${MESON_ARGS} --force-fallback-for=zlib
.build windows common: .build windows common:
@ -48,17 +48,7 @@ variables:
# Make sure meson is up to date so we don't need to rebuild the image # Make sure meson is up to date so we don't need to rebuild the image
# with each release. # with each release.
- pip3 install meson==0.59.1 - pip3 install meson==0.59.1
- pip3 install --upgrade certifi
- pip3 install -U ninja - pip3 install -U ninja
# Generate a UWP cross-file in case it's used
- $PSDefaultParameterValues['Out-File:Encoding'] = 'ASCII'
- echo "[binaries]" > uwp-crossfile.meson
- echo "c = 'cl'" >> uwp-crossfile.meson
- echo "strip = ['true']" >> uwp-crossfile.meson
- echo "[built-in options]" >> uwp-crossfile.meson
- echo "c_args = ['-DWINAPI_FAMILY=WINAPI_FAMILY_APP', '-DUNICODE', '-D_WIN32_WINNT=0x0A00', '-we4013']" >> uwp-crossfile.meson
- echo "c_winlibs = ['windowsapp.lib']" >> uwp-crossfile.meson
script: script:
# For some reason, options are separated by newlines instead of spaces, # For some reason, options are separated by newlines instead of spaces,
# so we have to replace them first. # so we have to replace them first.
@ -69,10 +59,11 @@ variables:
# script. Environment variables substitutions is done by PowerShell # script. Environment variables substitutions is done by PowerShell
# before calling `cmd.exe`, that's why we use `$env:FOO` instead of # before calling `cmd.exe`, that's why we use `$env:FOO` instead of
# `%FOO%`. # `%FOO%`.
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH $env:VS_UWP && - cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
meson setup build $env:MESON_ARGS_WINDOWS $env:MESON_ARGS_UWP && meson setup build $env:MESON_ARGS_WINDOWS &&
meson compile --verbose -C build meson compile --verbose -C build &&
$env:MESON_WINDOWS_TESTS" meson test -C build &&
meson test -C build --benchmark"
# Format of job names: # Format of job names:
@ -85,20 +76,12 @@ windows meson vs2017 amd64:
extends: '.build windows meson' extends: '.build windows meson'
variables: variables:
ARCH: 'amd64' ARCH: 'amd64'
MESON_WINDOWS_TESTS: '&& meson test -C build && meson test -C build --benchmark'
windows meson vs2017 x86: windows meson vs2017 x86:
extends: '.build windows meson' extends: '.build windows meson'
variables: variables:
ARCH: 'x86' ARCH: 'x86'
MESON_WINDOWS_TESTS: '&& meson test -C build && meson test -C build --benchmark'
windows meson vs2017 amd64 uwp:
extends: '.build windows meson'
variables:
ARCH: 'amd64'
VS_UWP: '-app_platform=UWP'
MESON_ARGS_UWP: '--cross-file uwp-crossfile.meson -Dc_winlibs="windowsapp.lib"'
# Linux Jobs. # Linux Jobs.
# #
@ -147,8 +130,7 @@ linux autotools libs clang:
linux meson: linux meson:
extends: '.build linux common' extends: '.build linux common'
script: | script: |
meson setup build ${MESON_ARGS} \ meson setup build -Dbrotli=disabled \
-Dbrotli=disabled \
-Dbzip2=disabled \ -Dbzip2=disabled \
-Dharfbuzz=disabled \ -Dharfbuzz=disabled \
-Dpng=disabled \ -Dpng=disabled \
@ -160,8 +142,7 @@ linux meson:
linux meson libs: linux meson libs:
extends: '.build linux common' extends: '.build linux common'
script: | script: |
meson setup build ${MESON_ARGS} \ meson setup build -Dbrotli=enabled \
-Dbrotli=enabled \
-Dbzip2=enabled \ -Dbzip2=enabled \
-Dharfbuzz=disabled \ -Dharfbuzz=disabled \
-Dpng=disabled \ -Dpng=disabled \
@ -224,7 +205,7 @@ macos meson:
- pip3 install -U meson - pip3 install -U meson
- pip3 install --upgrade certifi - pip3 install --upgrade certifi
- pip3 install -U ninja - pip3 install -U ninja
- meson setup build ${MESON_ARGS} - meson setup build
- meson compile --verbose -C build - meson compile --verbose -C build
- sudo meson install -C build - sudo meson install -C build

View File

@ -106,9 +106,10 @@
# (this is compatible with the same CMake variables in zlib's CMake # (this is compatible with the same CMake variables in zlib's CMake
# support). # support).
# To minimize the number of cmake_policy() workarounds, # FreeType explicitly marks the API to be exported and relies on the compiler
# CMake >= 3 is requested. # to hide all other symbols. CMake supports a C_VISBILITY_PRESET property
cmake_minimum_required(VERSION 3.0) # starting with 2.8.12.
cmake_minimum_required(VERSION 2.8.12)
if (NOT CMAKE_VERSION VERSION_LESS 3.3) if (NOT CMAKE_VERSION VERSION_LESS 3.3)
# Allow symbol visibility settings also on static libraries. CMake < 3.3 # Allow symbol visibility settings also on static libraries. CMake < 3.3
@ -121,7 +122,6 @@ endif ()
include(CheckIncludeFile) include(CheckIncludeFile)
include(CMakeDependentOption) include(CMakeDependentOption)
include(FindPkgConfig)
# CMAKE_TOOLCHAIN_FILE must be set before `project' is called, which # CMAKE_TOOLCHAIN_FILE must be set before `project' is called, which
# configures the base build environment and references the toolchain file # configures the base build environment and references the toolchain file
@ -162,7 +162,7 @@ endif ()
project(freetype C) project(freetype C)
set(VERSION_MAJOR "2") set(VERSION_MAJOR "2")
set(VERSION_MINOR "12") set(VERSION_MINOR "11")
set(VERSION_PATCH "1") set(VERSION_PATCH "1")
# Generate LIBRARY_VERSION and LIBRARY_SOVERSION. # Generate LIBRARY_VERSION and LIBRARY_SOVERSION.
@ -239,7 +239,7 @@ if (BUILD_FRAMEWORK)
message(FATAL_ERROR message(FATAL_ERROR
"You should use Xcode generator with BUILD_FRAMEWORK enabled") "You should use Xcode generator with BUILD_FRAMEWORK enabled")
endif () endif ()
set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
set(BUILD_SHARED_LIBS ON) set(BUILD_SHARED_LIBS ON)
endif () endif ()
@ -271,16 +271,11 @@ if (NOT FT_DISABLE_ZLIB)
endif () endif ()
if (NOT FT_DISABLE_BZIP2) if (NOT FT_DISABLE_BZIP2)
# Genuine BZip2 does not provide bzip2.pc, but some platforms have it.
# For better dependency in freetype2.pc, bzip2.pc is searched
# regardless of the availability of libbz2. If bzip2.pc is found,
# Requires.private is used instead of Libs.private.
if (FT_REQUIRE_BZIP2) if (FT_REQUIRE_BZIP2)
find_package(BZip2 REQUIRED) find_package(BZip2 REQUIRED)
else () else ()
find_package(BZip2) find_package(BZip2)
endif () endif ()
pkg_check_modules(PC_BZIP2 bzip2)
endif () endif ()
if (NOT FT_DISABLE_BROTLI) if (NOT FT_DISABLE_BROTLI)
@ -491,48 +486,42 @@ if (BUILD_FRAMEWORK)
) )
set_target_properties(freetype PROPERTIES set_target_properties(freetype PROPERTIES
FRAMEWORK TRUE FRAMEWORK TRUE
MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/builds/mac/freetype-Info.plist MACOSX_FRAMEWORK_INFO_PLIST builds/mac/freetype-Info.plist
PUBLIC_HEADER "${PUBLIC_HEADERS}" PUBLIC_HEADER "${PUBLIC_HEADERS}"
XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
) )
endif () endif ()
set(PKGCONFIG_REQUIRES "") set(PKG_CONFIG_REQUIRED_PRIVATE "")
set(PKGCONFIG_REQUIRES_PRIVATE "") set(PKG_CONFIG_LIBS_PRIVATE "")
set(PKGCONFIG_LIBS "-L\${libdir} -lfreetype")
set(PKGCONFIG_LIBS_PRIVATE "")
if (ZLIB_FOUND) if (ZLIB_FOUND)
target_link_libraries(freetype PRIVATE ${ZLIB_LIBRARIES}) target_link_libraries(freetype PRIVATE ${ZLIB_LIBRARIES})
target_include_directories(freetype PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories(freetype PRIVATE ${ZLIB_INCLUDE_DIRS})
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "zlib") list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "zlib")
endif () endif ()
if (BZIP2_FOUND) if (BZIP2_FOUND)
target_link_libraries(freetype PRIVATE ${BZIP2_LIBRARIES}) target_link_libraries(freetype PRIVATE ${BZIP2_LIBRARIES})
target_include_directories(freetype PRIVATE ${BZIP2_INCLUDE_DIR}) # not BZIP2_INCLUDE_DIRS target_include_directories(freetype PRIVATE ${BZIP2_INCLUDE_DIR}) # not BZIP2_INCLUDE_DIRS
if (PC_BZIP2_FOUND) list(APPEND PKG_CONFIG_LIBS_PRIVATE "-lbz2")
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "bzip2")
else ()
list(APPEND PKGCONFIG_LIBS_PRIVATE "-lbz2")
endif ()
endif () endif ()
if (PNG_FOUND) if (PNG_FOUND)
target_link_libraries(freetype PRIVATE ${PNG_LIBRARIES}) target_link_libraries(freetype PRIVATE ${PNG_LIBRARIES})
target_compile_definitions(freetype PRIVATE ${PNG_DEFINITIONS}) target_compile_definitions(freetype PRIVATE ${PNG_DEFINITIONS})
target_include_directories(freetype PRIVATE ${PNG_INCLUDE_DIRS}) target_include_directories(freetype PRIVATE ${PNG_INCLUDE_DIRS})
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "libpng") list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libpng")
endif () endif ()
if (HarfBuzz_FOUND) if (HarfBuzz_FOUND)
target_link_libraries(freetype PRIVATE ${HarfBuzz_LIBRARY}) target_link_libraries(freetype PRIVATE ${HarfBuzz_LIBRARY})
target_include_directories(freetype PRIVATE ${HarfBuzz_INCLUDE_DIRS}) target_include_directories(freetype PRIVATE ${HarfBuzz_INCLUDE_DIRS})
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}") list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}")
endif () endif ()
if (BROTLIDEC_FOUND) if (BROTLIDEC_FOUND)
target_link_libraries(freetype PRIVATE ${BROTLIDEC_LIBRARIES}) target_link_libraries(freetype PRIVATE ${BROTLIDEC_LIBRARIES})
target_compile_definitions(freetype PRIVATE ${BROTLIDEC_DEFINITIONS}) target_compile_definitions(freetype PRIVATE ${BROTLIDEC_DEFINITIONS})
target_include_directories(freetype PRIVATE ${BROTLIDEC_INCLUDE_DIRS}) target_include_directories(freetype PRIVATE ${BROTLIDEC_INCLUDE_DIRS})
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "libbrotlidec") list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libbrotlidec")
endif () endif ()
@ -559,7 +548,7 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
# Generate the pkg-config file # Generate the pkg-config file
file(READ "${PROJECT_SOURCE_DIR}/builds/unix/freetype2.in" FREETYPE2_PC_IN) file(READ "${PROJECT_SOURCE_DIR}/builds/unix/freetype2.in" FREETYPE2_PC_IN)
string(REPLACE ";" ", " PKGCONFIG_REQUIRES_PRIVATE "${PKGCONFIG_REQUIRES_PRIVATE}") string(REPLACE ";" ", " PKG_CONFIG_REQUIRED_PRIVATE "${PKG_CONFIG_REQUIRED_PRIVATE}")
string(REPLACE "%prefix%" ${CMAKE_INSTALL_PREFIX} string(REPLACE "%prefix%" ${CMAKE_INSTALL_PREFIX}
FREETYPE2_PC_IN ${FREETYPE2_PC_IN}) FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
@ -571,26 +560,10 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
FREETYPE2_PC_IN ${FREETYPE2_PC_IN}) FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%ft_version%" "${LIBTOOL_CURRENT}.${LIBTOOL_REVISION}.${LIBTOOL_AGE}" string(REPLACE "%ft_version%" "${LIBTOOL_CURRENT}.${LIBTOOL_REVISION}.${LIBTOOL_AGE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN}) FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%REQUIRES_PRIVATE%" "${PKG_CONFIG_REQUIRED_PRIVATE}"
if (BUILD_SHARED_LIBS) FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_REQUIRES%" "${PKGCONFIG_REQUIRES}" string(REPLACE "%LIBS_PRIVATE%" "${PKG_CONFIG_LIBS_PRIVATE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN}) FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_REQUIRES_PRIVATE%" "${PKGCONFIG_REQUIRES_PRIVATE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_LIBS%" "${PKGCONFIG_LIBS}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_LIBS_PRIVATE%" "${PKGCONFIG_LIBS_PRIVATE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
else ()
string(REPLACE "%PKGCONFIG_REQUIRES%" "${PKGCONFIG_REQUIRES} ${PKGCONFIG_REQUIRES_PRIVATE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_REQUIRES_PRIVATE%" ""
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_LIBS%" "${PKGCONFIG_LIBS} ${PKGCONFIG_LIBS_PRIVATE}"
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
string(REPLACE "%PKGCONFIG_LIBS_PRIVATE%" ""
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
endif ()
set(FREETYPE2_PC_IN_NAME "${PROJECT_BINARY_DIR}/freetype2.pc") set(FREETYPE2_PC_IN_NAME "${PROJECT_BINARY_DIR}/freetype2.pc")
if (EXISTS "${FREETYPE2_PC_IN_NAME}") if (EXISTS "${FREETYPE2_PC_IN_NAME}")

12
README
View File

@ -1,4 +1,4 @@
FreeType 2.12.1 FreeType 2.11.1
=============== ===============
Homepage: https://www.freetype.org Homepage: https://www.freetype.org
@ -16,9 +16,7 @@ Read the files `docs/INSTALL*` for installation instructions; see the
file `docs/LICENSE.TXT` for the available licenses. file `docs/LICENSE.TXT` for the available licenses.
For using FreeType's git repository instead of a distribution bundle, For using FreeType's git repository instead of a distribution bundle,
please read file `README.git`. Note that you have to actually clone please read file `README.git`.
the repository; using a snapshot will not work (in other words, don't
use gitlab's 'Download' button).
The FreeType 2 API reference is located in directory `docs/reference`; The FreeType 2 API reference is located in directory `docs/reference`;
use the file `index.html` as the top entry point. [Please note that use the file `index.html` as the top entry point. [Please note that
@ -32,9 +30,9 @@ sites. Go to
and download one of the following files. and download one of the following files.
freetype-doc-2.12.1.tar.xz freetype-doc-2.11.1.tar.xz
freetype-doc-2.12.1.tar.gz freetype-doc-2.11.1.tar.gz
ftdoc2121.zip ftdoc2111.zip
To view the documentation online, go to To view the documentation online, go to

View File

@ -182,7 +182,7 @@ copy_submodule_files ()
cp $DLG_SRC_DIR/* src/dlg cp $DLG_SRC_DIR/* src/dlg
} }
if test -e ".git"; then if test -d ".git"; then
DLG_INC_DIR=subprojects/dlg/include/dlg DLG_INC_DIR=subprojects/dlg/include/dlg
DLG_SRC_DIR=subprojects/dlg/src/dlg DLG_SRC_DIR=subprojects/dlg/src/dlg

View File

@ -9,7 +9,7 @@
<string>English</string> <string>English</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>freetype</string> <string>FreeType</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>FreeType ${PROJECT_VERSION}</string> <string>FreeType ${PROJECT_VERSION}</string>

View File

@ -97,7 +97,7 @@
#define FT_DEPRECATED_ATTRIBUTE #define FT_DEPRECATED_ATTRIBUTE
#include <freetype/ftmac.h> #include FT_MAC_H
/* undefine blocking-macros in ftmac.h */ /* undefine blocking-macros in ftmac.h */
#undef FT_GetFile_From_Mac_Name #undef FT_GetFile_From_Mac_Name

View File

@ -304,12 +304,13 @@ do-dist: distclean refdoc
cp $(CONFIG_GUESS) builds/unix cp $(CONFIG_GUESS) builds/unix
cp $(CONFIG_SUB) builds/unix cp $(CONFIG_SUB) builds/unix
@# Generate `ChangeLog' file with commits since release 2.11.0 @# Generate `ChangeLog' file with commits since previous release.
@# (when we stopped creating this file manually).
$(CHANGELOG_SCRIPT) \ $(CHANGELOG_SCRIPT) \
--format='%B%n' \ --format='%B%n' \
--no-cluster \ --no-cluster \
-- VER-2-11-0..$(version_tag) \ -- `git describe --tags \
--abbrev=0 \
$(version_tag)^`..$(version_tag) \
> ChangeLog > ChangeLog
@# Remove intermediate files created by the `refdoc' target. @# Remove intermediate files created by the `refdoc' target.
@ -317,6 +318,6 @@ do-dist: distclean refdoc
rm -f docs/mkdocs.yml rm -f docs/mkdocs.yml
@# Remove more stuff related to git. @# Remove more stuff related to git.
rm -rf subprojects/dlg rm -rf subprojects
# EOF # EOF

View File

@ -17,7 +17,7 @@ AC_CONFIG_SRCDIR([ftconfig.h.in])
# Don't forget to update `docs/VERSIONS.TXT'! # Don't forget to update `docs/VERSIONS.TXT'!
version_info='24:3:18' version_info='24:1:18'
AC_SUBST([version_info]) AC_SUBST([version_info])
ft_version=`echo $version_info | tr : .` ft_version=`echo $version_info | tr : .`
AC_SUBST([ft_version]) AC_SUBST([ft_version])
@ -530,28 +530,16 @@ AC_SEARCH_LIBS([clock_gettime],
[test "$ac_cv_search_clock_gettime" = "none required" \ [test "$ac_cv_search_clock_gettime" = "none required" \
|| LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime]) || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
# 'librsvg' is needed to demonstrate SVG support.
PKG_CHECK_MODULES([LIBRSVG], [librsvg-2.0],
[have_librsvg="yes (pkg-config)"], [have_librsvg=no])
FT_DEMO_CFLAGS="" FT_DEMO_CFLAGS=""
FT_DEMO_LDFLAGS="$LIB_CLOCK_GETTIME" FT_DEMO_LDFLAGS="$LIB_CLOCK_GETTIME"
# 'librsvg' is needed to demonstrate SVG support. if test "$have_librsvg" != no; then
AC_ARG_WITH([librsvg], FT_DEMO_CFLAGS="$FT_DEMO_CFLAGS $LIBRSVG_CFLAGS -DHAVE_LIBRSVG"
[AS_HELP_STRING([--with-librsvg=@<:@yes|no|auto@:>@], FT_DEMO_LDFLAGS="$FT_DEMO_LDFLAGS $LIBRSVG_LIBS"
[support OpenType SVG fonts in FreeType demo programs @<:@default=auto@:>@])],
[], [with_librsvg=auto])
have_librsvg=no
if test x"$with_librsvg" = xyes -o x"$with_librsvg" = xauto; then
PKG_CHECK_MODULES([LIBRSVG], [librsvg-2.0 >= 2.46.0],
[have_librsvg="yes (pkg-config)"], [:])
if test "$have_librsvg" != no; then
FT_DEMO_CFLAGS="$FT_DEMO_CFLAGS $LIBRSVG_CFLAGS -DHAVE_LIBRSVG"
FT_DEMO_LDFLAGS="$FT_DEMO_LDFLAGS $LIBRSVG_LIBS"
fi
fi
if test x"$with_librsvg" = xyes -a "$have_librsvg" = no; then
AC_MSG_ERROR([librsvg support requested but library not found])
fi fi
AC_SUBST([FT_DEMO_CFLAGS]) AC_SUBST([FT_DEMO_CFLAGS])
@ -997,32 +985,32 @@ fi
# entries in Requires.private are separated by commas # entries in Requires.private are separated by commas
PKGCONFIG_REQUIRES_PRIVATE="$zlib_reqpriv, \ REQUIRES_PRIVATE="$zlib_reqpriv, \
$bzip2_reqpriv, \ $bzip2_reqpriv, \
$libpng_reqpriv, \ $libpng_reqpriv, \
$harfbuzz_reqpriv, \ $harfbuzz_reqpriv, \
$brotli_reqpriv" $brotli_reqpriv"
# beautify # beautify
PKGCONFIG_REQUIRES_PRIVATE=`echo "$PKGCONFIG_REQUIRES_PRIVATE" \ REQUIRES_PRIVATE=`echo "$REQUIRES_PRIVATE" \
| sed -e 's/^ *//' \ | sed -e 's/^ *//' \
-e 's/ *$//' \ -e 's/ *$//' \
-e 's/, */,/g' \ -e 's/, */,/g' \
-e 's/,,*/,/g' \ -e 's/,,*/,/g' \
-e 's/^,*//' \ -e 's/^,*//' \
-e 's/,*$//' \ -e 's/,*$//' \
-e 's/,/, /g'` -e 's/,/, /g'`
PKGCONFIG_LIBS_PRIVATE="$zlib_libspriv \ LIBS_PRIVATE="$zlib_libspriv \
$bzip2_libspriv \ $bzip2_libspriv \
$libpng_libspriv \ $libpng_libspriv \
$harfbuzz_libspriv \ $harfbuzz_libspriv \
$brotli_libspriv \ $brotli_libspriv \
$ft2_extra_libs" $ft2_extra_libs"
# beautify # beautify
PKGCONFIG_LIBS_PRIVATE=`echo "$PKGCONFIG_LIBS_PRIVATE" \ LIBS_PRIVATE=`echo "$LIBS_PRIVATE" \
| sed -e 's/^ *//' \ | sed -e 's/^ *//' \
-e 's/ *$//' \ -e 's/ *$//' \
-e 's/ */ /g'` -e 's/ */ /g'`
LIBSSTATIC_CONFIG="-lfreetype \ LIBSSTATIC_CONFIG="-lfreetype \
$zlib_libsstaticconf \ $zlib_libsstaticconf \
@ -1040,28 +1028,10 @@ LIBSSTATIC_CONFIG=`echo "$LIBSSTATIC_CONFIG" \
-e 's/ *$//' \ -e 's/ *$//' \
-e 's/ */ /g'` -e 's/ */ /g'`
# If FreeType gets installed with `--disable-shared', don't use
# 'private' fields. `pkg-config' only looks into `.pc' files and is
# completely agnostic to whether shared libraries are actually present
# or not. As a consequence, the user had to specify `--static' while
# calling `pkg-config', which configure scripts are normally not
# prepared for.
PKGCONFIG_REQUIRES=
PKGCONFIG_LIBS='-L${libdir} -lfreetype'
if test $enable_shared = "no"; then
PKGCONFIG_REQUIRES="$PKGCONFIG_REQUIRES $PKGCONFIG_REQUIRES_PRIVATE"
PKGCONFIG_REQUIRES_PRIVATE=
PKGCONFIG_LIBS="$PKGCONFIG_LIBS $PKGCONFIG_LIBS_PRIVATE"
PKGCONFIG_LIBS_PRIVATE=
fi
AC_SUBST([ftmac_c]) AC_SUBST([ftmac_c])
AC_SUBST([PKGCONFIG_REQUIRES]) AC_SUBST([REQUIRES_PRIVATE])
AC_SUBST([PKGCONFIG_LIBS]) AC_SUBST([LIBS_PRIVATE])
AC_SUBST([PKGCONFIG_REQUIRES_PRIVATE])
AC_SUBST([PKGCONFIG_LIBS_PRIVATE])
AC_SUBST([LIBSSTATIC_CONFIG]) AC_SUBST([LIBSSTATIC_CONFIG])
AC_SUBST([hardcode_libdir_flag_spec]) AC_SUBST([hardcode_libdir_flag_spec])

View File

@ -7,8 +7,8 @@ Name: FreeType 2
URL: https://freetype.org URL: https://freetype.org
Description: A free, high-quality, and portable font engine. Description: A free, high-quality, and portable font engine.
Version: %ft_version% Version: %ft_version%
Requires: %PKGCONFIG_REQUIRES% Requires:
Requires.private: %PKGCONFIG_REQUIRES_PRIVATE% Requires.private: %REQUIRES_PRIVATE%
Libs: %PKGCONFIG_LIBS% Libs: -L${libdir} -lfreetype
Libs.private: %PKGCONFIG_LIBS_PRIVATE% Libs.private: %LIBS_PRIVATE%
Cflags: -I${includedir}/freetype2 Cflags: -I${includedir}/freetype2

View File

@ -68,14 +68,12 @@ version_info := @version_info@
# Variables needed for `freetype-config' and `freetype.pc'. # Variables needed for `freetype-config' and `freetype.pc'.
# #
PKG_CONFIG := @PKG_CONFIG@ PKG_CONFIG := @PKG_CONFIG@
PKGCONFIG_REQUIRES := @PKGCONFIG_REQUIRES@ REQUIRES_PRIVATE := @REQUIRES_PRIVATE@
PKGCONFIG_REQUIRES_PRIVATE := @PKGCONFIG_REQUIRES_PRIVATE@ LIBS_PRIVATE := @LIBS_PRIVATE@
PKGCONFIG_LIBS := @PKGCONFIG_LIBS@ LIBSSTATIC_CONFIG := @LIBSSTATIC_CONFIG@
PKGCONFIG_LIBS_PRIVATE := @PKGCONFIG_LIBS_PRIVATE@ build_libtool_libs := @build_libtool_libs@
LIBSSTATIC_CONFIG := @LIBSSTATIC_CONFIG@ ft_version := @ft_version@
build_libtool_libs := @build_libtool_libs@
ft_version := @ft_version@
# The directory where all library files are placed. # The directory where all library files are placed.
# #
@ -139,17 +137,15 @@ prefix_x := $(subst $(space),\\$(space),$(prefix))
$(OBJ_BUILD)/freetype2.pc: $(TOP_DIR)/builds/unix/freetype2.in $(OBJ_BUILD)/freetype2.pc: $(TOP_DIR)/builds/unix/freetype2.in
rm -f $@ $@.tmp rm -f $@ $@.tmp
sed -e 's|%PKGCONFIG_REQUIRES%|$(PKGCONFIG_REQUIRES)|' \ sed -e 's|%REQUIRES_PRIVATE%|$(REQUIRES_PRIVATE)|' \
-e 's|%PKGCONFIG_REQUIRES_PRIVATE%|$(PKGCONFIG_REQUIRES_PRIVATE)|' \ -e 's|%LIBS_PRIVATE%|$(LIBS_PRIVATE)|' \
-e 's|%PKGCONFIG_LIBS%|$(PKGCONFIG_LIBS)|' \ -e 's|%build_libtool_libs%|$(build_libtool_libs)|' \
-e 's|%PKGCONFIG_LIBS_PRIVATE%|$(PKGCONFIG_LIBS_PRIVATE)|' \ -e 's|%exec_prefix%|$(exec_prefix_x)|' \
-e 's|%build_libtool_libs%|$(build_libtool_libs)|' \ -e 's|%ft_version%|$(ft_version)|' \
-e 's|%exec_prefix%|$(exec_prefix_x)|' \ -e 's|%includedir%|$(includedir_x)|' \
-e 's|%ft_version%|$(ft_version)|' \ -e 's|%libdir%|$(libdir_x)|' \
-e 's|%includedir%|$(includedir_x)|' \ -e 's|%prefix%|$(prefix_x)|' \
-e 's|%libdir%|$(libdir_x)|' \ $< \
-e 's|%prefix%|$(prefix_x)|' \
$< \
> $@.tmp > $@.tmp
chmod a-w $@.tmp chmod a-w $@.tmp
mv $@.tmp $@ mv $@.tmp $@

View File

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

View File

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

View File

@ -196,77 +196,19 @@
} }
/* non-desktop Universal Windows Platform */ #ifdef _WIN32_WCE
#if defined( WINAPI_FAMILY ) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
#define PACK_DWORD64( hi, lo ) ( ( (DWORD64)(hi) << 32 ) | (DWORD)(lo) )
#define CreateFileMapping( a, b, c, d, e, f ) \
CreateFileMappingFromApp( a, b, c, PACK_DWORD64( d, e ), f )
#define MapViewOfFile( a, b, c, d, e ) \
MapViewOfFileFromApp( a, b, PACK_DWORD64( c, d ), e )
FT_LOCAL_DEF( HANDLE ) FT_LOCAL_DEF( HANDLE )
CreateFileA( LPCSTR lpFileName, CreateFileA( LPCSTR lpFileName,
DWORD dwDesiredAccess, DWORD dwDesiredAccess,
DWORD dwShareMode, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile ) HANDLE hTemplateFile )
{ {
int len; int len;
LPWSTR lpFileNameW; LPWSTR lpFileNameW;
CREATEFILE2_EXTENDED_PARAMETERS createExParams = {
sizeof ( CREATEFILE2_EXTENDED_PARAMETERS ),
dwFlagsAndAttributes & 0x0000FFFF,
dwFlagsAndAttributes & 0xFFF00000,
dwFlagsAndAttributes & 0x000F0000,
lpSecurityAttributes,
hTemplateFile };
/* allocate memory space for converted path name */
len = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS,
lpFileName, -1, NULL, 0 );
lpFileNameW = (LPWSTR)_alloca( len * sizeof ( WCHAR ) );
if ( !len || !lpFileNameW )
{
FT_ERROR(( "FT_Stream_Open: cannot convert file name to LPWSTR\n" ));
return INVALID_HANDLE_VALUE;
}
/* now it is safe to do the translation */
MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS,
lpFileName, -1, lpFileNameW, len );
/* open the file */
return CreateFile2( lpFileNameW, dwDesiredAccess, dwShareMode,
dwCreationDisposition, &createExParams );
}
#endif
#if defined( _WIN32_WCE )
/* malloc.h provides implementation of alloca()/_alloca() */
#include <malloc.h>
FT_LOCAL_DEF( HANDLE )
CreateFileA( LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile )
{
int len;
LPWSTR lpFileNameW;
/* allocate memory space for converted path name */ /* allocate memory space for converted path name */
@ -293,13 +235,12 @@
#endif #endif
#if defined( _WIN32_WCE ) || defined ( _WIN32_WINDOWS ) || \ #if defined( _WIN32_WCE ) || defined ( _WIN32_WINDOWS ) || \
!defined( _WIN32_WINNT ) || _WIN32_WINNT <= 0x0400 !defined( _WIN32_WINNT ) || _WIN32_WINNT <= 0x0400
FT_LOCAL_DEF( BOOL ) FT_LOCAL_DEF( BOOL )
GetFileSizeEx( HANDLE hFile, GetFileSizeEx( HANDLE hFile,
PLARGE_INTEGER lpFileSize ) PLARGE_INTEGER lpFileSize )
{ {
lpFileSize->u.LowPart = GetFileSize( hFile, lpFileSize->u.LowPart = GetFileSize( hFile,
(DWORD *)&lpFileSize->u.HighPart ); (DWORD *)&lpFileSize->u.HighPart );

View File

@ -485,7 +485,6 @@
<ClCompile Include="..\..\..\src\sfnt\sfnt.c" /> <ClCompile Include="..\..\..\src\sfnt\sfnt.c" />
<ClCompile Include="..\..\..\src\smooth\smooth.c" /> <ClCompile Include="..\..\..\src\smooth\smooth.c" />
<ClCompile Include="..\..\..\src\sdf\sdf.c" /> <ClCompile Include="..\..\..\src\sdf\sdf.c" />
<ClCompile Include="..\..\..\src\svg\svg.c" />
<ClCompile Include="..\..\..\src\truetype\truetype.c" /> <ClCompile Include="..\..\..\src\truetype\truetype.c" />
<ClCompile Include="..\..\..\src\type1\type1.c" /> <ClCompile Include="..\..\..\src\type1\type1.c" />
<ClCompile Include="..\..\..\src\type42\type42.c" /> <ClCompile Include="..\..\..\src\type42\type42.c" />

View File

@ -68,9 +68,6 @@
<ClCompile Include="..\..\..\src\smooth\smooth.c"> <ClCompile Include="..\..\..\src\smooth\smooth.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\svg\svg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\truetype\truetype.c"> <ClCompile Include="..\..\..\src\truetype\truetype.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -146,4 +143,4 @@
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

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

View File

@ -442,10 +442,6 @@
RelativePath="..\..\..\src\smooth\smooth.c" RelativePath="..\..\..\src\smooth\smooth.c"
> >
</File> </File>
<File
RelativePath="..\..\..\src\svg\svg.c"
>
</File>
<Filter <Filter
Name="FT_MODULES" Name="FT_MODULES"
> >

View File

@ -12,7 +12,7 @@
<p>This directory contains project files <tt>freetype.dsp</tt> for <p>This directory contains project files <tt>freetype.dsp</tt> for
Visual C++ 6.0, and <tt>freetype.vcproj</tt> for Visual C++ 2002 Visual C++ 6.0, and <tt>freetype.vcproj</tt> for Visual C++ 2002
through 2008, which you might need to upgrade automatically. through 2008, which you might need to upgrade automatically.
It compiles the following libraries from the FreeType 2.12.1 sources:</p> It compiles the following libraries from the FreeType 2.11.1 sources:</p>
<ul> <ul>
<li>freetype.dll using 'Release' or 'Debug' configurations</li> <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> <li>PPC/SP WM6 (Windows Mobile 6)</li>
</ul> </ul>
It compiles the following libraries from the FreeType 2.12.1 sources:</p> It compiles the following libraries from the FreeType 2.11.1 sources:</p>
<ul> <ul>
<pre> <pre>

View File

@ -1,33 +1,3 @@
CHANGES BETWEEN 2.12.0 and 2.12.1
I. IMPORTANT BUG FIXES
- Loading CFF fonts sometimes made FreeType crash (bug introduced in
version 2.12.0)
- Loading a fully hinted TrueType glyph a second time (without
caching) sometimes yielded different rendering results if TrueType
hinting was active (bug introduced in version 2.12.0).
- The generation of the pkg-config file `freetype2.pc` was broken if
the build was done with cmake (bug introduced in version 2.12.0).
II. MISCELLANEOUS
- New option `--with-librsvg` for the `configure` script for better
FreeType demo support.
- The meson build no longer enforces both static and dynamic
versions of the library by default.
- The internal zlib library was updated to version 1.2.12. Note,
however, that FreeType is *not* affected by CVE-2018-25032 since
it only does decompression.
======================================================================
CHANGES BETWEEN 2.11.1 and 2.12.0 CHANGES BETWEEN 2.11.1 and 2.12.0
I. IMPORTANT CHANGES I. IMPORTANT CHANGES
@ -40,41 +10,7 @@ CHANGES BETWEEN 2.11.1 and 2.12.0
programs have been set up to use 'librsvg' as the rendering programs have been set up to use 'librsvg' as the rendering
library. library.
This work was Moazin Khatti's GSoC 2019 project. This work was Moazin Kathri's GSoC 2019 project.
II. MISCELLANEOUS
- The handling of fonts with an 'sbix' table has been improved.
- Corrected bitmap offsets.
- A new tag `FT_PARAM_TAG_IGNORE_SBIX` for `FT_Open_Face` makes
FreeType ignore an 'sbix' table in a font, allowing applications
to access the font's outline glyphs.
- `FT_FACE_FLAG_SBIX` and `FT_FACE_FLAG_SBIX_OVERLAY` together
with their corresponding preprocessor macros `FT_HAS_SBIX` and
`FT_HAS_SBIX_OVERLAY` enable applications to treat 'sbix' tables
as described in the OpenType specification.
- The internal 'zlib' code has been updated to be in sync with the
current 'zlib' version (1.2.11).
- The previously internal load flag `FT_LOAD_SBITS_ONLY` is now
public.
- Some minor improvements of the building systems, in particular
handling of the 'zlib' library (internal vs. external).
- Support for non-desktop Universal Windows Platform.
- Various other minor bug and documentation fixes.
- The `ftdump` demo program shows more information for Type1 fonts
if option `-n` is given.
- `ftgrid` can now display embedded bitmap strikes.
====================================================================== ======================================================================

View File

@ -60,8 +60,6 @@ found on _most_ systems, but not all of them:
release libtool so release libtool so
------------------------------- -------------------------------
2.12.1 24.3.18 6.18.3
2.12.0 24.2.18 6.18.2
2.11.1 24.1.18 6.18.1 2.11.1 24.1.18 6.18.1
2.11.0 24.0.18 6.18.0 2.11.0 24.0.18 6.18.0
2.10.4 23.4.17 6.17.4 2.10.4 23.4.17 6.17.4

View File

@ -1,4 +1,4 @@
.TH FREETYPE-CONFIG 1 "May 2022" "FreeType 2.12.1" .TH FREETYPE-CONFIG 1 "December 2021" "FreeType 2.11.1"
. .
. .
.SH NAME .SH NAME

View File

@ -77,14 +77,13 @@ How to prepare a new release
#!/bin/sh #!/bin/sh
VERSION=2.12.0 VERSION=2.10.4
SAVANNAH_USER=wl SAVANNAH_USER=wl
SOURCEFORGE_USER=wlemb SOURCEFORGE_USER=wlemb
GPG_KEY_ID=BE6C3AAC63AD8E3F
##################################################################### #####################################################################
GPG="/usr/bin/gpg --batch --no-tty --local-user $GPG_KEY_ID" GPG='/usr/bin/gpg --batch --no-tty'
version=`echo $VERSION | sed "s/\\.//g"` version=`echo $VERSION | sed "s/\\.//g"`

View File

@ -154,8 +154,6 @@ FT_BEGIN_HEADER
* FT_FACE_FLAG_EXTERNAL_STREAM * FT_FACE_FLAG_EXTERNAL_STREAM
* FT_FACE_FLAG_HINTER * FT_FACE_FLAG_HINTER
* FT_FACE_FLAG_SVG * FT_FACE_FLAG_SVG
* FT_FACE_FLAG_SBIX
* FT_FACE_FLAG_SBIX_OVERLAY
* *
* FT_HAS_HORIZONTAL * FT_HAS_HORIZONTAL
* FT_HAS_VERTICAL * FT_HAS_VERTICAL
@ -165,8 +163,6 @@ FT_BEGIN_HEADER
* FT_HAS_COLOR * FT_HAS_COLOR
* FT_HAS_MULTIPLE_MASTERS * FT_HAS_MULTIPLE_MASTERS
* FT_HAS_SVG * FT_HAS_SVG
* FT_HAS_SBIX
* FT_HAS_SBIX_OVERLAY
* *
* FT_IS_SFNT * FT_IS_SFNT
* FT_IS_SCALABLE * FT_IS_SCALABLE
@ -231,7 +227,6 @@ FT_BEGIN_HEADER
* FT_LOAD_NO_SCALE * FT_LOAD_NO_SCALE
* FT_LOAD_NO_HINTING * FT_LOAD_NO_HINTING
* FT_LOAD_NO_BITMAP * FT_LOAD_NO_BITMAP
* FT_LOAD_SBITS_ONLY
* FT_LOAD_NO_AUTOHINT * FT_LOAD_NO_AUTOHINT
* FT_LOAD_COLOR * FT_LOAD_COLOR
* *
@ -1240,16 +1235,6 @@ FT_BEGIN_HEADER
* *
* FT_FACE_FLAG_SVG :: * FT_FACE_FLAG_SVG ::
* [Since 2.12] The face has an 'SVG~' OpenType table. * [Since 2.12] The face has an 'SVG~' OpenType table.
*
* FT_FACE_FLAG_SBIX ::
* [Since 2.12] The face has an 'sbix' OpenType table *and* outlines.
* For such fonts, @FT_FACE_FLAG_SCALABLE is not set by default to
* retain backward compatibility.
*
* FT_FACE_FLAG_SBIX_OVERLAY ::
* [Since 2.12] The face has an 'sbix' OpenType table where outlines
* should be drawn on top of bitmap strikes.
*
*/ */
#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) #define FT_FACE_FLAG_SCALABLE ( 1L << 0 )
#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) #define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 )
@ -1268,8 +1253,6 @@ FT_BEGIN_HEADER
#define FT_FACE_FLAG_COLOR ( 1L << 14 ) #define FT_FACE_FLAG_COLOR ( 1L << 14 )
#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) #define FT_FACE_FLAG_VARIATION ( 1L << 15 )
#define FT_FACE_FLAG_SVG ( 1L << 16 ) #define FT_FACE_FLAG_SVG ( 1L << 16 )
#define FT_FACE_FLAG_SBIX ( 1L << 17 )
#define FT_FACE_FLAG_SBIX_OVERLAY ( 1L << 18 )
/************************************************************************** /**************************************************************************
@ -1526,108 +1509,6 @@ FT_BEGIN_HEADER
( !!( (face)->face_flags & FT_FACE_FLAG_SVG ) ) ( !!( (face)->face_flags & FT_FACE_FLAG_SVG ) )
/**************************************************************************
*
* @macro:
* FT_HAS_SBIX
*
* @description:
* A macro that returns true whenever a face object contains an 'sbix'
* OpenType table *and* outline glyphs.
*
* Currently, FreeType only supports bitmap glyphs in PNG format for this
* table (i.e., JPEG and TIFF formats are unsupported, as are
* Apple-specific formats not part of the OpenType specification).
*
* @note:
* For backward compatibility, a font with an 'sbix' table is treated as
* a bitmap-only face. Using @FT_Open_Face with
* @FT_PARAM_TAG_IGNORE_SBIX, an application can switch off 'sbix'
* handling so that the face is treated as an ordinary outline font with
* scalable outlines.
*
* Here is some pseudo code that roughly illustrates how to implement
* 'sbix' handling according to the OpenType specification.
*
* ```
* if ( FT_HAS_SBIX( face ) )
* {
* // open font as a scalable one without sbix handling
* FT_Face face2;
* FT_Parameter param = { FT_PARAM_TAG_IGNORE_SBIX, NULL };
* FT_Open_Args args = { FT_OPEN_PARAMS | ...,
* ...,
* 1, &param };
*
*
* FT_Open_Face( library, &args, 0, &face2 );
*
* <sort `face->available_size` as necessary into
* `preferred_sizes`[*]>
*
* for ( i = 0; i < face->num_fixed_sizes; i++ )
* {
* size = preferred_sizes[i].size;
*
* error = FT_Set_Pixel_Sizes( face, size, size );
* <error handling omitted>
*
* // check whether we have a glyph in a bitmap strike
* error = FT_Load_Glyph( face,
* glyph_index,
* FT_LOAD_SBITS_ONLY |
* FT_LOAD_BITMAP_METRICS_ONLY );
* if ( error == FT_Err_Invalid_Argument )
* continue;
* else if ( error )
* <other error handling omitted>
* else
* break;
* }
*
* if ( i != face->num_fixed_sizes )
* <load embedded bitmap with `FT_Load_Glyph`,
* scale it, display it, etc.>
*
* if ( i == face->num_fixed_sizes ||
* FT_HAS_SBIX_OVERLAY( face ) )
* <use `face2` to load outline glyph with `FT_Load_Glyph`,
* scale it, display it on top of the bitmap, etc.>
* }
* ```
*
* [*] Assuming a target value of 400dpi and available strike sizes 100,
* 200, 300, and 400dpi, a possible order might be [400, 200, 300, 100]:
* scaling 200dpi to 400dpi usually gives better results than scaling
* 300dpi to 400dpi; it is also much faster. However, scaling 100dpi to
* 400dpi can yield a too pixelated result, thus the preference might be
* 300dpi over 100dpi.
*
* @since:
* 2.12
*/
#define FT_HAS_SBIX( face ) \
( !!( (face)->face_flags & FT_FACE_FLAG_SBIX ) )
/**************************************************************************
*
* @macro:
* FT_HAS_SBIX_OVERLAY
*
* @description:
* A macro that returns true whenever a face object contains an 'sbix'
* OpenType table with bit~1 in its `flags` field set, instructing the
* application to overlay the bitmap strike with the corresponding
* outline glyph. See @FT_HAS_SBIX for pseudo code how to use it.
*
* @since:
* 2.12
*/
#define FT_HAS_SBIX_OVERLAY( face ) \
( !!( (face)->face_flags & FT_FACE_FLAG_SBIX_OVERLAY ) )
/************************************************************************** /**************************************************************************
* *
* @enum: * @enum:
@ -3095,15 +2976,6 @@ FT_BEGIN_HEADER
* *
* @FT_LOAD_NO_SCALE always sets this flag. * @FT_LOAD_NO_SCALE always sets this flag.
* *
* FT_LOAD_SBITS_ONLY ::
* [Since 2.12] This is the opposite of @FT_LOAD_NO_BITMAP, more or
* less: @FT_Load_Glyph returns `FT_Err_Invalid_Argument` if the face
* contains a bitmap strike for the given size (or the strike selected
* by @FT_Select_Size) but there is no glyph in the strike.
*
* Note that this load flag was part of FreeType since version 2.0.6
* but previously tagged as internal.
*
* FT_LOAD_VERTICAL_LAYOUT :: * FT_LOAD_VERTICAL_LAYOUT ::
* Load the glyph for vertical text layout. In particular, the * Load the glyph for vertical text layout. In particular, the
* `advance` value in the @FT_GlyphSlotRec structure is set to the * `advance` value in the @FT_GlyphSlotRec structure is set to the
@ -3182,12 +3054,11 @@ FT_BEGIN_HEADER
* the OpenType specification), make @FT_Render_Glyph provide a default * the OpenType specification), make @FT_Render_Glyph provide a default
* blending of the color glyph layers associated with the glyph index, * blending of the color glyph layers associated with the glyph index,
* using the same bitmap format as embedded color bitmap images. This * using the same bitmap format as embedded color bitmap images. This
* is mainly for convenience and works only for glyphs in 'COLR' v0 * is mainly for convenience and works for 'COLR' v0 tables only. For
* tables (or glyphs in 'COLR' v1 tables that exclusively use v0 * full control of color layers use @FT_Get_Color_Glyph_Layer and
* features). For full control of color layers use * FreeType's color functions like @FT_Palette_Select instead of
* @FT_Get_Color_Glyph_Layer and FreeType's color functions like * setting @FT_LOAD_COLOR for rendering so that the client application
* @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering * can handle blending by itself.
* so that the client application can handle blending by itself.
* *
* FT_LOAD_COMPUTE_METRICS :: * FT_LOAD_COMPUTE_METRICS ::
* [Since 2.6.1] Compute glyph metrics from the glyph data, without the * [Since 2.6.1] Compute glyph metrics from the glyph data, without the
@ -3248,7 +3119,6 @@ FT_BEGIN_HEADER
#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) #define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 )
#define FT_LOAD_MONOCHROME ( 1L << 12 ) #define FT_LOAD_MONOCHROME ( 1L << 12 )
#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) #define FT_LOAD_LINEAR_DESIGN ( 1L << 13 )
#define FT_LOAD_SBITS_ONLY ( 1L << 14 )
#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) #define FT_LOAD_NO_AUTOHINT ( 1L << 15 )
/* Bits 16-19 are used by `FT_LOAD_TARGET_` */ /* Bits 16-19 are used by `FT_LOAD_TARGET_` */
#define FT_LOAD_COLOR ( 1L << 20 ) #define FT_LOAD_COLOR ( 1L << 20 )
@ -3259,6 +3129,7 @@ FT_BEGIN_HEADER
/* used internally only by certain font drivers */ /* used internally only by certain font drivers */
#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) #define FT_LOAD_ADVANCE_ONLY ( 1L << 8 )
#define FT_LOAD_SBITS_ONLY ( 1L << 14 )
#define FT_LOAD_SVG_ONLY ( 1L << 23 ) #define FT_LOAD_SVG_ONLY ( 1L << 23 )
@ -3537,44 +3408,6 @@ FT_BEGIN_HEADER
* } * }
* *
* ``` * ```
*
* FreeType has two rasterizers for generating SDF, namely:
*
* 1. `sdf` for generating SDF directly from glyph's outline, and
*
* 2. `bsdf` for generating SDF from rasterized bitmaps.
*
* Depending on the glyph type (i.e., outline or bitmap), one of the two
* rasterizers is chosen at runtime and used for generating SDFs. To
* force the use of `bsdf` you should render the glyph with any of the
* FreeType's other rendering modes (e.g., `FT_RENDER_MODE_NORMAL`) and
* then re-render with `FT_RENDER_MODE_SDF`.
*
* There are some issues with stability and possible failures of the SDF
* renderers (specifically `sdf`).
*
* 1. The `sdf` rasterizer is sensitive to really small features (e.g.,
* sharp turns that are less than 1~pixel) and imperfections in the
* glyph's outline, causing artifacts in the final output.
*
* 2. The `sdf` rasterizer has limited support for handling intersecting
* contours and *cannot* handle self-intersecting contours whatsoever.
* Self-intersection happens when a single connected contour intersect
* itself at some point; having these in your font definitely pose a
* problem to the rasterizer and cause artifacts, too.
*
* 3. Generating SDF for really small glyphs may result in undesirable
* output; the pixel grid (which stores distance information) becomes
* too coarse.
*
* 4. Since the output buffer is normalized, precision at smaller spreads
* is greater than precision at larger spread values because the
* output range of [0..255] gets mapped to a smaller SDF range. A
* spread of~2 should be sufficient in most cases.
*
* Points (1) and (2) can be avoided by using the `bsdf` rasterizer,
* which is more stable than the `sdf` rasterizer in general.
*
*/ */
typedef enum FT_Render_Mode_ typedef enum FT_Render_Mode_
{ {
@ -4941,7 +4774,7 @@ FT_BEGIN_HEADER
* *
*/ */
#define FREETYPE_MAJOR 2 #define FREETYPE_MAJOR 2
#define FREETYPE_MINOR 12 #define FREETYPE_MINOR 11
#define FREETYPE_PATCH 1 #define FREETYPE_PATCH 1

View File

@ -528,14 +528,14 @@ FT_BEGIN_HEADER
* @fields: * @fields:
* num_color_stops :: * num_color_stops ::
* The number of color stops for the requested glyph index. Set by * The number of color stops for the requested glyph index. Set by
* @FT_Get_Paint. * @FT_Get_Colorline_Stops.
* *
* current_color_stop :: * current_color_stop ::
* The current color stop. Set by @FT_Get_Colorline_Stops. * The current color stop. Set by @FT_Get_Colorline_Stops.
* *
* p :: * p ::
* An opaque pointer into 'COLR' table data. Set by @FT_Get_Paint. * An opaque pointer into 'COLR' table data. The caller must set this
* Updated by @FT_Get_Colorline_Stops. * to `NULL` before the first call of @FT_Get_Colorline_Stops.
* *
* @since: * @since:
* 2.11 -- **currently experimental only!** There might be changes * 2.11 -- **currently experimental only!** There might be changes

View File

@ -584,9 +584,9 @@ FT_BEGIN_HEADER
* The glyph image is translated with the `origin` vector before * The glyph image is translated with the `origin` vector before
* rendering. * rendering.
* *
* The first parameter is a pointer to an @FT_Glyph handle that will be * The first parameter is a pointer to an @FT_Glyph handle, that will be
* _replaced_ by this function (with newly allocated data). Typically, * _replaced_ by this function (with newly allocated data). Typically,
* you would do something like the following (omitting error handling). * you would use (omitting error handling):
* *
* ``` * ```
* FT_Glyph glyph; * FT_Glyph glyph;
@ -603,7 +603,7 @@ FT_BEGIN_HEADER
* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )
* { * {
* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,
* 0, 1 ); * 0, 1 );
* if ( error ) // `glyph' unchanged * if ( error ) // `glyph' unchanged
* ... * ...
* } * }
@ -618,7 +618,7 @@ FT_BEGIN_HEADER
* FT_Done_Glyph( glyph ); * FT_Done_Glyph( glyph );
* ``` * ```
* *
* Here is another example, again without error handling. * Here is another example, again without error handling:
* *
* ``` * ```
* FT_Glyph glyphs[MAX_GLYPHS] * FT_Glyph glyphs[MAX_GLYPHS]

View File

@ -401,11 +401,11 @@ FT_BEGIN_HEADER
* information. * information.
* *
* FT_OUTLINE_OVERLAP :: * FT_OUTLINE_OVERLAP ::
* [Since 2.10.3] This flag indicates that this outline contains * This flag indicates that this outline contains overlapping contrours
* overlapping contours and the anti-aliased renderer should perform * and the anti-aliased renderer should perform oversampling to
* oversampling to mitigate possible artifacts. This flag should _not_ * mitigate possible artifacts. This flag should _not_ be set for
* be set for well designed glyphs without overlaps because it quadruples * well designed glyphs without overlaps because it quadruples the
* the rendering time. * rendering time.
* *
* FT_OUTLINE_HIGH_PRECISION :: * FT_OUTLINE_HIGH_PRECISION ::
* This flag indicates that the scan-line converter should try to * This flag indicates that the scan-line converter should try to

View File

@ -47,9 +47,6 @@ FT_BEGIN_HEADER
* MM fonts, others will work with all three types. They are similar * MM fonts, others will work with all three types. They are similar
* enough that a consistent interface makes sense. * enough that a consistent interface makes sense.
* *
* For Adobe MM fonts, macro @FT_IS_SFNT returns false. For GX and
* OpenType variation fonts, it returns true.
*
*/ */

View File

@ -109,13 +109,11 @@ FT_BEGIN_HEADER
* FreeType error code. 0~means success. * FreeType error code. 0~means success.
* *
* @note: * @note:
* Degenerate contours, segments, and Bezier arcs may be reported. In * A contour that contains a single point only is represented by a 'move
* most cases, it is best to filter these out before using the outline * to' operation followed by 'line to' to the same point. In most cases,
* for stroking or other path modification purposes (which may cause * it is best to filter this out before using the outline for stroking
* degenerate segments to become non-degenrate and visible, like when * purposes (otherwise it would result in a visible dot when round caps
* stroke caps are used or the path is otherwise outset). Some glyph * are used).
* outlines may contain deliberate degenerate single points for mark
* attachement.
* *
* Similarly, the function returns success for an empty outline also * Similarly, the function returns success for an empty outline also
* (doing nothing, this is, not calling any emitter); if necessary, you * (doing nothing, this is, not calling any emitter); if necessary, you

View File

@ -112,21 +112,6 @@ FT_BEGIN_HEADER
FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
/**************************************************************************
*
* @enum:
* FT_PARAM_TAG_IGNORE_SBIX
*
* @description:
* A tag for @FT_Parameter to make @FT_Open_Face ignore an 'sbix' table
* while loading a font. Use this if @FT_FACE_FLAG_SBIX is set and you
* want to access the outline glyphs in the font.
*
*/
#define FT_PARAM_TAG_IGNORE_SBIX \
FT_MAKE_TAG( 'i', 's', 'b', 'x' )
/************************************************************************** /**************************************************************************
* *
* @enum: * @enum:

View File

@ -1,83 +0,0 @@
/****************************************************************************
*
* ftmmtypes.h
*
* OpenType Variations type definitions for internal use
* with the multi-masters service (specification).
*
* Copyright (C) 2022 by
* David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
* Dominik Röttsches.
*
* This file is part of the FreeType project, and may only be used,
* modified, and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
*/
#ifndef FTMMTYPES_H_
#define FTMMTYPES_H_
FT_BEGIN_HEADER
typedef struct GX_ItemVarDataRec_
{
FT_UInt itemCount; /* number of delta sets per item */
FT_UInt regionIdxCount; /* number of region indices in this data */
FT_UInt* regionIndices; /* array of `regionCount' indices; */
/* these index `varRegionList' */
FT_Short* deltaSet; /* array of `itemCount' deltas */
/* use `innerIndex' for this array */
} GX_ItemVarDataRec, *GX_ItemVarData;
/* contribution of one axis to a region */
typedef struct GX_AxisCoordsRec_
{
FT_Fixed startCoord;
FT_Fixed peakCoord; /* zero means no effect (factor = 1) */
FT_Fixed endCoord;
} GX_AxisCoordsRec, *GX_AxisCoords;
typedef struct GX_VarRegionRec_
{
GX_AxisCoords axisList; /* array of axisCount records */
} GX_VarRegionRec, *GX_VarRegion;
/* item variation store */
typedef struct GX_ItemVarStoreRec_
{
FT_UInt dataCount;
GX_ItemVarData varData; /* array of dataCount records; */
/* use `outerIndex' for this array */
FT_UShort axisCount;
FT_UInt regionCount; /* total number of regions defined */
GX_VarRegion varRegionList;
} GX_ItemVarStoreRec, *GX_ItemVarStore;
typedef struct GX_DeltaSetIdxMapRec_
{
FT_ULong mapCount;
FT_UInt* outerIndex; /* indices to item var data */
FT_UInt* innerIndex; /* indices to delta set */
} GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
FT_END_HEADER
#endif /* FTMMTYPES_H_ */
/* END */

View File

@ -5,7 +5,7 @@
* The FreeType Multiple Masters and GX var services (specification). * The FreeType Multiple Masters and GX var services (specification).
* *
* Copyright (C) 2003-2022 by * Copyright (C) 2003-2022 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. * David Turner, Robert Wilhelm, and Werner Lemberg.
* *
* This file is part of the FreeType project, and may only be used, * This file is part of the FreeType project, and may only be used,
* modified, and distributed under the terms of the FreeType project * modified, and distributed under the terms of the FreeType project
@ -20,7 +20,6 @@
#define SVMM_H_ #define SVMM_H_
#include <freetype/internal/ftserv.h> #include <freetype/internal/ftserv.h>
#include <freetype/internal/ftmmtypes.h>
FT_BEGIN_HEADER FT_BEGIN_HEADER
@ -97,94 +96,53 @@ FT_BEGIN_HEADER
FT_UInt* len, FT_UInt* len,
FT_Fixed* weight_vector ); FT_Fixed* weight_vector );
typedef FT_Error
(*FT_Var_Load_Delta_Set_Idx_Map_Func)( FT_Face face,
FT_ULong offset,
GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore,
FT_ULong table_len );
typedef FT_Error
(*FT_Var_Load_Item_Var_Store_Func)( FT_Face face,
FT_ULong offset,
GX_ItemVarStore itemStore );
typedef FT_Int
(*FT_Var_Get_Item_Delta_Func)( FT_Face face,
GX_ItemVarStore itemStore,
FT_UInt outerIndex,
FT_UInt innerIndex );
typedef void
(*FT_Var_Done_Item_Var_Store_Func)( FT_Face face,
GX_ItemVarStore itemStore );
typedef void
(*FT_Var_Done_Delta_Set_Idx_Map_Func)( FT_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap );
FT_DEFINE_SERVICE( MultiMasters ) FT_DEFINE_SERVICE( MultiMasters )
{ {
FT_Get_MM_Func get_mm; FT_Get_MM_Func get_mm;
FT_Set_MM_Design_Func set_mm_design; FT_Set_MM_Design_Func set_mm_design;
FT_Set_MM_Blend_Func set_mm_blend; FT_Set_MM_Blend_Func set_mm_blend;
FT_Get_MM_Blend_Func get_mm_blend; FT_Get_MM_Blend_Func get_mm_blend;
FT_Get_MM_Var_Func get_mm_var; FT_Get_MM_Var_Func get_mm_var;
FT_Set_Var_Design_Func set_var_design; FT_Set_Var_Design_Func set_var_design;
FT_Get_Var_Design_Func get_var_design; FT_Get_Var_Design_Func get_var_design;
FT_Set_Instance_Func set_instance; FT_Set_Instance_Func set_instance;
FT_Set_MM_WeightVector_Func set_mm_weightvector; FT_Set_MM_WeightVector_Func set_mm_weightvector;
FT_Get_MM_WeightVector_Func get_mm_weightvector; FT_Get_MM_WeightVector_Func get_mm_weightvector;
/* for internal use; only needed for code sharing between modules */ /* for internal use; only needed for code sharing between modules */
FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map; FT_Get_Var_Blend_Func get_var_blend;
FT_Var_Load_Item_Var_Store_Func load_item_var_store; FT_Done_Blend_Func done_blend;
FT_Var_Get_Item_Delta_Func get_item_delta;
FT_Var_Done_Item_Var_Store_Func done_item_var_store;
FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_idx_map;
FT_Get_Var_Blend_Func get_var_blend;
FT_Done_Blend_Func done_blend;
}; };
#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ #define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
get_mm_, \ get_mm_, \
set_mm_design_, \ set_mm_design_, \
set_mm_blend_, \ set_mm_blend_, \
get_mm_blend_, \ get_mm_blend_, \
get_mm_var_, \ get_mm_var_, \
set_var_design_, \ set_var_design_, \
get_var_design_, \ get_var_design_, \
set_instance_, \ set_instance_, \
set_weightvector_, \ set_weightvector_, \
get_weightvector_, \ get_weightvector_, \
load_delta_set_idx_map_, \ get_var_blend_, \
load_item_var_store_, \ done_blend_ ) \
get_item_delta_, \ static const FT_Service_MultiMastersRec class_ = \
done_item_var_store_, \ { \
done_delta_set_idx_map_, \ get_mm_, \
get_var_blend_, \ set_mm_design_, \
done_blend_ ) \ set_mm_blend_, \
static const FT_Service_MultiMastersRec class_ = \ get_mm_blend_, \
{ \ get_mm_var_, \
get_mm_, \ set_var_design_, \
set_mm_design_, \ get_var_design_, \
set_mm_blend_, \ set_instance_, \
get_mm_blend_, \ set_weightvector_, \
get_mm_var_, \ get_weightvector_, \
set_var_design_, \ get_var_blend_, \
get_var_design_, \ done_blend_ \
set_instance_, \
set_weightvector_, \
get_weightvector_, \
load_delta_set_idx_map_, \
load_item_var_store_, \
get_item_delta_, \
done_item_var_store_, \
done_delta_set_idx_map_, \
get_var_blend_, \
done_blend_ \
}; };
/* */ /* */

View File

@ -453,22 +453,22 @@ FT_BEGIN_HEADER
/************************************************************************** /**************************************************************************
* *
* @function: * @function:
* FT_Has_PS_Glyph_Names * FT_Has_PS_Glyph_Names
* *
* @description: * @description:
* Return true if a given face provides reliable PostScript glyph names. * Return true if a given face provides reliable PostScript glyph names.
* This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that * This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that
* certain fonts (mostly TrueType) contain incorrect glyph name tables. * certain fonts (mostly TrueType) contain incorrect glyph name tables.
* *
* When this function returns true, the caller is sure that the glyph * When this function returns true, the caller is sure that the glyph
* names returned by @FT_Get_Glyph_Name are reliable. * names returned by @FT_Get_Glyph_Name are reliable.
* *
* @input: * @input:
* face :: * face ::
* face handle * face handle
* *
* @return: * @return:
* Boolean. True if glyph names are reliable. * Boolean. True if glyph names are reliable.
* *
*/ */
FT_EXPORT( FT_Int ) FT_EXPORT( FT_Int )
@ -478,40 +478,30 @@ FT_BEGIN_HEADER
/************************************************************************** /**************************************************************************
* *
* @function: * @function:
* FT_Get_PS_Font_Info * FT_Get_PS_Font_Info
* *
* @description: * @description:
* Retrieve the @PS_FontInfoRec structure corresponding to a given * Retrieve the @PS_FontInfoRec structure corresponding to a given
* PostScript font. * PostScript font.
* *
* @input: * @input:
* face :: * face ::
* PostScript face handle. * PostScript face handle.
* *
* @output: * @output:
* afont_info :: * afont_info ::
* A pointer to a @PS_FontInfoRec object. * Output font info structure pointer.
* *
* @return: * @return:
* FreeType error code. 0~means success. * FreeType error code. 0~means success.
* *
* @note: * @note:
* String pointers within the @PS_FontInfoRec structure are owned by the * String pointers within the @PS_FontInfoRec structure are owned by the
* face and don't need to be freed by the caller. Missing entries in the * face and don't need to be freed by the caller. Missing entries in
* font's FontInfo dictionary are represented by `NULL` pointers. * the font's FontInfo dictionary are represented by `NULL` pointers.
* *
* The following font formats support this feature: 'Type~1', 'Type~42', * If the font's format is not PostScript-based, this function will
* 'CFF', 'CID~Type~1'. For other font formats this function returns the * return the `FT_Err_Invalid_Argument` error code.
* `FT_Err_Invalid_Argument` error code.
*
* @example:
* ```
* PS_FontInfoRec font_info;
*
*
* error = FT_Get_PS_Font_Info( face, &font_info );
* ...
* ```
* *
*/ */
FT_EXPORT( FT_Error ) FT_EXPORT( FT_Error )
@ -522,39 +512,29 @@ FT_BEGIN_HEADER
/************************************************************************** /**************************************************************************
* *
* @function: * @function:
* FT_Get_PS_Font_Private * FT_Get_PS_Font_Private
* *
* @description: * @description:
* Retrieve the @PS_PrivateRec structure corresponding to a given * Retrieve the @PS_PrivateRec structure corresponding to a given
* PostScript font. * PostScript font.
* *
* @input: * @input:
* face :: * face ::
* PostScript face handle. * PostScript face handle.
* *
* @output: * @output:
* afont_private :: * afont_private ::
* A pointer to a @PS_PrivateRec object. * Output private dictionary structure pointer.
* *
* @return: * @return:
* FreeType error code. 0~means success. * FreeType error code. 0~means success.
* *
* @note: * @note:
* The string pointers within the @PS_PrivateRec structure are owned by * The string pointers within the @PS_PrivateRec structure are owned by
* the face and don't need to be freed by the caller. * the face and don't need to be freed by the caller.
* *
* Only the 'Type~1' font format supports this feature. For other font * If the font's format is not PostScript-based, this function returns
* formats this function returns the `FT_Err_Invalid_Argument` error * the `FT_Err_Invalid_Argument` error code.
* code.
*
* @example:
* ```
* PS_PrivateRec font_private;
*
*
* error = FT_Get_PS_Font_Private( face, &font_private );
* ...
* ```
* *
*/ */
FT_EXPORT( FT_Error ) FT_EXPORT( FT_Error )
@ -713,67 +693,67 @@ FT_BEGIN_HEADER
/************************************************************************** /**************************************************************************
* *
* @function: * @function:
* FT_Get_PS_Font_Value * FT_Get_PS_Font_Value
* *
* @description: * @description:
* Retrieve the value for the supplied key from a PostScript font. * Retrieve the value for the supplied key from a PostScript font.
* *
* @input: * @input:
* face :: * face ::
* PostScript face handle. * PostScript face handle.
* *
* key :: * key ::
* An enumeration value representing the dictionary key to retrieve. * An enumeration value representing the dictionary key to retrieve.
* *
* idx :: * idx ::
* For array values, this specifies the index to be returned. * For array values, this specifies the index to be returned.
* *
* value :: * value ::
* A pointer to memory into which to write the value. * A pointer to memory into which to write the value.
* *
* valen_len :: * valen_len ::
* The size, in bytes, of the memory supplied for the value. * The size, in bytes, of the memory supplied for the value.
* *
* @output: * @output:
* value :: * value ::
* The value matching the above key, if it exists. * The value matching the above key, if it exists.
* *
* @return: * @return:
* The amount of memory (in bytes) required to hold the requested value * The amount of memory (in bytes) required to hold the requested value
* (if it exists, -1 otherwise). * (if it exists, -1 otherwise).
* *
* @note: * @note:
* The values returned are not pointers into the internal structures of * The values returned are not pointers into the internal structures of
* the face, but are 'fresh' copies, so that the memory containing them * the face, but are 'fresh' copies, so that the memory containing them
* belongs to the calling application. This also enforces the * belongs to the calling application. This also enforces the
* 'read-only' nature of these values, i.e., this function cannot be * 'read-only' nature of these values, i.e., this function cannot be
* used to manipulate the face. * used to manipulate the face.
* *
* `value` is a void pointer because the values returned can be of * `value` is a void pointer because the values returned can be of
* various types. * various types.
* *
* If either `value` is `NULL` or `value_len` is too small, just the * If either `value` is `NULL` or `value_len` is too small, just the
* required memory size for the requested entry is returned. * required memory size for the requested entry is returned.
* *
* The `idx` parameter is used, not only to retrieve elements of, for * The `idx` parameter is used, not only to retrieve elements of, for
* example, the FontMatrix or FontBBox, but also to retrieve name keys * example, the FontMatrix or FontBBox, but also to retrieve name keys
* from the CharStrings dictionary, and the charstrings themselves. It * from the CharStrings dictionary, and the charstrings themselves. It
* is ignored for atomic values. * is ignored for atomic values.
* *
* `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To * `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To
* get the value as in the font stream, you need to divide by 65536000.0 * get the value as in the font stream, you need to divide by 65536000.0
* (to remove the FT_Fixed scale, and the x1000 scale). * (to remove the FT_Fixed scale, and the x1000 scale).
* *
* IMPORTANT: Only key/value pairs read by the FreeType interpreter can * IMPORTANT: Only key/value pairs read by the FreeType interpreter can
* be retrieved. So, for example, PostScript procedures such as NP, ND, * be retrieved. So, for example, PostScript procedures such as NP, ND,
* and RD are not available. Arbitrary keys are, obviously, not be * and RD are not available. Arbitrary keys are, obviously, not be
* available either. * available either.
* *
* If the font's format is not PostScript-based, this function returns * If the font's format is not PostScript-based, this function returns
* the `FT_Err_Invalid_Argument` error code. * the `FT_Err_Invalid_Argument` error code.
* *
* @since: * @since:
* 2.4.8 * 2.4.8
* *
*/ */
FT_EXPORT( FT_Long ) FT_EXPORT( FT_Long )

View File

@ -25,6 +25,7 @@
project('freetype2', 'c', project('freetype2', 'c',
meson_version: '>= 0.55.0', meson_version: '>= 0.55.0',
default_options: ['default_library=both'],
version: run_command('builds/meson/extract_freetype_version.py', version: run_command('builds/meson/extract_freetype_version.py',
'include/freetype/freetype.h', 'include/freetype/freetype.h',
check: true).stdout().strip(), check: true).stdout().strip(),

View File

@ -469,7 +469,7 @@
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_Memory memory = svg_glyph->library->memory; FT_Memory memory = svg_glyph->library->memory;
FT_SVG_Document document = NULL; FT_SVG_Document document;
if ( FT_NEW( document ) ) if ( FT_NEW( document ) )

View File

@ -105,7 +105,7 @@
/* Don't want warnings about our own use of deprecated functions. */ /* Don't want warnings about our own use of deprecated functions. */
#define FT_DEPRECATED_ATTRIBUTE #define FT_DEPRECATED_ATTRIBUTE
#include <freetype/ftmac.h> #include FT_MAC_H
#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ #ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault #define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
@ -314,7 +314,7 @@
NULL, NULL, NULL ) ) NULL, NULL, NULL ) )
return ( OSType ) 0; return ( OSType ) 0;
return ( (FInfo *)( info.finderInfo ) )->fdType; return ((FInfo *)(info.finderInfo))->fdType;
} }
@ -462,7 +462,7 @@
if ( ps_name_len != 0 ) if ( ps_name_len != 0 )
{ {
ft_memcpy( ps_name, names[0] + 1, ps_name_len ); ft_memcpy(ps_name, names[0] + 1, ps_name_len);
ps_name[ps_name_len] = 0; ps_name[ps_name_len] = 0;
} }
if ( style->indexes[face_index] > 1 && if ( style->indexes[face_index] > 1 &&

View File

@ -334,7 +334,7 @@
/* if SVG table exists, allocate the space in `slot->other` */ /* if SVG table exists, allocate the space in `slot->other` */
if ( slot->face->face_flags & FT_FACE_FLAG_SVG ) if ( slot->face->face_flags & FT_FACE_FLAG_SVG )
{ {
FT_SVG_Document document = NULL; FT_SVG_Document document;
if ( FT_NEW( document ) ) if ( FT_NEW( document ) )
@ -1674,6 +1674,7 @@
FT_FREE( stream->base ); FT_FREE( stream->base );
stream->size = 0; stream->size = 0;
stream->base = NULL;
stream->close = NULL; stream->close = NULL;
} }
@ -2527,16 +2528,6 @@
#endif #endif
/* only use lower 31 bits together with sign bit */
if ( face_index > 0 )
face_index &= 0x7FFFFFFFL;
else
{
face_index = -face_index;
face_index &= 0x7FFFFFFFL;
face_index = -face_index;
}
#ifdef FT_DEBUG_LEVEL_TRACE #ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE3(( "FT_Open_Face: " )); FT_TRACE3(( "FT_Open_Face: " ));
if ( face_index < 0 ) if ( face_index < 0 )
@ -3409,9 +3400,6 @@
if ( !face ) if ( !face )
return FT_THROW( Invalid_Face_Handle ); return FT_THROW( Invalid_Face_Handle );
if ( !face->size )
return FT_THROW( Invalid_Size_Handle );
if ( !req || req->width < 0 || req->height < 0 || if ( !req || req->width < 0 || req->height < 0 ||
req->type >= FT_SIZE_REQUEST_TYPE_MAX ) req->type >= FT_SIZE_REQUEST_TYPE_MAX )
return FT_THROW( Invalid_Argument ); return FT_THROW( Invalid_Argument );

View File

@ -402,17 +402,17 @@
FT_Long *result_offset ); FT_Long *result_offset );
CONST_FT_RFORK_RULE_ARRAY_BEGIN( ft_raccess_guess_table, CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
ft_raccess_guess_rec ) ft_raccess_guess_rec)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( apple_double, apple_double ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( apple_single, apple_single ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_ufs_export, darwin_ufs_export ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_newvfs, darwin_newvfs ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_hfsplus, darwin_hfsplus ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( vfat, vfat ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_cap, linux_cap ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_double, linux_double ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double)
CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_netatalk, linux_netatalk ) CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk)
CONST_FT_RFORK_RULE_ARRAY_END CONST_FT_RFORK_RULE_ARRAY_END
@ -868,7 +868,9 @@
const char* tmp; const char* tmp;
const char* slash; const char* slash;
size_t new_length; size_t new_length;
FT_Error error; FT_Error error = FT_Err_Ok;
FT_UNUSED( error );
new_length = ft_strlen( original_name ) + ft_strlen( insertion ); new_length = ft_strlen( original_name ) + ft_strlen( insertion );

View File

@ -18,8 +18,8 @@
#include<windows.h> #include<windows.h>
#define FT_VERSION 2,12,1,0 #define FT_VERSION 2,11,1,0
#define FT_VERSION_STR "2.12.1" #define FT_VERSION_STR "2.11.1"
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION FT_VERSION FILEVERSION FT_VERSION
@ -45,7 +45,7 @@ BEGIN
VALUE "FileVersion", FT_VERSION_STR VALUE "FileVersion", FT_VERSION_STR
VALUE "ProductName", "FreeType" VALUE "ProductName", "FreeType"
VALUE "ProductVersion", FT_VERSION_STR VALUE "ProductVersion", FT_VERSION_STR
VALUE "LegalCopyright", "\251 2000-2022 The FreeType Project www.freetype.org. All rights reserved." VALUE "LegalCopyright", "\251 2000-2021 The FreeType Project www.freetype.org. All rights reserved."
VALUE "InternalName", "freetype" VALUE "InternalName", "freetype"
VALUE "OriginalFilename", FT_FILENAME VALUE "OriginalFilename", FT_FILENAME
END END

View File

@ -13,7 +13,7 @@ This code implements a BDF driver for the FreeType library, following the
Adobe Specification V 2.2. The specification of the BDF font format is Adobe Specification V 2.2. The specification of the BDF font format is
available from Adobe's web site: available from Adobe's web site:
https://adobe-type-tools.github.io/font-tech-notes/pdfs/5005.BDF_Spec.pdf https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5005.BDF_Spec.pdf
Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org). Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org).
They do not define vertical metrics, because the X Consortium BDF They do not define vertical metrics, because the X Consortium BDF
@ -23,10 +23,6 @@ specification has removed them.
Encodings Encodings
********* *********
[This section is out of date, retained for historical reasons. BDF
properties can be retrieved with `FT_Get_BDF_Property`, character set ID
values with `FT_Get_BDF_Charset_ID`.]
The variety of encodings that accompanies bdf fonts appears to encompass the The variety of encodings that accompanies bdf fonts appears to encompass the
small set defined in freetype.h. On the other hand, two properties that small set defined in freetype.h. On the other hand, two properties that
specify encoding and registry are usually defined in bdf fonts. specify encoding and registry are usually defined in bdf fonts.

View File

@ -57,9 +57,8 @@
/* it is better to use FreeType memory routines instead of raw /* it is better to use FreeType memory routines instead of raw
'malloc/free' */ 'malloc/free' */
typedef void* (*alloc_func)( void*, int, int ); typedef void *(* alloc_func)(void*, int, int);
typedef void (*free_func) ( void*, void* ); typedef void (* free_func)(void*, void*);
static void* static void*
ft_bzip2_alloc( FT_Memory memory, ft_bzip2_alloc( FT_Memory memory,

View File

@ -210,7 +210,7 @@ FT_BEGIN_HEADER
#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ #define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \
FT_BEGIN_STMNT \ FT_BEGIN_STMNT \
FTC_Node *_bucket, *_pnode, _node; \ FTC_Node *_bucket, *_pnode, _node; \
FTC_Cache _cache = FTC_CACHE( cache ); \ FTC_Cache _cache = FTC_CACHE(cache); \
FT_Offset _hash = (FT_Offset)(hash); \ FT_Offset _hash = (FT_Offset)(hash); \
FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \
FT_Bool _list_changed = FALSE; \ FT_Bool _list_changed = FALSE; \

2
src/cache/ftccmap.c vendored
View File

@ -112,7 +112,7 @@
FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; FTC_CMapQuery query = (FTC_CMapQuery)ftcquery;
FT_Error error; FT_Error error;
FT_Memory memory = cache->memory; FT_Memory memory = cache->memory;
FTC_CMapNode node = NULL; FTC_CMapNode node;
FT_UInt nn; FT_UInt nn;

View File

@ -140,8 +140,8 @@ FT_BEGIN_HEADER
} FTC_FamilyRec, *FTC_Family; } FTC_FamilyRec, *FTC_Family;
#define FTC_FAMILY( x ) ( (FTC_Family)(x) ) #define FTC_FAMILY(x) ( (FTC_Family)(x) )
#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) ) #define FTC_FAMILY_P(x) ( (FTC_Family*)(x) )
typedef struct FTC_GNodeRec_ typedef struct FTC_GNodeRec_
@ -245,7 +245,7 @@ FT_BEGIN_HEADER
#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) #define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x))
#define FTC_CACHE_GCACHE_CLASS( x ) \ #define FTC_CACHE_GCACHE_CLASS( x ) \
FTC_GCACHE_CLASS( FTC_CACHE( x )->org_class ) FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class )
#define FTC_CACHE_FAMILY_CLASS( x ) \ #define FTC_CACHE_FAMILY_CLASS( x ) \
( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class ) ( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class )

View File

@ -61,7 +61,7 @@
{ {
FT_Memory memory = cache->memory; FT_Memory memory = cache->memory;
FT_Error error; FT_Error error;
FTC_INode inode = NULL; FTC_INode inode;
if ( !FT_QNEW( inode ) ) if ( !FT_QNEW( inode ) )
@ -74,7 +74,6 @@
/* initialize its inner fields */ /* initialize its inner fields */
FTC_GNode_Init( gnode, gindex, family ); FTC_GNode_Init( gnode, gindex, family );
inode->glyph = NULL;
/* we will now load the glyph image */ /* we will now load the glyph image */
error = clazz->family_load_glyph( family, gindex, cache, error = clazz->family_load_glyph( family, gindex, cache,

View File

@ -51,8 +51,8 @@ FT_BEGIN_HEADER
} FTC_INodeRec, *FTC_INode; } FTC_INodeRec, *FTC_INode;
#define FTC_INODE( x ) ( (FTC_INode)( x ) ) #define FTC_INODE( x ) ( (FTC_INode)( x ) )
#define FTC_INODE_GINDEX( x ) FTC_GNODE( x )->gindex #define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex
#define FTC_INODE_FAMILY( x ) FTC_GNODE( x )->family #define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family
typedef FT_Error typedef FT_Error
(*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family,
@ -72,7 +72,7 @@ FT_BEGIN_HEADER
#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) #define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x))
#define FTC_CACHE_IFAMILY_CLASS( x ) \ #define FTC_CACHE_IFAMILY_CLASS( x ) \
FTC_IFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class ) FTC_IFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS(x)->family_class )
/* can be used as a @FTC_Node_FreeFunc */ /* can be used as a @FTC_Node_FreeFunc */

4
src/cache/ftcmru.c vendored
View File

@ -262,9 +262,7 @@
if ( list->clazz.node_done ) if ( list->clazz.node_done )
list->clazz.node_done( node, list->data ); list->clazz.node_done( node, list->data );
} }
else if ( FT_QALLOC( node, list->clazz.node_size ) )
/* zero new node in case of node_init failure */
else if ( FT_ALLOC( node, list->clazz.node_size ) )
goto Exit; goto Exit;
error = list->clazz.node_init( node, key, list->data ); error = list->clazz.node_init( node, key, list->data );

View File

@ -171,7 +171,7 @@
sbit->xadvance = (FT_Char)xadvance; sbit->xadvance = (FT_Char)xadvance;
sbit->yadvance = (FT_Char)yadvance; sbit->yadvance = (FT_Char)yadvance;
sbit->format = (FT_Byte)bitmap->pixel_mode; sbit->format = (FT_Byte)bitmap->pixel_mode;
sbit->max_grays = (FT_Byte)( bitmap->num_grays - 1 ); sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1);
if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
{ {
@ -248,9 +248,7 @@
snode->count = count; snode->count = count;
for ( node_count = 0; node_count < count; node_count++ ) for ( node_count = 0; node_count < count; node_count++ )
{ {
snode->sbits[node_count].width = 255; snode->sbits[node_count].width = 255;
snode->sbits[node_count].height = 0;
snode->sbits[node_count].buffer = NULL;
} }
error = ftc_snode_load( snode, error = ftc_snode_load( snode,

View File

@ -61,7 +61,7 @@ FT_BEGIN_HEADER
typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; typedef const FTC_SFamilyClassRec* FTC_SFamilyClass;
#define FTC_SFAMILY_CLASS( x ) ( (FTC_SFamilyClass)(x) ) #define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x))
#define FTC_CACHE_SFAMILY_CLASS( x ) \ #define FTC_CACHE_SFAMILY_CLASS( x ) \
FTC_SFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class ) FTC_SFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class )

View File

@ -81,7 +81,7 @@
if ( char_code < 255 ) if ( char_code < 255 )
{ {
FT_UInt code = (FT_UInt)( char_code + 1 ); FT_UInt code = (FT_UInt)(char_code + 1);
for (;;) for (;;)

View File

@ -5,7 +5,7 @@
* OpenType font driver implementation (body). * OpenType font driver implementation (body).
* *
* Copyright (C) 1996-2022 by * Copyright (C) 1996-2022 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. * David Turner, Robert Wilhelm, and Werner Lemberg.
* *
* This file is part of the FreeType project, and may only be used, * This file is part of the FreeType project, and may only be used,
* modified, and distributed under the terms of the FreeType project * modified, and distributed under the terms of the FreeType project
@ -936,103 +936,22 @@
} }
static FT_Error
cff_load_item_variation_store( CFF_Face face,
FT_ULong offset,
GX_ItemVarStore itemStore )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
return mm->load_item_var_store( FT_FACE(face), offset, itemStore );
}
static FT_Error
cff_load_delta_set_index_mapping( CFF_Face face,
FT_ULong offset,
GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore,
FT_ULong table_len )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
return mm->load_delta_set_idx_map( FT_FACE( face ), offset, map,
itemStore, table_len );
}
static FT_Int
cff_get_item_delta( CFF_Face face,
GX_ItemVarStore itemStore,
FT_UInt outerIndex,
FT_UInt innerIndex )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
return mm->get_item_delta( FT_FACE( face ), itemStore,
outerIndex, innerIndex );
}
static void
cff_done_item_variation_store( CFF_Face face,
GX_ItemVarStore itemStore )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
mm->done_item_var_store( FT_FACE( face ), itemStore );
}
static void
cff_done_delta_set_index_map( CFF_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap )
{
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
mm->done_delta_set_idx_map( FT_FACE ( face ), deltaSetIdxMap );
}
FT_DEFINE_SERVICE_MULTIMASTERSREC( FT_DEFINE_SERVICE_MULTIMASTERSREC(
cff_service_multi_masters, cff_service_multi_masters,
(FT_Get_MM_Func) NULL, /* get_mm */ (FT_Get_MM_Func) NULL, /* get_mm */
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */ (FT_Set_MM_Design_Func) NULL, /* set_mm_design */
(FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */ (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_Blend_Func) cff_get_mm_blend, /* get_mm_blend */
(FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */ (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_Set_Var_Design_Func) cff_set_var_design, /* set_var_design */
(FT_Get_Var_Design_Func)cff_get_var_design, /* get_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_Instance_Func) cff_set_instance, /* set_instance */
(FT_Set_MM_WeightVector_Func) (FT_Set_MM_WeightVector_Func)cff_set_mm_weightvector, /* set_mm_weightvector */
cff_set_mm_weightvector, (FT_Get_MM_WeightVector_Func)cff_get_mm_weightvector, /* get_mm_weightvector */
/* set_mm_weightvector */
(FT_Get_MM_WeightVector_Func) (FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */
cff_get_mm_weightvector, (FT_Done_Blend_Func) cff_done_blend /* done_blend */
/* get_mm_weightvector */
(FT_Var_Load_Delta_Set_Idx_Map_Func)
cff_load_delta_set_index_mapping,
/* load_delta_set_idx_map */
(FT_Var_Load_Item_Var_Store_Func)
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)
cff_done_item_variation_store,
/* done_item_variation_store */
(FT_Var_Done_Delta_Set_Idx_Map_Func)
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 */
) )

View File

@ -29,14 +29,6 @@
#include "cfferrs.h" #include "cfferrs.h"
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
#define IS_DEFAULT_INSTANCE( _face ) \
( !( FT_IS_NAMED_INSTANCE( _face ) || \
FT_IS_VARIATION( _face ) ) )
#else
#define IS_DEFAULT_INSTANCE( _face ) 1
#endif
/************************************************************************** /**************************************************************************
* *
@ -75,7 +67,7 @@
#endif /* FT_CONFIG_OPTION_INCREMENTAL */ #endif /* FT_CONFIG_OPTION_INCREMENTAL */
{ {
CFF_Font cff = (CFF_Font)( face->extra.data ); CFF_Font cff = (CFF_Font)(face->extra.data);
return cff_index_access_element( &cff->charstrings_index, glyph_index, return cff_index_access_element( &cff->charstrings_index, glyph_index,
@ -111,7 +103,7 @@
#endif /* FT_CONFIG_OPTION_INCREMENTAL */ #endif /* FT_CONFIG_OPTION_INCREMENTAL */
{ {
CFF_Font cff = (CFF_Font)( face->extra.data ); CFF_Font cff = (CFF_Font)(face->extra.data);
cff_index_forget_element( &cff->charstrings_index, pointer ); cff_index_forget_element( &cff->charstrings_index, pointer );
@ -263,8 +255,8 @@
if ( size->strike_index != 0xFFFFFFFFUL && if ( size->strike_index != 0xFFFFFFFFUL &&
( load_flags & FT_LOAD_NO_BITMAP ) == 0 && sfnt->load_eblc &&
IS_DEFAULT_INSTANCE( size->root.face ) ) ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
{ {
TT_SBit_MetricsRec metrics; TT_SBit_MetricsRec metrics;
@ -370,8 +362,8 @@
SFNT_Service sfnt; SFNT_Service sfnt;
if ( size && (size->root.metrics.x_ppem < 1 || if ( size->root.metrics.x_ppem < 1 ||
size->root.metrics.y_ppem < 1 ) ) size->root.metrics.y_ppem < 1 )
{ {
error = FT_THROW( Invalid_Size_Handle ); error = FT_THROW( Invalid_Size_Handle );
return error; return error;

View File

@ -411,7 +411,9 @@
FT_String* result; FT_String* result;
FT_MEM_STRDUP( result, source ); (void)FT_STRDUP( result, source );
FT_UNUSED( error );
return result; return result;
} }

View File

@ -1033,7 +1033,7 @@
GXV_NAME_ENTER( "StateArray" ); GXV_NAME_ENTER( "StateArray" );
GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n", GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n",
(int)( *length_p ), stateSize, (int)maxClassID )); (int)(*length_p), stateSize, (int)(maxClassID) ));
/* /*
* 2 states are predefined and must be described in StateArray: * 2 states are predefined and must be described in StateArray:
@ -1418,7 +1418,7 @@
GXV_NAME_ENTER( "XStateArray" ); GXV_NAME_ENTER( "XStateArray" );
GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n", GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n",
(int)( *length_p ), (int)stateSize, (int)maxClassID )); (int)(*length_p), (int)stateSize, (int)(maxClassID) ));
/* /*
* 2 states are predefined and must be described: * 2 states are predefined and must be described:

View File

@ -1,7 +1,7 @@
Name: zlib Name: zlib
Short Name: zlib Short Name: zlib
URL: http://zlib.net/ URL: http://zlib.net/
Version: 1.2.12 Version: 1.2.11
License: see `zlib.h` License: see `zlib.h`
Description: Description:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* gzguts.h -- zlib internal header definitions for gz* operations /* gzguts.h -- zlib internal header definitions for gz* operations
* Copyright (C) 2004-2019 Mark Adler * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -39,7 +39,7 @@
# include <io.h> # include <io.h>
#endif #endif
#if defined(_WIN32) #if defined(_WIN32) || defined(__CYGWIN__)
# define WIDECHAR # define WIDECHAR
#endif #endif
@ -190,7 +190,6 @@ typedef struct {
/* just for writing */ /* just for writing */
int level; /* compression level */ int level; /* compression level */
int strategy; /* compression strategy */ int strategy; /* compression strategy */
int reset; /* true if a reset is pending after a Z_FINISH */
/* seek request */ /* seek request */
z_off64_t skip; /* amount to skip (already rewound if backwards) */ z_off64_t skip; /* amount to skip (already rewound if backwards) */
int seek; /* true if seek request pending */ int seek; /* true if seek request pending */

View File

@ -1,5 +1,5 @@
/* infback.c -- inflate using a call-back interface /* infback.c -- inflate using a call-back interface
* Copyright (C) 1995-2022 Mark Adler * Copyright (C) 1995-2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -477,7 +477,6 @@ int ZEXPORT inflateBack(
} }
Tracev((stderr, "inflate: codes ok\n")); Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN; state->mode = LEN;
/* fallthrough */
case LEN: case LEN:
/* use inflate_fast() if we have enough input and output */ /* use inflate_fast() if we have enough input and output */

View File

@ -70,7 +70,7 @@ void ZLIB_INTERNAL inflate_fast(
code const FAR *dcode; /* local strm->distcode */ code const FAR *dcode; /* local strm->distcode */
unsigned lmask; /* mask for first level of length codes */ unsigned lmask; /* mask for first level of length codes */
unsigned dmask; /* mask for first level of distance codes */ unsigned dmask; /* mask for first level of distance codes */
code const *here; /* retrieved table entry */ code here; /* retrieved table entry */
unsigned op; /* code bits, operation, extra bits, or */ unsigned op; /* code bits, operation, extra bits, or */
/* window position, window bytes to copy */ /* window position, window bytes to copy */
unsigned len; /* match length, unused bytes */ unsigned len; /* match length, unused bytes */
@ -107,20 +107,20 @@ void ZLIB_INTERNAL inflate_fast(
hold += (unsigned long)(*in++) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
here = lcode + (hold & lmask); here = lcode[hold & lmask];
dolen: dolen:
op = (unsigned)(here->bits); op = (unsigned)(here.bits);
hold >>= op; hold >>= op;
bits -= op; bits -= op;
op = (unsigned)(here->op); op = (unsigned)(here.op);
if (op == 0) { /* literal */ if (op == 0) { /* literal */
Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
"inflate: literal '%c'\n" : "inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", here->val)); "inflate: literal 0x%02x\n", here.val));
*out++ = (unsigned char)(here->val); *out++ = (unsigned char)(here.val);
} }
else if (op & 16) { /* length base */ else if (op & 16) { /* length base */
len = (unsigned)(here->val); len = (unsigned)(here.val);
op &= 15; /* number of extra bits */ op &= 15; /* number of extra bits */
if (op) { if (op) {
if (bits < op) { if (bits < op) {
@ -138,14 +138,14 @@ void ZLIB_INTERNAL inflate_fast(
hold += (unsigned long)(*in++) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
here = dcode + (hold & dmask); here = dcode[hold & dmask];
dodist: dodist:
op = (unsigned)(here->bits); op = (unsigned)(here.bits);
hold >>= op; hold >>= op;
bits -= op; bits -= op;
op = (unsigned)(here->op); op = (unsigned)(here.op);
if (op & 16) { /* distance base */ if (op & 16) { /* distance base */
dist = (unsigned)(here->val); dist = (unsigned)(here.val);
op &= 15; /* number of extra bits */ op &= 15; /* number of extra bits */
if (bits < op) { if (bits < op) {
hold += (unsigned long)(*in++) << bits; hold += (unsigned long)(*in++) << bits;
@ -264,7 +264,7 @@ void ZLIB_INTERNAL inflate_fast(
} }
} }
else if ((op & 64) == 0) { /* 2nd level distance code */ else if ((op & 64) == 0) { /* 2nd level distance code */
here = dcode + here->val + (hold & ((1U << op) - 1)); here = dcode[here.val + (hold & ((1U << op) - 1))];
goto dodist; goto dodist;
} }
else { else {
@ -274,7 +274,7 @@ void ZLIB_INTERNAL inflate_fast(
} }
} }
else if ((op & 64) == 0) { /* 2nd level length code */ else if ((op & 64) == 0) { /* 2nd level length code */
here = lcode + here->val + (hold & ((1U << op) - 1)); here = lcode[here.val + (hold & ((1U << op) - 1))];
goto dolen; goto dolen;
} }
else if (op & 32) { /* end-of-block */ else if (op & 32) { /* end-of-block */

View File

@ -1,5 +1,5 @@
/* inflate.c -- zlib decompression /* inflate.c -- zlib decompression
* Copyright (C) 1995-2022 Mark Adler * Copyright (C) 1995-2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -132,7 +132,6 @@ int ZEXPORT inflateResetKeep(
state->mode = HEAD; state->mode = HEAD;
state->last = 0; state->last = 0;
state->havedict = 0; state->havedict = 0;
state->flags = -1;
state->dmax = 32768U; state->dmax = 32768U;
state->head = Z_NULL; state->head = Z_NULL;
state->hold = 0; state->hold = 0;
@ -270,7 +269,7 @@ int ZEXPORT inflatePrime(
return Z_OK; return Z_OK;
} }
#endif /* !Z_FREETYPE */ #endif /* Z_FREETYPE */
/* /*
Return state with length and distance decoding tables and index sizes set to Return state with length and distance decoding tables and index sizes set to
@ -454,10 +453,10 @@ local int updatewindow(
/* check function to use adler32() for zlib or crc32() for gzip */ /* check function to use adler32() for zlib or crc32() for gzip */
#ifdef GUNZIP #ifdef GUNZIP
# define UPDATE_CHECK(check, buf, len) \ # define UPDATE(check, buf, len) \
(state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
#else #else
# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) # define UPDATE(check, buf, len) adler32(check, buf, len)
#endif #endif
/* check macros for header crc */ /* check macros for header crc */
@ -677,6 +676,7 @@ int ZEXPORT inflate(
state->mode = FLAGS; state->mode = FLAGS;
break; break;
} }
state->flags = 0; /* expect zlib header */
if (state->head != Z_NULL) if (state->head != Z_NULL)
state->head->done = -1; state->head->done = -1;
if (!(state->wrap & 1) || /* check if zlib header allowed */ if (!(state->wrap & 1) || /* check if zlib header allowed */
@ -703,7 +703,6 @@ int ZEXPORT inflate(
break; break;
} }
state->dmax = 1U << len; state->dmax = 1U << len;
state->flags = 0; /* indicate zlib header */
Tracev((stderr, "inflate: zlib header ok\n")); Tracev((stderr, "inflate: zlib header ok\n"));
strm->adler = state->check = adler32(0L, Z_NULL, 0); strm->adler = state->check = adler32(0L, Z_NULL, 0);
state->mode = hold & 0x200 ? DICTID : TYPE; state->mode = hold & 0x200 ? DICTID : TYPE;
@ -729,7 +728,6 @@ int ZEXPORT inflate(
CRC2(state->check, hold); CRC2(state->check, hold);
INITBITS(); INITBITS();
state->mode = TIME; state->mode = TIME;
/* fallthrough */
case TIME: case TIME:
NEEDBITS(32); NEEDBITS(32);
if (state->head != Z_NULL) if (state->head != Z_NULL)
@ -738,7 +736,6 @@ int ZEXPORT inflate(
CRC4(state->check, hold); CRC4(state->check, hold);
INITBITS(); INITBITS();
state->mode = OS; state->mode = OS;
/* fallthrough */
case OS: case OS:
NEEDBITS(16); NEEDBITS(16);
if (state->head != Z_NULL) { if (state->head != Z_NULL) {
@ -749,7 +746,6 @@ int ZEXPORT inflate(
CRC2(state->check, hold); CRC2(state->check, hold);
INITBITS(); INITBITS();
state->mode = EXLEN; state->mode = EXLEN;
/* fallthrough */
case EXLEN: case EXLEN:
if (state->flags & 0x0400) { if (state->flags & 0x0400) {
NEEDBITS(16); NEEDBITS(16);
@ -763,7 +759,6 @@ int ZEXPORT inflate(
else if (state->head != Z_NULL) else if (state->head != Z_NULL)
state->head->extra = Z_NULL; state->head->extra = Z_NULL;
state->mode = EXTRA; state->mode = EXTRA;
/* fallthrough */
case EXTRA: case EXTRA:
if (state->flags & 0x0400) { if (state->flags & 0x0400) {
copy = state->length; copy = state->length;
@ -786,7 +781,6 @@ int ZEXPORT inflate(
} }
state->length = 0; state->length = 0;
state->mode = NAME; state->mode = NAME;
/* fallthrough */
case NAME: case NAME:
if (state->flags & 0x0800) { if (state->flags & 0x0800) {
if (have == 0) goto inf_leave; if (have == 0) goto inf_leave;
@ -808,7 +802,6 @@ int ZEXPORT inflate(
state->head->name = Z_NULL; state->head->name = Z_NULL;
state->length = 0; state->length = 0;
state->mode = COMMENT; state->mode = COMMENT;
/* fallthrough */
case COMMENT: case COMMENT:
if (state->flags & 0x1000) { if (state->flags & 0x1000) {
if (have == 0) goto inf_leave; if (have == 0) goto inf_leave;
@ -829,7 +822,6 @@ int ZEXPORT inflate(
else if (state->head != Z_NULL) else if (state->head != Z_NULL)
state->head->comment = Z_NULL; state->head->comment = Z_NULL;
state->mode = HCRC; state->mode = HCRC;
/* fallthrough */
case HCRC: case HCRC:
if (state->flags & 0x0200) { if (state->flags & 0x0200) {
NEEDBITS(16); NEEDBITS(16);
@ -853,7 +845,6 @@ int ZEXPORT inflate(
strm->adler = state->check = ZSWAP32(hold); strm->adler = state->check = ZSWAP32(hold);
INITBITS(); INITBITS();
state->mode = DICT; state->mode = DICT;
/* fallthrough */
case DICT: case DICT:
if (state->havedict == 0) { if (state->havedict == 0) {
RESTORE(); RESTORE();
@ -861,10 +852,8 @@ int ZEXPORT inflate(
} }
strm->adler = state->check = adler32(0L, Z_NULL, 0); strm->adler = state->check = adler32(0L, Z_NULL, 0);
state->mode = TYPE; state->mode = TYPE;
/* fallthrough */
case TYPE: case TYPE:
if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
/* fallthrough */
case TYPEDO: case TYPEDO:
if (state->last) { if (state->last) {
BYTEBITS(); BYTEBITS();
@ -915,10 +904,8 @@ int ZEXPORT inflate(
INITBITS(); INITBITS();
state->mode = COPY_; state->mode = COPY_;
if (flush == Z_TREES) goto inf_leave; if (flush == Z_TREES) goto inf_leave;
/* fallthrough */
case COPY_: case COPY_:
state->mode = COPY; state->mode = COPY;
/* fallthrough */
case COPY: case COPY:
copy = state->length; copy = state->length;
if (copy) { if (copy) {
@ -954,7 +941,6 @@ int ZEXPORT inflate(
Tracev((stderr, "inflate: table sizes ok\n")); Tracev((stderr, "inflate: table sizes ok\n"));
state->have = 0; state->have = 0;
state->mode = LENLENS; state->mode = LENLENS;
/* fallthrough */
case LENLENS: case LENLENS:
while (state->have < state->ncode) { while (state->have < state->ncode) {
NEEDBITS(3); NEEDBITS(3);
@ -976,7 +962,6 @@ int ZEXPORT inflate(
Tracev((stderr, "inflate: code lengths ok\n")); Tracev((stderr, "inflate: code lengths ok\n"));
state->have = 0; state->have = 0;
state->mode = CODELENS; state->mode = CODELENS;
/* fallthrough */
case CODELENS: case CODELENS:
while (state->have < state->nlen + state->ndist) { while (state->have < state->nlen + state->ndist) {
for (;;) { for (;;) {
@ -1060,10 +1045,8 @@ int ZEXPORT inflate(
Tracev((stderr, "inflate: codes ok\n")); Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN_; state->mode = LEN_;
if (flush == Z_TREES) goto inf_leave; if (flush == Z_TREES) goto inf_leave;
/* fallthrough */
case LEN_: case LEN_:
state->mode = LEN; state->mode = LEN;
/* fallthrough */
case LEN: case LEN:
if (have >= 6 && left >= 258) { if (have >= 6 && left >= 258) {
RESTORE(); RESTORE();
@ -1113,7 +1096,6 @@ int ZEXPORT inflate(
} }
state->extra = (unsigned)(here.op) & 15; state->extra = (unsigned)(here.op) & 15;
state->mode = LENEXT; state->mode = LENEXT;
/* fallthrough */
case LENEXT: case LENEXT:
if (state->extra) { if (state->extra) {
NEEDBITS(state->extra); NEEDBITS(state->extra);
@ -1124,7 +1106,6 @@ int ZEXPORT inflate(
Tracevv((stderr, "inflate: length %u\n", state->length)); Tracevv((stderr, "inflate: length %u\n", state->length));
state->was = state->length; state->was = state->length;
state->mode = DIST; state->mode = DIST;
/* fallthrough */
case DIST: case DIST:
for (;;) { for (;;) {
here = state->distcode[BITS(state->distbits)]; here = state->distcode[BITS(state->distbits)];
@ -1152,7 +1133,6 @@ int ZEXPORT inflate(
state->offset = (unsigned)here.val; state->offset = (unsigned)here.val;
state->extra = (unsigned)(here.op) & 15; state->extra = (unsigned)(here.op) & 15;
state->mode = DISTEXT; state->mode = DISTEXT;
/* fallthrough */
case DISTEXT: case DISTEXT:
if (state->extra) { if (state->extra) {
NEEDBITS(state->extra); NEEDBITS(state->extra);
@ -1169,7 +1149,6 @@ int ZEXPORT inflate(
#endif #endif
Tracevv((stderr, "inflate: distance %u\n", state->offset)); Tracevv((stderr, "inflate: distance %u\n", state->offset));
state->mode = MATCH; state->mode = MATCH;
/* fallthrough */
case MATCH: case MATCH:
if (left == 0) goto inf_leave; if (left == 0) goto inf_leave;
copy = out - left; copy = out - left;
@ -1229,7 +1208,7 @@ int ZEXPORT inflate(
state->total += out; state->total += out;
if ((state->wrap & 4) && out) if ((state->wrap & 4) && out)
strm->adler = state->check = strm->adler = state->check =
UPDATE_CHECK(state->check, put - out, out); UPDATE(state->check, put - out, out);
out = left; out = left;
if ((state->wrap & 4) && ( if ((state->wrap & 4) && (
#ifdef GUNZIP #ifdef GUNZIP
@ -1245,11 +1224,10 @@ int ZEXPORT inflate(
} }
#ifdef GUNZIP #ifdef GUNZIP
state->mode = LENGTH; state->mode = LENGTH;
/* fallthrough */
case LENGTH: case LENGTH:
if (state->wrap && state->flags) { if (state->wrap && state->flags) {
NEEDBITS(32); NEEDBITS(32);
if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { if (hold != (state->total & 0xffffffffUL)) {
strm->msg = (char *)"incorrect length check"; strm->msg = (char *)"incorrect length check";
state->mode = BAD; state->mode = BAD;
break; break;
@ -1259,7 +1237,6 @@ int ZEXPORT inflate(
} }
#endif #endif
state->mode = DONE; state->mode = DONE;
/* fallthrough */
case DONE: case DONE:
ret = Z_STREAM_END; ret = Z_STREAM_END;
goto inf_leave; goto inf_leave;
@ -1269,7 +1246,6 @@ int ZEXPORT inflate(
case MEM: case MEM:
return Z_MEM_ERROR; return Z_MEM_ERROR;
case SYNC: case SYNC:
/* fallthrough */
default: default:
return Z_STREAM_ERROR; return Z_STREAM_ERROR;
} }
@ -1295,7 +1271,7 @@ int ZEXPORT inflate(
state->total += out; state->total += out;
if ((state->wrap & 4) && out) if ((state->wrap & 4) && out)
strm->adler = state->check = strm->adler = state->check =
UPDATE_CHECK(state->check, strm->next_out - out, out); UPDATE(state->check, strm->next_out - out, out);
strm->data_type = (int)state->bits + (state->last ? 64 : 0) + strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
(state->mode == TYPE ? 128 : 0) + (state->mode == TYPE ? 128 : 0) +
(state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
@ -1433,7 +1409,6 @@ int ZEXPORT inflateSync(
z_streamp strm) z_streamp strm)
{ {
unsigned len; /* number of bytes to look at or looked at */ unsigned len; /* number of bytes to look at or looked at */
int flags; /* temporary to save header status */
unsigned long in, out; /* temporary to save total_in and total_out */ unsigned long in, out; /* temporary to save total_in and total_out */
unsigned char buf[4]; /* to restore bit buffer to byte string */ unsigned char buf[4]; /* to restore bit buffer to byte string */
struct inflate_state FAR *state; struct inflate_state FAR *state;
@ -1466,15 +1441,9 @@ int ZEXPORT inflateSync(
/* return no joy or set up to restart inflate() on a new block */ /* return no joy or set up to restart inflate() on a new block */
if (state->have != 4) return Z_DATA_ERROR; if (state->have != 4) return Z_DATA_ERROR;
if (state->flags == -1)
state->wrap = 0; /* if no header yet, treat as raw */
else
state->wrap &= ~4; /* no point in computing a check value now */
flags = state->flags;
in = strm->total_in; out = strm->total_out; in = strm->total_in; out = strm->total_out;
inflateReset(strm); inflateReset(strm);
strm->total_in = in; strm->total_out = out; strm->total_in = in; strm->total_out = out;
state->flags = flags;
state->mode = TYPE; state->mode = TYPE;
return Z_OK; return Z_OK;
} }
@ -1499,7 +1468,7 @@ int ZEXPORT inflateSyncPoint(
return state->mode == STORED && state->bits == 0; return state->mode == STORED && state->bits == 0;
} }
#ifndef Z_FREETYPE #if !Z_FREETYPE
int ZEXPORT inflateCopy( int ZEXPORT inflateCopy(
z_streamp dest, z_streamp dest,
@ -1576,7 +1545,7 @@ int ZEXPORT inflateValidate(
if (inflateStateCheck(strm)) return Z_STREAM_ERROR; if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
state = (struct inflate_state FAR *)strm->state; state = (struct inflate_state FAR *)strm->state;
if (check && state->wrap) if (check)
state->wrap |= 4; state->wrap |= 4;
else else
state->wrap &= ~4; state->wrap &= ~4;

View File

@ -1,5 +1,5 @@
/* inflate.h -- internal inflate state definition /* inflate.h -- internal inflate state definition
* Copyright (C) 1995-2019 Mark Adler * Copyright (C) 1995-2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -89,8 +89,7 @@ struct inflate_state {
int wrap; /* bit 0 true for zlib, bit 1 true for gzip, int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
bit 2 true to validate check value */ bit 2 true to validate check value */
int havedict; /* true if dictionary provided */ int havedict; /* true if dictionary provided */
int flags; /* gzip header method and flags, 0 if zlib, or int flags; /* gzip header method and flags (0 if zlib) */
-1 if raw or no header yet */
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
unsigned long check; /* protected copy of check value */ unsigned long check; /* protected copy of check value */
unsigned long total; /* protected copy of output count */ unsigned long total; /* protected copy of output count */

View File

@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding /* inftrees.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-2022 Mark Adler * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -9,7 +9,7 @@
#define MAXBITS 15 #define MAXBITS 15
const char inflate_copyright[] = const char inflate_copyright[] =
" inflate 1.2.12 Copyright 1995-2022 Mark Adler "; " inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
/* /*
If you use the zlib library in a product, an acknowledgment is welcome If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot in the documentation of your product. If for some reason you cannot
@ -62,7 +62,7 @@ int ZLIB_INTERNAL inflate_table(
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 202}; 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,

View File

@ -6,6 +6,8 @@ are compiled as part of `src/gzip/ftgzip.c`.
* src/gzip/adler32.c: Do not define unused functions when `Z_FREETYPE` * src/gzip/adler32.c: Do not define unused functions when `Z_FREETYPE`
is set. is set.
* src/gzip/crc32.c (DO1, DO8): Undefine. Already defined in `adler32.c`.
* src/gzip/gzguts.h (COPY): Rename to... * src/gzip/gzguts.h (COPY): Rename to...
(COPY__): ... this since `COPY` and `COPY_` conflict with enum values, (COPY__): ... this since `COPY` and `COPY_` conflict with enum values,
which have the same name in `zlib.h`. which have the same name in `zlib.h`.
@ -23,10 +25,10 @@ Omit unused function declarations when `Z_FREETYPE` is defined.
* src/gzip/inflate.h, src/gzip/inftrees.h: Add header guard macros to * src/gzip/inflate.h, src/gzip/inftrees.h: Add header guard macros to
prevent compiler errors. prevent compiler errors.
diff --git a/src/gzip/adler32.c b/src/gzip/adler32.c diff --git b/src/gzip/adler32.c a/src/gzip/adler32.c
index be5e8a247..aa032e1dd 100644 index be5e8a247..aa032e1dd 100644
--- a/src/gzip/adler32.c --- b/src/gzip/adler32.c
+++ b/src/gzip/adler32.c +++ a/src/gzip/adler32.c
@@ -7,7 +7,9 @@ @@ -7,7 +7,9 @@
#include "zutil.h" #include "zutil.h"
@ -52,10 +54,23 @@ index be5e8a247..aa032e1dd 100644
} }
+ +
+#endif /* !Z_FREETYPE */ +#endif /* !Z_FREETYPE */
diff --git a/src/gzip/gzguts.h b/src/gzip/gzguts.h diff --git b/src/gzip/crc32.c a/src/gzip/crc32.c
index 57faf3716..4f09a52a7 100644 index 3e3eb1794..ffced1ea7 100644
--- a/src/gzip/gzguts.h --- b/src/gzip/crc32.c
+++ b/src/gzip/gzguts.h +++ a/src/gzip/crc32.c
@@ -195,6 +195,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table()
}
/* ========================================================================= */
+#undef DO1
+#undef DO8
#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
diff --git b/src/gzip/gzguts.h a/src/gzip/gzguts.h
index 990a4d251..c81f8f392 100644
--- b/src/gzip/gzguts.h
+++ a/src/gzip/gzguts.h
@@ -163,7 +163,7 @@ @@ -163,7 +163,7 @@
/* values for gz_state how */ /* values for gz_state how */
@ -65,10 +80,10 @@ index 57faf3716..4f09a52a7 100644
#define GZIP 2 /* decompress a gzip stream */ #define GZIP 2 /* decompress a gzip stream */
/* internal gzip file state data structure */ /* internal gzip file state data structure */
diff --git a/src/gzip/inflate.c b/src/gzip/inflate.c diff --git b/src/gzip/inflate.c a/src/gzip/inflate.c
index 4375557b4..5bf5b815e 100644 index 3f7ea647b..7387e6f57 100644
--- a/src/gzip/inflate.c --- b/src/gzip/inflate.c
+++ b/src/gzip/inflate.c +++ a/src/gzip/inflate.c
@@ -99,8 +99,10 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, @@ -99,8 +99,10 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
#ifdef BUILDFIXED #ifdef BUILDFIXED
void makefixed OF((void)); void makefixed OF((void));
@ -80,7 +95,7 @@ index 4375557b4..5bf5b815e 100644
local int inflateStateCheck( local int inflateStateCheck(
z_streamp strm) z_streamp strm)
@@ -245,6 +247,8 @@ int ZEXPORT inflateInit_( @@ -244,6 +246,8 @@ int ZEXPORT inflateInit_(
return inflateInit2_(strm, DEF_WBITS, version, stream_size); return inflateInit2_(strm, DEF_WBITS, version, stream_size);
} }
@ -89,16 +104,16 @@ index 4375557b4..5bf5b815e 100644
int ZEXPORT inflatePrime( int ZEXPORT inflatePrime(
z_streamp strm, z_streamp strm,
int bits, int bits,
@@ -266,6 +270,8 @@ int ZEXPORT inflatePrime( @@ -265,6 +269,8 @@ int ZEXPORT inflatePrime(
return Z_OK; return Z_OK;
} }
+#endif /* !Z_FREETYPE */ +#endif /* Z_FREETYPE */
+ +
/* /*
Return state with length and distance decoding tables and index sizes set to Return state with length and distance decoding tables and index sizes set to
fixed code decoding. Normally this returns fixed tables from inffixed.h. fixed code decoding. Normally this returns fixed tables from inffixed.h.
@@ -1312,6 +1318,8 @@ int ZEXPORT inflateEnd( @@ -1288,6 +1294,8 @@ int ZEXPORT inflateEnd(
return Z_OK; return Z_OK;
} }
@ -107,7 +122,7 @@ index 4375557b4..5bf5b815e 100644
int ZEXPORT inflateGetDictionary( int ZEXPORT inflateGetDictionary(
z_streamp strm, z_streamp strm,
Bytef *dictionary, Bytef *dictionary,
@@ -1471,6 +1479,8 @@ int ZEXPORT inflateSync( @@ -1440,6 +1448,8 @@ int ZEXPORT inflateSync(
return Z_OK; return Z_OK;
} }
@ -116,16 +131,16 @@ index 4375557b4..5bf5b815e 100644
/* /*
Returns true if inflate is currently at the end of a block generated by Returns true if inflate is currently at the end of a block generated by
Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
@@ -1489,6 +1499,8 @@ int ZEXPORT inflateSyncPoint( @@ -1458,6 +1468,8 @@ int ZEXPORT inflateSyncPoint(
return state->mode == STORED && state->bits == 0; return state->mode == STORED && state->bits == 0;
} }
+#ifndef Z_FREETYPE +#if !Z_FREETYPE
+ +
int ZEXPORT inflateCopy( int ZEXPORT inflateCopy(
z_streamp dest, z_streamp dest,
z_streamp source) z_streamp source)
@@ -1536,6 +1548,8 @@ int ZEXPORT inflateCopy( @@ -1505,6 +1517,8 @@ int ZEXPORT inflateCopy(
return Z_OK; return Z_OK;
} }
@ -134,7 +149,7 @@ index 4375557b4..5bf5b815e 100644
int ZEXPORT inflateUndermine( int ZEXPORT inflateUndermine(
z_streamp strm, z_streamp strm,
int subvert) int subvert)
@@ -1569,6 +1583,8 @@ int ZEXPORT inflateValidate( @@ -1538,6 +1552,8 @@ int ZEXPORT inflateValidate(
return Z_OK; return Z_OK;
} }
@ -143,16 +158,16 @@ index 4375557b4..5bf5b815e 100644
long ZEXPORT inflateMark( long ZEXPORT inflateMark(
z_streamp strm) z_streamp strm)
{ {
@@ -1590,3 +1606,5 @@ unsigned long ZEXPORT inflateCodesUsed( @@ -1559,3 +1575,5 @@ unsigned long ZEXPORT inflateCodesUsed(
state = (struct inflate_state FAR *)strm->state; state = (struct inflate_state FAR *)strm->state;
return (unsigned long)(state->next - state->codes); return (unsigned long)(state->next - state->codes);
} }
+ +
+#endif /* !Z_FREETYPE */ +#endif /* !Z_FREETYPE */
diff --git a/src/gzip/inflate.h b/src/gzip/inflate.h diff --git b/src/gzip/inflate.h a/src/gzip/inflate.h
index f127b6b1f..c6f5a52e1 100644 index a46cce6b6..92ea758e2 100644
--- a/src/gzip/inflate.h --- b/src/gzip/inflate.h
+++ b/src/gzip/inflate.h +++ a/src/gzip/inflate.h
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -163,16 +178,16 @@ index f127b6b1f..c6f5a52e1 100644
/* WARNING: this file should *not* be used by applications. It is /* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h. subject to change. Applications should only use zlib.h.
@@ -124,3 +127,5 @@ struct inflate_state { @@ -123,3 +126,5 @@ struct inflate_state {
int back; /* bits back of last unprocessed length/lit */ int back; /* bits back of last unprocessed length/lit */
unsigned was; /* initial length of match */ unsigned was; /* initial length of match */
}; };
+ +
+#endif /* INFLATE_H */ +#endif /* INFLATE_H */
diff --git a/src/gzip/inftrees.h b/src/gzip/inftrees.h diff --git b/src/gzip/inftrees.h a/src/gzip/inftrees.h
index baa53a0b1..c94eb78b5 100644 index baa53a0b1..c94eb78b5 100644
--- a/src/gzip/inftrees.h --- b/src/gzip/inftrees.h
+++ b/src/gzip/inftrees.h +++ a/src/gzip/inftrees.h
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -189,10 +204,10 @@ index baa53a0b1..c94eb78b5 100644
unsigned FAR *bits, unsigned short FAR *work)); unsigned FAR *bits, unsigned short FAR *work));
+ +
+#endif /* INFTREES_H_ */ +#endif /* INFTREES_H_ */
diff --git a/src/gzip/zlib.h b/src/gzip/zlib.h diff --git b/src/gzip/zlib.h a/src/gzip/zlib.h
index 4a98e38bf..d760140c2 100644 index f09cdaf1e..1807c0645 100644
--- a/src/gzip/zlib.h --- b/src/gzip/zlib.h
+++ b/src/gzip/zlib.h +++ a/src/gzip/zlib.h
@@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
#ifndef ZLIB_H #ifndef ZLIB_H
#define ZLIB_H #define ZLIB_H
@ -236,7 +251,7 @@ index 4a98e38bf..d760140c2 100644
/* /*
ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
int level, int level,
@@ -956,6 +960,8 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -954,6 +958,8 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
destination. destination.
*/ */
@ -245,7 +260,7 @@ index 4a98e38bf..d760140c2 100644
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
/* /*
This function is equivalent to inflateEnd followed by inflateInit, This function is equivalent to inflateEnd followed by inflateInit,
@@ -980,6 +986,8 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, @@ -978,6 +984,8 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
the windowBits parameter is invalid. the windowBits parameter is invalid.
*/ */
@ -254,7 +269,7 @@ index 4a98e38bf..d760140c2 100644
ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
int bits, int bits,
int value)); int value));
@@ -1069,6 +1077,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, @@ -1067,6 +1075,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
stream state was inconsistent. stream state was inconsistent.
*/ */
@ -263,7 +278,7 @@ index 4a98e38bf..d760140c2 100644
/* /*
ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
unsigned char FAR *window)); unsigned char FAR *window));
@@ -1095,6 +1105,8 @@ typedef unsigned (*in_func) OF((void FAR *, @@ -1093,6 +1103,8 @@ typedef unsigned (*in_func) OF((void FAR *,
z_const unsigned char FAR * FAR *)); z_const unsigned char FAR * FAR *));
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
@ -272,7 +287,7 @@ index 4a98e38bf..d760140c2 100644
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
in_func in, void FAR *in_desc, in_func in, void FAR *in_desc,
out_func out, void FAR *out_desc)); out_func out, void FAR *out_desc));
@@ -1214,6 +1226,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); @@ -1212,6 +1224,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
27-31: 0 (reserved) 27-31: 0 (reserved)
*/ */
@ -281,16 +296,16 @@ index 4a98e38bf..d760140c2 100644
#ifndef Z_SOLO #ifndef Z_SOLO
/* utility functions */ /* utility functions */
@@ -1742,6 +1756,8 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); @@ -1739,6 +1753,8 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
if (crc != original_crc) error(); if (crc != original_crc) error();
*/ */
+#ifndef Z_FREETYPE +#ifndef Z_FREETYPE
+ +
ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
z_size_t len)); z_size_t len));
/* /*
@@ -1822,6 +1838,19 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, @@ -1805,6 +1821,19 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
ZLIB_VERSION, (int)sizeof(z_stream)) ZLIB_VERSION, (int)sizeof(z_stream))
#endif #endif
@ -310,14 +325,13 @@ index 4a98e38bf..d760140c2 100644
#ifndef Z_SOLO #ifndef Z_SOLO
/* gzgetc() macro and its supporting function and exposed data structure. Note /* gzgetc() macro and its supporting function and exposed data structure. Note
@@ -1901,13 +1930,16 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ @@ -1879,12 +1908,15 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
#else /* Z_SOLO */ #else /* Z_SOLO */
+#ifndef Z_FREETYPE +#ifndef Z_FREETYPE
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
+#endif +#endif
#endif /* !Z_SOLO */ #endif /* !Z_SOLO */
@ -327,7 +341,7 @@ index 4a98e38bf..d760140c2 100644
ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN const char * ZEXPORT zError OF((int));
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
@@ -1927,6 +1959,7 @@ ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, @@ -1904,6 +1936,7 @@ ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
va_list va)); va_list va));
# endif # endif
#endif #endif
@ -335,11 +349,21 @@ index 4a98e38bf..d760140c2 100644
#ifdef __cplusplus #ifdef __cplusplus
} }
diff --git a/src/gzip/zutil.h b/src/gzip/zutil.h diff --git b/src/gzip/zutil.h a/src/gzip/zutil.h
index d9a20ae1b..14f0f1a85 100644 index b079ea6a8..2d734a835 100644
--- a/src/gzip/zutil.h --- b/src/gzip/zutil.h
+++ b/src/gzip/zutil.h +++ a/src/gzip/zutil.h
@@ -188,6 +188,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ @@ -30,7 +30,9 @@
#endif
#ifdef Z_SOLO
+# ifndef Z_FREETYPE
typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
+# endif
#endif
#ifndef local
@@ -185,6 +187,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#pragma warn -8066 #pragma warn -8066
#endif #endif
@ -348,7 +372,7 @@ index d9a20ae1b..14f0f1a85 100644
/* provide prototypes for these when building zlib without LFS */ /* provide prototypes for these when building zlib without LFS */
#if !defined(_WIN32) && \ #if !defined(_WIN32) && \
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
@@ -195,6 +197,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ @@ -192,6 +196,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
#endif #endif
@ -357,7 +381,7 @@ index d9a20ae1b..14f0f1a85 100644
/* common defaults */ /* common defaults */
#ifndef OS_CODE #ifndef OS_CODE
@@ -226,9 +230,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ @@ -223,9 +229,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define zmemcmp _fmemcmp # define zmemcmp _fmemcmp
# define zmemzero(dest, len) _fmemset(dest, 0, len) # define zmemzero(dest, len) _fmemset(dest, 0, len)
# else # else

View File

@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library /* zlib.h -- interface of the 'zlib' general purpose compression library
version 1.2.12, March 11th, 2022 version 1.2.11, January 15th, 2017
Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -37,11 +37,11 @@
extern "C" { extern "C" {
#endif #endif
#define ZLIB_VERSION "1.2.12" #define ZLIB_VERSION "1.2.11"
#define ZLIB_VERNUM 0x12c0 #define ZLIB_VERNUM 0x12b0
#define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 2 #define ZLIB_VER_MINOR 2
#define ZLIB_VER_REVISION 12 #define ZLIB_VER_REVISION 11
#define ZLIB_VER_SUBREVISION 0 #define ZLIB_VER_SUBREVISION 0
/* /*
@ -547,7 +547,8 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
int strategy)); int strategy));
This is another version of deflateInit with more compression options. The This is another version of deflateInit with more compression options. The
fields zalloc, zfree and opaque must be initialized before by the caller. fields next_in, zalloc, zfree and opaque must be initialized before by the
caller.
The method parameter is the compression method. It must be Z_DEFLATED in The method parameter is the compression method. It must be Z_DEFLATED in
this version of the library. this version of the library.
@ -715,12 +716,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
used to switch between compression and straight copy of the input data, or used to switch between compression and straight copy of the input data, or
to switch to a different kind of input data requiring a different strategy. to switch to a different kind of input data requiring a different strategy.
If the compression approach (which is a function of the level) or the If the compression approach (which is a function of the level) or the
strategy is changed, and if there have been any deflate() calls since the strategy is changed, and if any input has been consumed in a previous
state was initialized or reset, then the input available so far is deflate() call, then the input available so far is compressed with the old
compressed with the old level and strategy using deflate(strm, Z_BLOCK). level and strategy using deflate(strm, Z_BLOCK). There are three approaches
There are three approaches for the compression levels 0, 1..3, and 4..9 for the compression levels 0, 1..3, and 4..9 respectively. The new level
respectively. The new level and strategy will take effect at the next call and strategy will take effect at the next call of deflate().
of deflate().
If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
not have enough output space to complete, then the parameter change will not not have enough output space to complete, then the parameter change will not
@ -869,11 +869,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
detection, or add 16 to decode only the gzip format (the zlib format will detection, or add 16 to decode only the gzip format (the zlib format will
return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
below), inflate() will *not* automatically decode concatenated gzip members. below), inflate() will not automatically decode concatenated gzip streams.
inflate() will return Z_STREAM_END at the end of the gzip member. The state inflate() will return Z_STREAM_END at the end of the gzip stream. The state
would need to be reset to continue decoding a subsequent gzip member. This would need to be reset to continue decoding a subsequent gzip stream.
*must* be done if there is more data after a gzip member, in order for the
decompression to be compliant with the gzip standard (RFC 1952).
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
@ -1318,14 +1316,14 @@ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
/* /*
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
Open the gzip (.gz) file at path for reading and decompressing, or Opens a gzip (.gz) file for reading or writing. The mode parameter is as
compressing and writing. The mode parameter is as in fopen ("rb" or "wb") in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
but can also include a compression level ("wb9") or a strategy: 'f' for a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression for fixed code compression as in "wb9F". (See the description of
as in "wb9F". (See the description of deflateInit2 for more information deflateInit2 for more information about the strategy parameter.) 'T' will
about the strategy parameter.) 'T' will request transparent writing or request transparent writing or appending with no compression and not using
appending with no compression and not using the gzip format. the gzip format.
"a" can be used instead of "w" to request that the gzip stream that will "a" can be used instead of "w" to request that the gzip stream that will
be written be appended to the file. "+" will result in an error, since be written be appended to the file. "+" will result in an error, since
@ -1355,9 +1353,9 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
/* /*
Associate a gzFile with the file descriptor fd. File descriptors are gzdopen associates a gzFile with the file descriptor fd. File descriptors
obtained from calls like open, dup, creat, pipe or fileno (if the file has are obtained from calls like open, dup, creat, pipe or fileno (if the file
been previously opened with fopen). The mode parameter is as in gzopen. has been previously opened with fopen). The mode parameter is as in gzopen.
The next call of gzclose on the returned gzFile will also close the file The next call of gzclose on the returned gzFile will also close the file
descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
@ -1378,13 +1376,13 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
/* /*
Set the internal buffer size used by this library's functions for file to Set the internal buffer size used by this library's functions. The
size. The default buffer size is 8192 bytes. This function must be called default buffer size is 8192 bytes. This function must be called after
after gzopen() or gzdopen(), and before any other calls that read or write gzopen() or gzdopen(), and before any other calls that read or write the
the file. The buffer memory allocation is always deferred to the first read file. The buffer memory allocation is always deferred to the first read or
or write. Three times that size in buffer space is allocated. A larger write. Three times that size in buffer space is allocated. A larger buffer
buffer size of, for example, 64K or 128K bytes will noticeably increase the size of, for example, 64K or 128K bytes will noticeably increase the speed
speed of decompression (reading). of decompression (reading).
The new buffer size also affects the maximum length for gzprintf(). The new buffer size also affects the maximum length for gzprintf().
@ -1394,9 +1392,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
/* /*
Dynamically update the compression level and strategy for file. See the Dynamically update the compression level or strategy. See the description
description of deflateInit2 for the meaning of these parameters. Previously of deflateInit2 for the meaning of these parameters. Previously provided
provided data is flushed before applying the parameter changes. data is flushed before the parameter change.
gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not
opened for writing, Z_ERRNO if there is an error writing the flushed data, opened for writing, Z_ERRNO if there is an error writing the flushed data,
@ -1405,7 +1403,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
/* /*
Read and decompress up to len uncompressed bytes from file into buf. If Reads the given number of uncompressed bytes from the compressed file. If
the input file is not in gzip format, gzread copies the given number of the input file is not in gzip format, gzread copies the given number of
bytes into the buffer directly from the file. bytes into the buffer directly from the file.
@ -1436,11 +1434,11 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
gzFile file)); gzFile file));
/* /*
Read and decompress up to nitems items of size size from file into buf, Read up to nitems items of size size from file to buf, otherwise operating
otherwise operating as gzread() does. This duplicates the interface of as gzread() does. This duplicates the interface of stdio's fread(), with
stdio's fread(), with size_t request and return types. If the library size_t request and return types. If the library defines size_t, then
defines size_t, then z_size_t is identical to size_t. If not, then z_size_t z_size_t is identical to size_t. If not, then z_size_t is an unsigned
is an unsigned integer type that can contain a pointer. integer type that can contain a pointer.
gzfread() returns the number of full items read of size size, or zero if gzfread() returns the number of full items read of size size, or zero if
the end of the file was reached and a full item could not be read, or if the end of the file was reached and a full item could not be read, or if
@ -1459,16 +1457,18 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
file, reseting and retrying on end-of-file, when size is not 1. file, reseting and retrying on end-of-file, when size is not 1.
*/ */
ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
voidpc buf, unsigned len));
/* /*
Compress and write the len uncompressed bytes at buf to file. gzwrite Writes the given number of uncompressed bytes into the compressed file.
returns the number of uncompressed bytes written or 0 in case of error. gzwrite returns the number of uncompressed bytes written or 0 in case of
error.
*/ */
ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
z_size_t nitems, gzFile file)); z_size_t nitems, gzFile file));
/* /*
Compress and write nitems items of size size from buf to file, duplicating gzfwrite() writes nitems items of size size from buf to file, duplicating
the interface of stdio's fwrite(), with size_t request and return types. If the interface of stdio's fwrite(), with size_t request and return types. If
the library defines size_t, then z_size_t is identical to size_t. If not, the library defines size_t, then z_size_t is identical to size_t. If not,
then z_size_t is an unsigned integer type that can contain a pointer. then z_size_t is an unsigned integer type that can contain a pointer.
@ -1481,22 +1481,22 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
/* /*
Convert, format, compress, and write the arguments (...) to file under Converts, formats, and writes the arguments to the compressed file under
control of the string format, as in fprintf. gzprintf returns the number of control of the format string, as in fprintf. gzprintf returns the number of
uncompressed bytes actually written, or a negative zlib error code in case uncompressed bytes actually written, or a negative zlib error code in case
of error. The number of uncompressed bytes written is limited to 8191, or of error. The number of uncompressed bytes written is limited to 8191, or
one less than the buffer size given to gzbuffer(). The caller should assure one less than the buffer size given to gzbuffer(). The caller should assure
that this limit is not exceeded. If it is exceeded, then gzprintf() will that this limit is not exceeded. If it is exceeded, then gzprintf() will
return an error (0) with nothing written. In this case, there may also be a return an error (0) with nothing written. In this case, there may also be a
buffer overflow with unpredictable consequences, which is possible only if buffer overflow with unpredictable consequences, which is possible only if
zlib was compiled with the insecure functions sprintf() or vsprintf(), zlib was compiled with the insecure functions sprintf() or vsprintf()
because the secure snprintf() or vsnprintf() functions were not available. because the secure snprintf() or vsnprintf() functions were not available.
This can be determined using zlibCompileFlags(). This can be determined using zlibCompileFlags().
*/ */
ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
/* /*
Compress and write the given null-terminated string s to file, excluding Writes the given null-terminated string to the compressed file, excluding
the terminating null character. the terminating null character.
gzputs returns the number of characters written, or -1 in case of error. gzputs returns the number of characters written, or -1 in case of error.
@ -1504,12 +1504,11 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
/* /*
Read and decompress bytes from file into buf, until len-1 characters are Reads bytes from the compressed file until len-1 characters are read, or a
read, or until a newline character is read and transferred to buf, or an newline character is read and transferred to buf, or an end-of-file
end-of-file condition is encountered. If any characters are read or if len condition is encountered. If any characters are read or if len == 1, the
is one, the string is terminated with a null character. If no characters string is terminated with a null character. If no characters are read due
are read due to an end-of-file or len is less than one, then the buffer is to an end-of-file or len < 1, then the buffer is left untouched.
left untouched.
gzgets returns buf which is a null-terminated string, or it returns NULL gzgets returns buf which is a null-terminated string, or it returns NULL
for end-of-file or in case of error. If there was an error, the contents at for end-of-file or in case of error. If there was an error, the contents at
@ -1518,13 +1517,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
/* /*
Compress and write c, converted to an unsigned char, into file. gzputc Writes c, converted to an unsigned char, into the compressed file. gzputc
returns the value that was written, or -1 in case of error. returns the value that was written, or -1 in case of error.
*/ */
ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
/* /*
Read and decompress one byte from file. gzgetc returns this byte or -1 Reads one byte from the compressed file. gzgetc returns this byte or -1
in case of end of file or error. This is implemented as a macro for speed. in case of end of file or error. This is implemented as a macro for speed.
As such, it does not do all of the checking the other functions do. I.e. As such, it does not do all of the checking the other functions do. I.e.
it does not check to see if file is NULL, nor whether the structure file it does not check to see if file is NULL, nor whether the structure file
@ -1533,8 +1532,8 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
/* /*
Push c back onto the stream for file to be read as the first character on Push one character back onto the stream to be read as the first character
the next read. At least one character of push-back is always allowed. on the next read. At least one character of push-back is allowed.
gzungetc() returns the character pushed, or -1 on failure. gzungetc() will gzungetc() returns the character pushed, or -1 on failure. gzungetc() will
fail if c is -1, and may fail if a character has been pushed but not read fail if c is -1, and may fail if a character has been pushed but not read
yet. If gzungetc is used immediately after gzopen or gzdopen, at least the yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
@ -1545,9 +1544,9 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
/* /*
Flush all pending output to file. The parameter flush is as in the Flushes all pending output into the compressed file. The parameter flush
deflate() function. The return value is the zlib error number (see function is as in the deflate() function. The return value is the zlib error number
gzerror below). gzflush is only permitted when writing. (see function gzerror below). gzflush is only permitted when writing.
If the flush parameter is Z_FINISH, the remaining data is written and the If the flush parameter is Z_FINISH, the remaining data is written and the
gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream is completed in the output. If gzwrite() is called again, a new
@ -1562,8 +1561,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
z_off_t offset, int whence)); z_off_t offset, int whence));
Set the starting position to offset relative to whence for the next gzread Sets the starting position for the next gzread or gzwrite on the given
or gzwrite on file. The offset represents a number of bytes in the compressed file. The offset represents a number of bytes in the
uncompressed data stream. The whence parameter is defined as in lseek(2); uncompressed data stream. The whence parameter is defined as in lseek(2);
the value SEEK_END is not supported. the value SEEK_END is not supported.
@ -1580,18 +1579,18 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
/* /*
Rewind file. This function is supported only for reading. Rewinds the given file. This function is supported only for reading.
gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
*/ */
/* /*
ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
Return the starting position for the next gzread or gzwrite on file. Returns the starting position for the next gzread or gzwrite on the given
This position represents a number of bytes in the uncompressed data stream, compressed file. This position represents a number of bytes in the
and is zero when starting, even if appending or reading a gzip stream from uncompressed data stream, and is zero when starting, even if appending or
the middle of a file using gzdopen(). reading a gzip stream from the middle of a file using gzdopen().
gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
*/ */
@ -1599,22 +1598,22 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
/* /*
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
Return the current compressed (actual) read or write offset of file. This Returns the current offset in the file being read or written. This offset
offset includes the count of bytes that precede the gzip stream, for example includes the count of bytes that precede the gzip stream, for example when
when appending or when using gzdopen() for reading. When reading, the appending or when using gzdopen() for reading. When reading, the offset
offset does not include as yet unused buffered input. This information can does not include as yet unused buffered input. This information can be used
be used for a progress indicator. On error, gzoffset() returns -1. for a progress indicator. On error, gzoffset() returns -1.
*/ */
ZEXTERN int ZEXPORT gzeof OF((gzFile file)); ZEXTERN int ZEXPORT gzeof OF((gzFile file));
/* /*
Return true (1) if the end-of-file indicator for file has been set while Returns true (1) if the end-of-file indicator has been set while reading,
reading, false (0) otherwise. Note that the end-of-file indicator is set false (0) otherwise. Note that the end-of-file indicator is set only if the
only if the read tried to go past the end of the input, but came up short. read tried to go past the end of the input, but came up short. Therefore,
Therefore, just like feof(), gzeof() may return false even if there is no just like feof(), gzeof() may return false even if there is no more data to
more data to read, in the event that the last read request was for the exact read, in the event that the last read request was for the exact number of
number of bytes remaining in the input file. This will happen if the input bytes remaining in the input file. This will happen if the input file size
file size is an exact multiple of the buffer size. is an exact multiple of the buffer size.
If gzeof() returns true, then the read functions will return no more data, If gzeof() returns true, then the read functions will return no more data,
unless the end-of-file indicator is reset by gzclearerr() and the input file unless the end-of-file indicator is reset by gzclearerr() and the input file
@ -1623,7 +1622,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
/* /*
Return true (1) if file is being copied directly while reading, or false Returns true (1) if file is being copied directly while reading, or false
(0) if file is a gzip stream being decompressed. (0) if file is a gzip stream being decompressed.
If the input file is empty, gzdirect() will return true, since the input If the input file is empty, gzdirect() will return true, since the input
@ -1644,8 +1643,8 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
ZEXTERN int ZEXPORT gzclose OF((gzFile file)); ZEXTERN int ZEXPORT gzclose OF((gzFile file));
/* /*
Flush all pending output for file, if necessary, close file and Flushes all pending output if necessary, closes the compressed file and
deallocate the (de)compression state. Note that once file is closed, you deallocates the (de)compression state. Note that once file is closed, you
cannot call gzerror with file, since its structures have been deallocated. cannot call gzerror with file, since its structures have been deallocated.
gzclose must not be called more than once on the same file, just as free gzclose must not be called more than once on the same file, just as free
must not be called more than once on the same allocation. must not be called more than once on the same allocation.
@ -1669,10 +1668,10 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
/* /*
Return the error message for the last error which occurred on file. Returns the error message for the last error which occurred on the given
errnum is set to zlib error number. If an error occurred in the file system compressed file. errnum is set to zlib error number. If an error occurred
and not in the compression library, errnum is set to Z_ERRNO and the in the file system and not in the compression library, errnum is set to
application may consult errno to get the exact error code. Z_ERRNO and the application may consult errno to get the exact error code.
The application must not modify the returned string. Future calls to The application must not modify the returned string. Future calls to
this function may invalidate the previously returned string. If file is this function may invalidate the previously returned string. If file is
@ -1685,7 +1684,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
/* /*
Clear the error and end-of-file flags for file. This is analogous to the Clears the error and end-of-file flags for file. This is analogous to the
clearerr() function in stdio. This is useful for continuing to read a gzip clearerr() function in stdio. This is useful for continuing to read a gzip
file that is being written concurrently. file that is being written concurrently.
*/ */
@ -1703,9 +1702,8 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
/* /*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and Update a running Adler-32 checksum with the bytes buf[0..len-1] and
return the updated checksum. An Adler-32 value is in the range of a 32-bit return the updated checksum. If buf is Z_NULL, this function returns the
unsigned integer. If buf is Z_NULL, this function returns the required required initial value for the checksum.
initial value for the checksum.
An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed
much faster. much faster.
@ -1738,13 +1736,12 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
negative, the result has no meaning or utility. negative, the result has no meaning or utility.
*/ */
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
/* /*
Update a running CRC-32 with the bytes buf[0..len-1] and return the Update a running CRC-32 with the bytes buf[0..len-1] and return the
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. updated CRC-32. If buf is Z_NULL, this function returns the required
If buf is Z_NULL, this function returns the required initial value for the initial value for the crc. Pre- and post-conditioning (one's complement) is
crc. Pre- and post-conditioning (one's complement) is performed within this performed within this function so it shouldn't be done by the application.
function so it shouldn't be done by the application.
Usage example: Usage example:
@ -1758,7 +1755,7 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
#ifndef Z_FREETYPE #ifndef Z_FREETYPE
ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
z_size_t len)); z_size_t len));
/* /*
Same as crc32(), but with a size_t length. Same as crc32(), but with a size_t length.
@ -1774,20 +1771,6 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
len2. len2.
*/ */
/*
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2));
Return the operator corresponding to length len2, to be used with
crc32_combine_op().
*/
ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
/*
Give the same result as crc32_combine(), using op in place of len2. op is
is generated from len2 by crc32_combine_gen(). This will be faster than
crc32_combine() if the generated op is used more than once.
*/
/* various hacks, don't look :) */ /* various hacks, don't look :) */
@ -1888,7 +1871,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t));
#endif #endif
#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
@ -1899,7 +1881,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
# define z_gzoffset z_gzoffset64 # define z_gzoffset z_gzoffset64
# define z_adler32_combine z_adler32_combine64 # define z_adler32_combine z_adler32_combine64
# define z_crc32_combine z_crc32_combine64 # define z_crc32_combine z_crc32_combine64
# define z_crc32_combine_gen z_crc32_combine_gen64
# else # else
# define gzopen gzopen64 # define gzopen gzopen64
# define gzseek gzseek64 # define gzseek gzseek64
@ -1907,7 +1888,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
# define gzoffset gzoffset64 # define gzoffset gzoffset64
# define adler32_combine adler32_combine64 # define adler32_combine adler32_combine64
# define crc32_combine crc32_combine64 # define crc32_combine crc32_combine64
# define crc32_combine_gen crc32_combine_gen64
# endif # endif
# ifndef Z_LARGE64 # ifndef Z_LARGE64
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
@ -1916,7 +1896,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
# endif # endif
#else #else
ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
@ -1925,7 +1904,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
#endif #endif
#else /* Z_SOLO */ #else /* Z_SOLO */
@ -1933,7 +1911,6 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
#ifndef Z_FREETYPE #ifndef Z_FREETYPE
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
#endif #endif
#endif /* !Z_SOLO */ #endif /* !Z_SOLO */
@ -1948,7 +1925,7 @@ ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp));
ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
#if defined(_WIN32) && !defined(Z_SOLO) #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
const char *mode)); const char *mode));
#endif #endif

View File

@ -136,8 +136,8 @@ const char * ZEXPORT zError(
return ERR_MSG(err); return ERR_MSG(err);
} }
#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 #if defined(_WIN32_WCE)
/* The older Microsoft C Run-Time Library for Windows CE doesn't have /* The Microsoft C Run-Time Library for Windows CE doesn't have
* errno. We define it as a global variable to simplify porting. * errno. We define it as a global variable to simplify porting.
* Its value is always 0 and should not be used. * Its value is always 0 and should not be used.
*/ */

View File

@ -1,5 +1,5 @@
/* zutil.h -- internal interface and configuration of the compression library /* zutil.h -- internal interface and configuration of the compression library
* Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -29,6 +29,12 @@
# include <stdlib.h> # include <stdlib.h>
#endif #endif
#ifdef Z_SOLO
# ifndef Z_FREETYPE
typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
# endif
#endif
#ifndef local #ifndef local
# define local static # define local static
#endif #endif
@ -42,17 +48,6 @@ typedef unsigned short ush;
typedef ush FAR ushf; typedef ush FAR ushf;
typedef unsigned long ulg; typedef unsigned long ulg;
#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC)
# include <limits.h>
# if (ULONG_MAX == 0xffffffffffffffff)
# define Z_U8 unsigned long
# elif (ULLONG_MAX == 0xffffffffffffffff)
# define Z_U8 unsigned long long
# elif (UINT_MAX == 0xffffffffffffffff)
# define Z_U8 unsigned
# endif
#endif
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */ /* (size given to avoid silly warnings with Visual C++) */
@ -177,6 +172,10 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
# if defined(_WIN32_WCE) # if defined(_WIN32_WCE)
# define fdopen(fd,mode) NULL /* No fdopen() */ # define fdopen(fd,mode) NULL /* No fdopen() */
# ifndef _PTRDIFF_T_DEFINED
typedef int ptrdiff_t;
# define _PTRDIFF_T_DEFINED
# endif
# else # else
# define fdopen(fd,type) _fdopen(fd,type) # define fdopen(fd,type) _fdopen(fd,type)
# endif # endif

View File

@ -344,7 +344,7 @@
{ {
FT_Error error; FT_Error error;
FT_Memory memory; FT_Memory memory;
FT_LZWFile zip = NULL; FT_LZWFile zip;
if ( !stream || !source ) if ( !stream || !source )

View File

@ -207,7 +207,7 @@
pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 ); pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 );
if ( pfrface->height < pfrface->ascender - pfrface->descender ) if ( pfrface->height < pfrface->ascender - pfrface->descender )
pfrface->height = (FT_Short)( pfrface->ascender - pfrface->descender ); pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender);
if ( phy_font->num_strikes > 0 ) if ( phy_font->num_strikes > 0 )
{ {

View File

@ -248,7 +248,7 @@
else else
#endif /* FT_CONFIG_OPTION_INCREMENTAL */ #endif /* FT_CONFIG_OPTION_INCREMENTAL */
{ {
CFF_Font cff = (CFF_Font)( face->extra.data ); CFF_Font cff = (CFF_Font)(face->extra.data);
bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );

View File

@ -535,11 +535,11 @@
if ( r & 1 ) if ( r & 1 )
{ {
*buffer = (FT_Byte)( *buffer + c ); *buffer = (FT_Byte)(*buffer + c);
buffer++; buffer++;
} }
else else
*buffer = (FT_Byte)( c << 4 ); *buffer = (FT_Byte)(c << 4);
r++; r++;
} }
@ -572,8 +572,8 @@
if ( p >= limit ) if ( p >= limit )
return 0; return 0;
if ( n > (FT_UInt)( limit - p ) ) if ( n > (FT_UInt)(limit - p) )
n = (FT_UInt)( limit - p ); n = (FT_UInt)(limit - p);
for ( r = 0; r < n; r++ ) for ( r = 0; r < n; r++ )
{ {

View File

@ -1900,8 +1900,7 @@
/* WeightVector */ /* WeightVector */
{ {
FT_UInt idx; FT_UInt idx;
PS_Blend blend = decoder->blend; PS_Blend blend = decoder->blend;
FT_UInt len_buildchar = decoder->len_buildchar;
if ( arg_cnt != 1 || !blend ) if ( arg_cnt != 1 || !blend )
@ -1909,15 +1908,14 @@
idx = (FT_UInt)cf2_stack_popInt( opStack ); idx = (FT_UInt)cf2_stack_popInt( opStack );
if ( len_buildchar < blend->num_designs || if ( idx + blend->num_designs >
len_buildchar - blend->num_designs < idx ) decoder->len_buildchar )
goto Unexpected_OtherSubr; goto Unexpected_OtherSubr;
if ( decoder->buildchar && blend->weight_vector ) ft_memcpy( &decoder->buildchar[idx],
ft_memcpy( &decoder->buildchar[idx], blend->weight_vector,
blend->weight_vector, blend->num_designs *
blend->num_designs * sizeof ( blend->weight_vector[0] ) );
sizeof ( blend->weight_vector[0] ) );
} }
break; break;

View File

@ -99,31 +99,45 @@
} }
static void
shift_elements( PS_Table table,
FT_Byte* old_base )
{
FT_PtrDist delta = table->block - old_base;
FT_Byte** offset = table->elements;
FT_Byte** limit = offset + table->max_elems;
for ( ; offset < limit; offset++ )
{
if ( offset[0] )
offset[0] += delta;
}
}
static FT_Error static FT_Error
ps_table_realloc( PS_Table table, reallocate_t1_table( PS_Table table,
FT_Offset new_size ) FT_Offset new_size )
{ {
FT_Memory memory = table->memory; FT_Memory memory = table->memory;
FT_Byte* old_base = table->block; FT_Byte* old_base = table->block;
FT_Error error; FT_Error error;
/* (re)allocate the base block */ /* allocate new base block */
if ( FT_REALLOC( table->block, table->capacity, new_size ) ) if ( FT_ALLOC( table->block, new_size ) )
return error;
/* rebase offsets if necessary */
if ( old_base && table->block != old_base )
{ {
FT_Byte** offset = table->elements; table->block = old_base;
FT_Byte** limit = offset + table->max_elems; return error;
}
/* copy elements and shift offsets */
for ( ; offset < limit; offset++ ) if ( old_base )
{ {
if ( *offset ) FT_MEM_COPY( table->block, old_base, table->capacity );
*offset = table->block + ( *offset - old_base ); shift_elements( table, old_base );
} FT_FREE( old_base );
} }
table->capacity = new_size; table->capacity = new_size;
@ -190,7 +204,7 @@
new_size = FT_PAD_CEIL( new_size, 1024 ); new_size = FT_PAD_CEIL( new_size, 1024 );
} }
error = ps_table_realloc( table, new_size ); error = reallocate_t1_table( table, new_size );
if ( error ) if ( error )
return error; return error;
@ -220,12 +234,32 @@
* @InOut: * @InOut:
* table :: * table ::
* The target table. * The target table.
*
* @Note:
* This function does NOT release the heap's memory block. It is up
* to the caller to clean it, or reference it in its own structures.
*/ */
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
ps_table_done( PS_Table table ) ps_table_done( PS_Table table )
{ {
/* no problem if shrinking fails */ FT_Memory memory = table->memory;
ps_table_realloc( table, table->cursor ); FT_Error error;
FT_Byte* old_base = table->block;
/* should never fail, because rec.cursor <= rec.size */
if ( !old_base )
return;
if ( FT_QALLOC( table->block, table->cursor ) )
return;
FT_MEM_COPY( table->block, old_base, table->cursor );
shift_elements( table, old_base );
table->capacity = table->cursor;
FT_FREE( old_base );
FT_UNUSED( error );
} }
@ -518,7 +552,7 @@
if ( *cur == '<' ) /* <...> */ if ( *cur == '<' ) /* <...> */
{ {
if ( cur + 1 < limit && *( cur + 1 ) == '<' ) /* << */ if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */
{ {
cur++; cur++;
cur++; cur++;
@ -1064,6 +1098,7 @@
{ {
FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; FT_Byte* q = (FT_Byte*)objects[idx] + field->offset;
FT_Long val; FT_Long val;
FT_String* string = NULL;
skip_spaces( &cur, limit ); skip_spaces( &cur, limit );
@ -1113,9 +1148,8 @@
case T1_FIELD_TYPE_STRING: case T1_FIELD_TYPE_STRING:
case T1_FIELD_TYPE_KEY: case T1_FIELD_TYPE_KEY:
{ {
FT_Memory memory = parser->memory; FT_Memory memory = parser->memory;
FT_UInt len = (FT_UInt)( limit - cur ); FT_UInt len = (FT_UInt)( limit - cur );
FT_String* string = NULL;
if ( cur >= limit ) if ( cur >= limit )
@ -1156,6 +1190,7 @@
FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
field->ident )); field->ident ));
FT_FREE( *(FT_String**)q ); FT_FREE( *(FT_String**)q );
*(FT_String**)q = NULL;
} }
if ( FT_QALLOC( string, len + 1 ) ) if ( FT_QALLOC( string, len + 1 ) )

View File

@ -1548,9 +1548,8 @@
/* the accepted shift for strong points in fractional pixels */ /* the accepted shift for strong points in fractional pixels */
#define PSH_STRONG_THRESHOLD 32 #define PSH_STRONG_THRESHOLD 32
/* the maximum shift value in font units tuned to distinguish */ /* the maximum shift value in font units */
/* between stems and serifs in URW+ font collection */ #define PSH_STRONG_THRESHOLD_MAXIMUM 30
#define PSH_STRONG_THRESHOLD_MAXIMUM 12
/* find strong points in a glyph */ /* find strong points in a glyph */

View File

@ -646,7 +646,7 @@
T1_Private* priv, T1_Private* priv,
PSH_Globals *aglobals ) PSH_Globals *aglobals )
{ {
PSH_Globals globals = NULL; PSH_Globals globals;
FT_Error error; FT_Error error;

View File

@ -63,14 +63,16 @@
{ {
FT_UInt old_max = table->max_hints; FT_UInt old_max = table->max_hints;
FT_UInt new_max = count; FT_UInt new_max = count;
FT_Error error; FT_Error error = FT_Err_Ok;
/* try to grow the table */ if ( new_max > old_max )
new_max = FT_PAD_CEIL( new_max, 8 ); {
if ( !FT_QRENEW_ARRAY( table->hints, old_max, new_max ) ) /* try to grow the table */
table->max_hints = new_max; new_max = FT_PAD_CEIL( new_max, 8 );
if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
table->max_hints = new_max;
}
return error; return error;
} }
@ -88,14 +90,17 @@
count = table->num_hints; count = table->num_hints;
count++; count++;
if ( count > table->max_hints ) if ( count >= table->max_hints )
{ {
error = ps_hint_table_ensure( table, count, memory ); error = ps_hint_table_ensure( table, count, memory );
if ( error ) if ( error )
goto Exit; goto Exit;
} }
hint = table->hints + count - 1; /* initialized upstream */ hint = table->hints + count - 1;
hint->pos = 0;
hint->len = 0;
hint->flags = 0;
table->num_hints = count; table->num_hints = count;
@ -131,15 +136,14 @@
FT_UInt count, FT_UInt count,
FT_Memory memory ) FT_Memory memory )
{ {
FT_UInt old_max = mask->max_bits >> 3; FT_UInt old_max = ( mask->max_bits + 7 ) >> 3;
FT_UInt new_max = ( count + 7 ) >> 3; FT_UInt new_max = ( count + 7 ) >> 3;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
if ( new_max > old_max ) if ( new_max > old_max )
{ {
new_max = FT_PAD_CEIL( new_max, 8 ); new_max = FT_PAD_CEIL( new_max, 8 );
/* added bytes are zeroed here */
if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
mask->max_bits = new_max * 8; mask->max_bits = new_max * 8;
} }
@ -150,15 +154,31 @@
/* test a bit value in a given mask */ /* test a bit value in a given mask */
static FT_Int static FT_Int
ps_mask_test_bit( PS_Mask mask, ps_mask_test_bit( PS_Mask mask,
FT_UInt idx ) FT_Int idx )
{ {
if ( idx >= mask->num_bits ) if ( (FT_UInt)idx >= mask->num_bits )
return 0; return 0;
return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
} }
/* clear a given bit */
static void
ps_mask_clear_bit( PS_Mask mask,
FT_UInt idx )
{
FT_Byte* p;
if ( idx >= mask->num_bits )
return;
p = mask->bytes + ( idx >> 3 );
p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
}
/* set a given bit, possibly grow the mask */ /* set a given bit, possibly grow the mask */
static FT_Error static FT_Error
ps_mask_set_bit( PS_Mask mask, ps_mask_set_bit( PS_Mask mask,
@ -249,10 +269,6 @@
mask = table->masks + count - 1; mask = table->masks + count - 1;
mask->num_bits = 0; mask->num_bits = 0;
mask->end_point = 0; mask->end_point = 0;
/* reused mask must be cleared */
if ( mask->max_bits )
FT_MEM_ZERO( mask->bytes, mask->max_bits >> 3 );
table->num_masks = count; table->num_masks = count;
Exit: Exit:
@ -410,7 +426,7 @@
PS_Mask mask2 = table->masks + index2; PS_Mask mask2 = table->masks + index2;
FT_UInt count1 = mask1->num_bits; FT_UInt count1 = mask1->num_bits;
FT_UInt count2 = mask2->num_bits; FT_UInt count2 = mask2->num_bits;
FT_UInt delta; FT_Int delta;
if ( count2 > 0 ) if ( count2 > 0 )
@ -421,14 +437,15 @@
/* if "count2" is greater than "count1", we need to grow the */ /* if "count2" is greater than "count1", we need to grow the */
/* first bitset */ /* first bitset, and clear the highest bits */
if ( count2 > count1 ) if ( count2 > count1 )
{ {
error = ps_mask_ensure( mask1, count2, memory ); error = ps_mask_ensure( mask1, count2, memory );
if ( error ) if ( error )
goto Exit; goto Exit;
mask1->num_bits = count2; for ( pos = count1; pos < count2; pos++ )
ps_mask_clear_bit( mask1, pos );
} }
/* merge (unite) the bitsets */ /* merge (unite) the bitsets */
@ -450,7 +467,7 @@
mask2->end_point = 0; mask2->end_point = 0;
/* number of masks to move */ /* number of masks to move */
delta = table->num_masks - 1 - index2; delta = (FT_Int)( table->num_masks - 1 - index2 );
if ( delta > 0 ) if ( delta > 0 )
{ {
/* move to end of table for reuse */ /* move to end of table for reuse */
@ -459,7 +476,7 @@
ft_memmove( mask2, ft_memmove( mask2,
mask2 + 1, mask2 + 1,
delta * sizeof ( PS_MaskRec ) ); (FT_UInt)delta * sizeof ( PS_MaskRec ) );
mask2[delta] = dummy; mask2[delta] = dummy;
} }
@ -630,7 +647,7 @@
FT_Int pos, FT_Int pos,
FT_Int len, FT_Int len,
FT_Memory memory, FT_Memory memory,
FT_UInt *aindex ) FT_Int *aindex )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_UInt flags = 0; FT_UInt flags = 0;
@ -648,6 +665,9 @@
len = 0; len = 0;
} }
if ( aindex )
*aindex = -1;
/* now, lookup stem in the current hints table */ /* now, lookup stem in the current hints table */
{ {
PS_Mask mask; PS_Mask mask;
@ -684,7 +704,7 @@
goto Exit; goto Exit;
if ( aindex ) if ( aindex )
*aindex = idx; *aindex = (FT_Int)idx;
} }
Exit: Exit:
@ -695,9 +715,9 @@
/* add a "hstem3/vstem3" counter to our dimension table */ /* add a "hstem3/vstem3" counter to our dimension table */
static FT_Error static FT_Error
ps_dimension_add_counter( PS_Dimension dim, ps_dimension_add_counter( PS_Dimension dim,
FT_UInt hint1, FT_Int hint1,
FT_UInt hint2, FT_Int hint2,
FT_UInt hint3, FT_Int hint3,
FT_Memory memory ) FT_Memory memory )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
@ -724,17 +744,26 @@
} }
/* now, set the bits for our hints in the counter mask */ /* now, set the bits for our hints in the counter mask */
error = ps_mask_set_bit( counter, hint1, memory ); if ( hint1 >= 0 )
if ( error ) {
goto Exit; error = ps_mask_set_bit( counter, (FT_UInt)hint1, memory );
if ( error )
goto Exit;
}
error = ps_mask_set_bit( counter, hint2, memory ); if ( hint2 >= 0 )
if ( error ) {
goto Exit; error = ps_mask_set_bit( counter, (FT_UInt)hint2, memory );
if ( error )
goto Exit;
}
error = ps_mask_set_bit( counter, hint3, memory ); if ( hint3 >= 0 )
if ( error ) {
goto Exit; error = ps_mask_set_bit( counter, (FT_UInt)hint3, memory );
if ( error )
goto Exit;
}
Exit: Exit:
return error; return error;
@ -863,7 +892,7 @@
PS_Dimension dim; PS_Dimension dim;
FT_Memory memory = hints->memory; FT_Memory memory = hints->memory;
FT_Int count; FT_Int count;
FT_UInt idx[3]; FT_Int idx[3];
/* limit "dimension" to 0..1 */ /* limit "dimension" to 0..1 */

View File

@ -2269,7 +2269,7 @@
/* This is due to the fact that, in the vast majority of cases, */ /* This is due to the fact that, in the vast majority of cases, */
/* the span length in bytes is relatively small. */ /* the span length in bytes is relatively small. */
while ( --c2 > 0 ) while ( --c2 > 0 )
*( ++target ) = 0xFF; *(++target) = 0xFF;
target[1] |= f2; target[1] |= f2;
} }

View File

@ -738,18 +738,6 @@
contour = shape->contours; contour = shape->contours;
/* If the control point coincides with any of the end points */
/* then it is a line and should be treated as one to avoid */
/* unnecessary complexity later in the algorithm. */
if ( ( contour->last_pos.x == control_1->x &&
contour->last_pos.y == control_1->y ) ||
( control_1->x == to->x &&
control_1->y == to->y ) )
{
sdf_line_to( to, user );
goto Exit;
}
FT_CALL( sdf_edge_new( memory, &edge ) ); FT_CALL( sdf_edge_new( memory, &edge ) );
edge->edge_type = SDF_EDGE_CONIC; edge->edge_type = SDF_EDGE_CONIC;
@ -776,9 +764,9 @@
const FT_26D6_Vec* to, const FT_26D6_Vec* to,
void* user ) void* user )
{ {
SDF_Shape* shape = ( SDF_Shape* )user; SDF_Shape* shape = ( SDF_Shape* )user;
SDF_Edge* edge = NULL; SDF_Edge* edge = NULL;
SDF_Contour* contour = NULL; SDF_Contour* contour = NULL;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_Memory memory = shape->memory; FT_Memory memory = shape->memory;
@ -1077,7 +1065,7 @@
static FT_Error static FT_Error
split_sdf_conic( FT_Memory memory, split_sdf_conic( FT_Memory memory,
FT_26D6_Vec* control_points, FT_26D6_Vec* control_points,
FT_UInt max_splits, FT_Int max_splits,
SDF_Edge** out ) SDF_Edge** out )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
@ -1146,41 +1134,26 @@
static FT_Error static FT_Error
split_sdf_cubic( FT_Memory memory, split_sdf_cubic( FT_Memory memory,
FT_26D6_Vec* control_points, FT_26D6_Vec* control_points,
FT_UInt max_splits, FT_Int max_splits,
SDF_Edge** out ) SDF_Edge** out )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_26D6_Vec cpos[7]; FT_26D6_Vec cpos[7];
SDF_Edge* left, *right; SDF_Edge* left,* right;
const FT_26D6 threshold = ONE_PIXEL / 4;
if ( !memory || !out ) if ( !memory || !out )
{ {
error = FT_THROW( Invalid_Argument ); error = FT_THROW( Invalid_Argument );
goto Exit; goto Exit;
} }
/* split the cubic */ /* split the conic */
cpos[0] = control_points[0]; cpos[0] = control_points[0];
cpos[1] = control_points[1]; cpos[1] = control_points[1];
cpos[2] = control_points[2]; cpos[2] = control_points[2];
cpos[3] = control_points[3]; cpos[3] = control_points[3];
/* If the segment is flat enough we won't get any benefit by */
/* splitting it further, so we can just stop splitting. */
/* */
/* Check the deviation of the Bezier curve and stop if it is */
/* smaller than the pre-defined `threshold` value. */
if ( FT_ABS( 2 * cpos[0].x - 3 * cpos[1].x + cpos[3].x ) < threshold &&
FT_ABS( 2 * cpos[0].y - 3 * cpos[1].y + cpos[3].y ) < threshold &&
FT_ABS( cpos[0].x - 3 * cpos[2].x + 2 * cpos[3].x ) < threshold &&
FT_ABS( cpos[0].y - 3 * cpos[2].y + 2 * cpos[3].y ) < threshold )
{
split_cubic( cpos );
goto Append;
}
split_cubic( cpos ); split_cubic( cpos );
/* If max number of splits is done */ /* If max number of splits is done */
@ -1277,32 +1250,13 @@
/* Subdivide the curve and add it to the list. */ /* Subdivide the curve and add it to the list. */
{ {
FT_26D6_Vec ctrls[3]; FT_26D6_Vec ctrls[3];
FT_26D6 dx, dy;
FT_UInt num_splits;
ctrls[0] = edge->start_pos; ctrls[0] = edge->start_pos;
ctrls[1] = edge->control_a; ctrls[1] = edge->control_a;
ctrls[2] = edge->end_pos; ctrls[2] = edge->end_pos;
dx = FT_ABS( ctrls[2].x + ctrls[0].x - 2 * ctrls[1].x ); error = split_sdf_conic( memory, ctrls, 32, &new_edges );
dy = FT_ABS( ctrls[2].y + ctrls[0].y - 2 * ctrls[1].y );
if ( dx < dy )
dx = dy;
/* Calculate the number of necessary bisections. Each */
/* bisection causes a four-fold reduction of the deviation, */
/* hence we bisect the Bezier curve until the deviation */
/* becomes less than 1/8th of a pixel. For more details */
/* check file `ftgrays.c`. */
num_splits = 1;
while ( dx > ONE_PIXEL / 8 )
{
dx >>= 2;
num_splits <<= 1;
}
error = split_sdf_conic( memory, ctrls, num_splits, &new_edges );
} }
break; break;
@ -3014,7 +2968,7 @@
diff = current_dist.distance - min_dist.distance; diff = current_dist.distance - min_dist.distance;
if ( FT_ABS( diff ) < CORNER_CHECK_EPSILON ) if ( FT_ABS(diff ) < CORNER_CHECK_EPSILON )
min_dist = resolve_corner( min_dist, current_dist ); min_dist = resolve_corner( min_dist, current_dist );
else if ( diff < 0 ) else if ( diff < 0 )
min_dist = current_dist; min_dist = current_dist;
@ -3288,7 +3242,7 @@
buffer = (FT_SDFFormat*)bitmap->buffer; buffer = (FT_SDFFormat*)bitmap->buffer;
if ( USE_SQUARED_DISTANCES ) if ( USE_SQUARED_DISTANCES )
sp_sq = FT_INT_16D16( (FT_Int)( spread * spread ) ); sp_sq = FT_INT_16D16( spread * spread );
else else
sp_sq = fixed_spread; sp_sq = fixed_spread;
@ -3332,7 +3286,6 @@
FT_26D6_Vec grid_point = zero_vector; FT_26D6_Vec grid_point = zero_vector;
SDF_Signed_Distance dist = max_sdf; SDF_Signed_Distance dist = max_sdf;
FT_UInt index = 0; FT_UInt index = 0;
FT_16D16 diff = 0;
if ( x < 0 || x >= width ) if ( x < 0 || x >= width )
@ -3360,7 +3313,7 @@
if ( dist.distance > sp_sq ) if ( dist.distance > sp_sq )
continue; continue;
/* take the square root of the distance if required */ /* square_root the values and fit in a 6.10 fixed-point */
if ( USE_SQUARED_DISTANCES ) if ( USE_SQUARED_DISTANCES )
dist.distance = square_root( dist.distance ); dist.distance = square_root( dist.distance );
@ -3372,15 +3325,11 @@
/* check whether the pixel is set or not */ /* check whether the pixel is set or not */
if ( dists[index].sign == 0 ) if ( dists[index].sign == 0 )
dists[index] = dist; dists[index] = dist;
else else if ( dists[index].distance > dist.distance )
{ dists[index] = dist;
diff = FT_ABS( dists[index].distance - dist.distance ); else if ( FT_ABS( dists[index].distance - dist.distance )
< CORNER_CHECK_EPSILON )
if ( diff <= CORNER_CHECK_EPSILON ) dists[index] = resolve_corner( dists[index], dist );
dists[index] = resolve_corner( dists[index], dist );
else if ( dists[index].distance > dist.distance )
dists[index] = dist;
}
} }
} }

View File

@ -48,8 +48,6 @@ FT_BEGIN_HEADER
#define MIN_SPREAD 2 #define MIN_SPREAD 2
/* maximum spread supported by the renderer */ /* maximum spread supported by the renderer */
#define MAX_SPREAD 32 #define MAX_SPREAD 32
/* pixel size in 26.6 */
#define ONE_PIXEL ( 1 << 6 )
/************************************************************************** /**************************************************************************

View File

@ -298,9 +298,15 @@
goto Exit; goto Exit;
} }
/* nothing to render */ /* the rows and pitch must be valid after presetting the */
/* bitmap using outline */
if ( !bitmap->rows || !bitmap->pitch ) if ( !bitmap->rows || !bitmap->pitch )
return FT_Err_Ok; {
FT_ERROR(( "ft_sdf_render: failed to preset bitmap\n" ));
error = FT_THROW( Cannot_Render_Glyph );
goto Exit;
}
/* the padding will simply be equal to the `spread' */ /* the padding will simply be equal to the `spread' */
x_pad = sdf_module->spread; x_pad = sdf_module->spread;
@ -519,9 +525,13 @@
goto Exit; goto Exit;
} }
/* nothing to render */
if ( !bitmap->rows || !bitmap->pitch ) if ( !bitmap->rows || !bitmap->pitch )
return FT_Err_Ok; {
FT_ERROR(( "ft_bsdf_render: invalid bitmap size\n" ));
error = FT_THROW( Invalid_Argument );
goto Exit;
}
FT_Bitmap_New( &target ); FT_Bitmap_New( &target );

View File

@ -367,7 +367,7 @@
} }
/* transform transparency to alpha */ /* transform transparency to alpha */
if ( png_get_valid( png, info, PNG_INFO_tRNS ) ) if ( png_get_valid(png, info, PNG_INFO_tRNS ) )
png_set_tRNS_to_alpha( png ); png_set_tRNS_to_alpha( png );
if ( bitdepth == 16 ) if ( bitdepth == 16 )
@ -387,7 +387,7 @@
png_set_filler( png, 0xFF, PNG_FILLER_AFTER ); png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
/* recheck header after setting EXPAND options */ /* recheck header after setting EXPAND options */
png_read_update_info( png, info ); png_read_update_info(png, info );
png_get_IHDR( png, info, png_get_IHDR( png, info,
&imgWidth, &imgHeight, &imgWidth, &imgHeight,
&bitdepth, &color_type, &interlace, &bitdepth, &color_type, &interlace,

View File

@ -495,13 +495,15 @@
char_type_func char_type, char_type_func char_type,
FT_Bool report_invalid_characters ) FT_Bool report_invalid_characters )
{ {
FT_Error error; FT_Error error = FT_Err_Ok;
char* result = NULL; char* result = NULL;
FT_String* r; FT_String* r;
FT_Char* p; FT_Char* p;
FT_UInt len; FT_UInt len;
FT_UNUSED( error );
if ( FT_QALLOC( result, entry->stringLength / 2 + 1 ) ) if ( FT_QALLOC( result, entry->stringLength / 2 + 1 ) )
return NULL; return NULL;
@ -552,13 +554,15 @@
char_type_func char_type, char_type_func char_type,
FT_Bool report_invalid_characters ) FT_Bool report_invalid_characters )
{ {
FT_Error error; FT_Error error = FT_Err_Ok;
char* result = NULL; char* result = NULL;
FT_String* r; FT_String* r;
FT_Char* p; FT_Char* p;
FT_UInt len; FT_UInt len;
FT_UNUSED( error );
if ( FT_QALLOC( result, entry->stringLength + 1 ) ) if ( FT_QALLOC( result, entry->stringLength + 1 ) )
return NULL; return NULL;

View File

@ -566,7 +566,7 @@
face_index = FT_ABS( face_instance_index ) & 0xFFFF; face_index = FT_ABS( face_instance_index ) & 0xFFFF;
/* value -(N+1) requests information on index N */ /* value -(N+1) requests information on index N */
if ( face_instance_index < 0 && face_index > 0 ) if ( face_instance_index < 0 )
face_index--; face_index--;
if ( face_index >= face->ttc_header.count ) if ( face_index >= face->ttc_header.count )
@ -784,23 +784,17 @@
FT_Int num_params, FT_Int num_params,
FT_Parameter* params ) FT_Parameter* params )
{ {
FT_Error error; FT_Error error;
#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
FT_Error psnames_error; FT_Error psnames_error;
#endif #endif
FT_Bool has_outline;
FT_Bool has_outline; FT_Bool is_apple_sbit;
FT_Bool is_apple_sbit; FT_Bool is_apple_sbix;
FT_Bool has_CBLC;
FT_Bool has_CBLC; FT_Bool has_CBDT;
FT_Bool has_CBDT; FT_Bool ignore_typographic_family = FALSE;
FT_Bool has_EBLC; FT_Bool ignore_typographic_subfamily = FALSE;
FT_Bool has_bloc;
FT_Bool has_sbix;
FT_Bool ignore_typographic_family = FALSE;
FT_Bool ignore_typographic_subfamily = FALSE;
FT_Bool ignore_sbix = FALSE;
SFNT_Service sfnt = (SFNT_Service)face->sfnt; SFNT_Service sfnt = (SFNT_Service)face->sfnt;
@ -819,8 +813,6 @@
ignore_typographic_family = TRUE; ignore_typographic_family = TRUE;
else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY ) else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY )
ignore_typographic_subfamily = TRUE; ignore_typographic_subfamily = TRUE;
else if ( params[i].tag == FT_PARAM_TAG_IGNORE_SBIX )
ignore_sbix = TRUE;
} }
} }
@ -856,17 +848,14 @@
tt_face_lookup_table( face, TTAG_CFF2 ) ); tt_face_lookup_table( face, TTAG_CFF2 ) );
#endif #endif
/* check which sbit formats are present */ is_apple_sbit = 0;
has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 ); is_apple_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 );
has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 );
has_EBLC = !face->goto_table( face, TTAG_EBLC, stream, 0 );
has_bloc = !face->goto_table( face, TTAG_bloc, stream, 0 );
has_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 );
is_apple_sbit = FALSE; /* Apple 'sbix' color bitmaps are rendered scaled and then the 'glyf'
* outline rendered on top. We don't support that yet, so just ignore
if ( ignore_sbix ) * the 'glyf' outline and advertise it as a bitmap-only font. */
has_sbix = FALSE; if ( is_apple_sbix )
has_outline = FALSE;
/* if this font doesn't contain outlines, we try to load */ /* if this font doesn't contain outlines, we try to load */
/* a `bhed' table */ /* a `bhed' table */
@ -878,13 +867,16 @@
/* load the font header (`head' table) if this isn't an Apple */ /* load the font header (`head' table) if this isn't an Apple */
/* sbit font file */ /* sbit font file */
if ( !is_apple_sbit || has_sbix ) if ( !is_apple_sbit || is_apple_sbix )
{ {
LOAD_( head ); LOAD_( head );
if ( error ) if ( error )
goto Exit; goto Exit;
} }
has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 );
has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 );
/* Ignore outlines for CBLC/CBDT fonts. */ /* Ignore outlines for CBLC/CBDT fonts. */
if ( has_CBLC || has_CBDT ) if ( has_CBLC || has_CBDT )
has_outline = FALSE; has_outline = FALSE;
@ -994,11 +986,7 @@
/* the optional tables */ /* the optional tables */
/* embedded bitmap support */ /* embedded bitmap support */
/* TODO: Replace this clumsy check for all possible sbit tables */ if ( sfnt->load_eblc )
/* with something better (for example, by passing a parameter */
/* to suppress 'sbix' loading). */
if ( sfnt->load_eblc &&
( has_CBLC || has_EBLC || has_bloc || has_sbix ) )
LOAD_( eblc ); LOAD_( eblc );
/* colored glyph support */ /* colored glyph support */
@ -1066,19 +1054,11 @@
*/ */
if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC || if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC ||
face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX || face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ||
face->colr || face->colr )
face->svg )
flags |= FT_FACE_FLAG_COLOR; /* color glyphs */ flags |= FT_FACE_FLAG_COLOR; /* color glyphs */
if ( has_outline == TRUE ) if ( has_outline == TRUE )
{ flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */
/* by default (and for backward compatibility) we handle */
/* fonts with an 'sbix' table as bitmap-only */
if ( has_sbix )
flags |= FT_FACE_FLAG_SBIX; /* with 'sbix' bitmaps */
else
flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */
}
/* The sfnt driver only supports bitmap fonts natively, thus we */ /* The sfnt driver only supports bitmap fonts natively, thus we */
/* don't set FT_FACE_FLAG_HINTER. */ /* don't set FT_FACE_FLAG_HINTER. */
@ -1301,8 +1281,7 @@
* *
* Set up metrics. * Set up metrics.
*/ */
if ( FT_IS_SCALABLE( root ) || if ( FT_IS_SCALABLE( root ) )
FT_HAS_SBIX( root ) )
{ {
/* XXX What about if outline header is missing */ /* XXX What about if outline header is missing */
/* (e.g. sfnt wrapped bitmap)? */ /* (e.g. sfnt wrapped bitmap)? */

View File

@ -64,6 +64,7 @@
FT_FREE( stream->base ); FT_FREE( stream->base );
stream->size = 0; stream->size = 0;
stream->base = NULL;
stream->close = NULL; stream->close = NULL;
} }

View File

@ -84,8 +84,6 @@
#define BBOX_STREAM 5 #define BBOX_STREAM 5
#define INSTRUCTION_STREAM 6 #define INSTRUCTION_STREAM 6
#define HAVE_OVERLAP_SIMPLE_BITMAP 0x1
static void static void
stream_close( FT_Stream stream ) stream_close( FT_Stream stream )
@ -96,6 +94,7 @@
FT_FREE( stream->base ); FT_FREE( stream->base );
stream->size = 0; stream->size = 0;
stream->base = NULL;
stream->close = NULL; stream->close = NULL;
} }
@ -524,7 +523,6 @@
const WOFF2_Point points, const WOFF2_Point points,
FT_UShort n_contours, FT_UShort n_contours,
FT_UShort instruction_len, FT_UShort instruction_len,
FT_Bool have_overlap,
FT_Byte* dst, FT_Byte* dst,
FT_ULong dst_size, FT_ULong dst_size,
FT_ULong* glyph_size ) FT_ULong* glyph_size )
@ -552,9 +550,6 @@
FT_Int dy = point.y - last_y; FT_Int dy = point.y - last_y;
if ( i == 0 && have_overlap )
flag |= GLYF_OVERLAP_SIMPLE;
if ( dx == 0 ) if ( dx == 0 )
flag |= GLYF_THIS_X_IS_SAME; flag |= GLYF_THIS_X_IS_SAME;
else if ( dx > -256 && dx < 256 ) else if ( dx > -256 && dx < 256 )
@ -839,18 +834,15 @@
FT_UInt num_substreams = 7; FT_UInt num_substreams = 7;
FT_UShort option_flags;
FT_UShort num_glyphs; FT_UShort num_glyphs;
FT_UShort index_format; FT_UShort index_format;
FT_ULong expected_loca_length; FT_ULong expected_loca_length;
FT_UInt offset; FT_UInt offset;
FT_UInt i; FT_UInt i;
FT_ULong points_size; FT_ULong points_size;
FT_ULong bitmap_length;
FT_ULong glyph_buf_size; FT_ULong glyph_buf_size;
FT_ULong bbox_bitmap_offset; FT_ULong bbox_bitmap_offset;
FT_ULong bbox_bitmap_length;
FT_ULong overlap_bitmap_offset = 0;
FT_ULong overlap_bitmap_length = 0;
const FT_ULong glyf_start = *out_offset; const FT_ULong glyf_start = *out_offset;
FT_ULong dest_offset = *out_offset; FT_ULong dest_offset = *out_offset;
@ -866,17 +858,15 @@
if ( FT_NEW_ARRAY( substreams, num_substreams ) ) if ( FT_NEW_ARRAY( substreams, num_substreams ) )
goto Fail; goto Fail;
if ( FT_STREAM_SKIP( 2 ) ) if ( FT_STREAM_SKIP( 4 ) )
goto Fail;
if ( FT_READ_USHORT( option_flags ) )
goto Fail; goto Fail;
if ( FT_READ_USHORT( num_glyphs ) ) if ( FT_READ_USHORT( num_glyphs ) )
goto Fail; goto Fail;
if ( FT_READ_USHORT( index_format ) ) if ( FT_READ_USHORT( index_format ) )
goto Fail; goto Fail;
FT_TRACE4(( "option_flags = %u; num_glyphs = %u; index_format = %u\n", FT_TRACE4(( "num_glyphs = %u; index_format = %u\n",
option_flags, num_glyphs, index_format )); num_glyphs, index_format ));
info->num_glyphs = num_glyphs; info->num_glyphs = num_glyphs;
@ -889,7 +879,7 @@
if ( info->loca_table->dst_length != expected_loca_length ) if ( info->loca_table->dst_length != expected_loca_length )
goto Fail; goto Fail;
offset = 2 + 2 + 2 + 2 + ( num_substreams * 4 ); offset = ( 2 + num_substreams ) * 4;
if ( offset > info->glyf_table->TransformLength ) if ( offset > info->glyf_table->TransformLength )
goto Fail; goto Fail;
@ -912,20 +902,6 @@
offset += substream_size; offset += substream_size;
} }
if ( option_flags & HAVE_OVERLAP_SIMPLE_BITMAP )
{
/* Size of overlapBitmap = floor((numGlyphs + 7) / 8) */
overlap_bitmap_length = ( num_glyphs + 7U ) >> 3;
if ( overlap_bitmap_length > info->glyf_table->TransformLength - offset )
goto Fail;
overlap_bitmap_offset = pos + offset;
FT_TRACE5(( " Overlap bitmap: offset = %lu; size = %lu;\n",
overlap_bitmap_offset, overlap_bitmap_length ));
offset += overlap_bitmap_length;
}
if ( FT_NEW_ARRAY( loca_values, num_glyphs + 1 ) ) if ( FT_NEW_ARRAY( loca_values, num_glyphs + 1 ) )
goto Fail; goto Fail;
@ -933,9 +909,8 @@
bbox_bitmap_offset = substreams[BBOX_STREAM].offset; bbox_bitmap_offset = substreams[BBOX_STREAM].offset;
/* Size of bboxBitmap = 4 * floor((numGlyphs + 31) / 32) */ /* Size of bboxBitmap = 4 * floor((numGlyphs + 31) / 32) */
bbox_bitmap_length = ( ( num_glyphs + 31U ) >> 5 ) << 2; bitmap_length = ( ( num_glyphs + 31U ) >> 5 ) << 2;
/* bboxStreamSize is the combined size of bboxBitmap and bboxStream. */ substreams[BBOX_STREAM].offset += bitmap_length;
substreams[BBOX_STREAM].offset += bbox_bitmap_length;
glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF; glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF;
if ( FT_NEW_ARRAY( glyph_buf, glyph_buf_size ) ) if ( FT_NEW_ARRAY( glyph_buf, glyph_buf_size ) )
@ -973,7 +948,7 @@
/* composite glyph */ /* composite glyph */
FT_Bool have_instructions = FALSE; FT_Bool have_instructions = FALSE;
FT_UShort instruction_size = 0; FT_UShort instruction_size = 0;
FT_ULong composite_size = 0; FT_ULong composite_size;
FT_ULong size_needed; FT_ULong size_needed;
FT_Byte* pointer = NULL; FT_Byte* pointer = NULL;
@ -1051,11 +1026,8 @@
FT_ULong flag_size; FT_ULong flag_size;
FT_ULong triplet_size; FT_ULong triplet_size;
FT_ULong triplet_bytes_used; FT_ULong triplet_bytes_used;
FT_Bool have_overlap = FALSE; FT_Byte* flags_buf = NULL;
FT_Byte overlap_bitmap; FT_Byte* triplet_buf = NULL;
FT_ULong overlap_offset;
FT_Byte* flags_buf = NULL;
FT_Byte* triplet_buf = NULL;
FT_UShort instruction_size; FT_UShort instruction_size;
FT_ULong size_needed; FT_ULong size_needed;
FT_Int end_point; FT_Int end_point;
@ -1064,17 +1036,6 @@
FT_Byte* pointer = NULL; FT_Byte* pointer = NULL;
/* Set `have_overlap`. */
if ( overlap_bitmap_offset )
{
overlap_offset = overlap_bitmap_offset + ( i >> 3 );
if ( FT_STREAM_SEEK( overlap_offset ) ||
FT_READ_BYTE( overlap_bitmap ) )
goto Fail;
if ( overlap_bitmap & ( 0x80 >> ( i & 7 ) ) )
have_overlap = TRUE;
}
if ( FT_NEW_ARRAY( n_points_arr, n_contours ) ) if ( FT_NEW_ARRAY( n_points_arr, n_contours ) )
goto Fail; goto Fail;
@ -1195,7 +1156,6 @@
points, points,
n_contours, n_contours,
instruction_size, instruction_size,
have_overlap,
glyph_buf, glyph_buf,
glyph_buf_size, glyph_buf_size,
&glyph_size ) ) &glyph_size ) )
@ -2104,7 +2064,7 @@
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
} }
file_offset = ROUND4( woff2.metaOffset + woff2.metaLength ); file_offset = ROUND4(woff2.metaOffset + woff2.metaLength);
} }
if ( woff2.privOffset ) if ( woff2.privOffset )
@ -2114,7 +2074,7 @@
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
} }
file_offset = ROUND4( woff2.privOffset + woff2.privLength ); file_offset = ROUND4(woff2.privOffset + woff2.privLength);
} }
if ( file_offset != ( ROUND4( woff2.length ) ) ) if ( file_offset != ( ROUND4( woff2.length ) ) )
@ -2126,7 +2086,7 @@
/* Validate requested face index. */ /* Validate requested face index. */
*num_faces = woff2.num_fonts; *num_faces = woff2.num_fonts;
/* value -(N+1) requests information on index N */ /* value -(N+1) requests information on index N */
if ( *face_instance_index < 0 && face_index > 0 ) if ( *face_instance_index < 0 )
face_index--; face_index--;
if ( face_index >= woff2.num_fonts ) if ( face_index >= woff2.num_fonts )

View File

@ -56,7 +56,6 @@ FT_BEGIN_HEADER
#define GLYF_REPEAT 1 << 3 #define GLYF_REPEAT 1 << 3
#define GLYF_THIS_X_IS_SAME 1 << 4 #define GLYF_THIS_X_IS_SAME 1 << 4
#define GLYF_THIS_Y_IS_SAME 1 << 5 #define GLYF_THIS_Y_IS_SAME 1 << 5
#define GLYF_OVERLAP_SIMPLE 1 << 6
/* Other constants */ /* Other constants */
#define CONTOUR_OFFSET_END_POINT 10 #define CONTOUR_OFFSET_END_POINT 10

View File

@ -465,7 +465,7 @@
if ( subheader ) if ( subheader )
{ {
FT_Byte* p = subheader; FT_Byte* p = subheader;
FT_UInt idx = (FT_UInt)( char_code & 0xFF ); FT_UInt idx = (FT_UInt)(char_code & 0xFF);
FT_UInt start, count; FT_UInt start, count;
FT_Int delta; FT_Int delta;
FT_UInt offset; FT_UInt offset;

View File

@ -857,10 +857,10 @@
p = colr->clip_list; p = colr->clip_list;
/* Limit points to the first byte after the end of the color table. */ /* limit points to the first byte after the end of the color table. */
/* Thus, in subsequent limit checks below we need to check whether the */ /* Thus, in subsequent limit checks below we need to check whether the */
/* read pointer is strictly greater than a position offset by certain */ /* read pointer is strictly greater than a position offset */
/* field sizes to the left of that position. */ /* by certain field sizes to the left of that position. */
limit = (FT_Byte*)colr->table + colr->table_size; limit = (FT_Byte*)colr->table + colr->table_size;
/* Check whether we can extract one `uint8` and one `uint32`. */ /* Check whether we can extract one `uint8` and one `uint32`. */

View File

@ -94,7 +94,7 @@
p_next = p; p_next = p;
p += 2; /* skip version */ p += 2; /* skip version */
length = FT_NEXT_USHORT( p ); length = FT_NEXT_USHORT( p );
coverage = FT_NEXT_USHORT( p ); coverage = FT_NEXT_USHORT( p );
@ -144,7 +144,7 @@
cur_pair = FT_NEXT_ULONG( p ); cur_pair = FT_NEXT_ULONG( p );
if ( cur_pair < old_pair ) if ( cur_pair <= old_pair )
break; break;
p += 2; p += 2;
@ -187,18 +187,11 @@
FT_UInt left_glyph, FT_UInt left_glyph,
FT_UInt right_glyph ) FT_UInt right_glyph )
{ {
FT_Int result = 0; FT_Int result = 0;
FT_UInt count, mask; FT_UInt count, mask;
FT_Byte* p = face->kern_table;
FT_Byte* p_limit = p + face->kern_table_size;
FT_Byte* p;
FT_Byte* p_limit;
if ( !face->kern_table )
return result;
p = face->kern_table;
p_limit = p + face->kern_table_size;
p += 4; p += 4;
mask = 0x0001; mask = 0x0001;

View File

@ -172,8 +172,17 @@
goto Exit; goto Exit;
} }
#ifdef FT_DEBUG_LEVEL_TRACE
/* we currently don't support bit 1; however, it is better to */
/* draw at least something... */
if ( flags == 3 ) if ( flags == 3 )
face->root.face_flags |= FT_FACE_FLAG_SBIX_OVERLAY; {
FT_TRACE1(( "tt_face_load_sbit_strikes:"
" sbix overlay not supported yet\n" ));
FT_TRACE1(( " "
" expect bad rendering results\n" ));
}
#endif
/* /*
* Count the number of strikes available in the table. We are a bit * Count the number of strikes available in the table. We are a bit
@ -1571,34 +1580,17 @@
if ( !error ) if ( !error )
{ {
FT_Short abearing; /* not used here */ FT_Short abearing;
FT_UShort aadvance; FT_UShort aadvance;
tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance ); tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance );
metrics->horiBearingX = (FT_Short)originOffsetX; metrics->horiBearingX = (FT_Short)originOffsetX;
metrics->vertBearingX = (FT_Short)originOffsetX; metrics->horiBearingY = (FT_Short)( -originOffsetY + metrics->height );
metrics->horiBearingY = (FT_Short)( originOffsetY + metrics->height );
metrics->vertBearingY = (FT_Short)originOffsetY;
metrics->horiAdvance = (FT_UShort)( aadvance * metrics->horiAdvance = (FT_UShort)( aadvance *
face->root.size->metrics.x_ppem / face->root.size->metrics.x_ppem /
face->header.Units_Per_EM ); face->header.Units_Per_EM );
if ( face->vertical_info )
tt_face_get_metrics( face, TRUE, glyph_index, &abearing, &aadvance );
else if ( face->os2.version != 0xFFFFU )
aadvance = (FT_UShort)FT_ABS( face->os2.sTypoAscender -
face->os2.sTypoDescender );
else
aadvance = (FT_UShort)FT_ABS( face->horizontal.Ascender -
face->horizontal.Descender );
metrics->vertAdvance = (FT_UShort)( aadvance *
face->root.size->metrics.x_ppem /
face->header.Units_Per_EM );
} }
return error; return error;

View File

@ -39,11 +39,11 @@
/* NOTE: These table sizes are given by the specification. */ /* NOTE: These table sizes are given by the specification. */
#define SVG_TABLE_HEADER_SIZE (10U) #define SVG_TABLE_HEADER_SIZE 10U
#define SVG_DOCUMENT_RECORD_SIZE (12U) #define SVG_DOCUMENT_RECORD_SIZE 12U
#define SVG_DOCUMENT_LIST_MINIMUM_SIZE (2U + SVG_DOCUMENT_RECORD_SIZE) #define SVG_DOCUMENT_LIST_MINIMUM_SIZE 2U + SVG_DOCUMENT_RECORD_SIZE
#define SVG_MINIMUM_SIZE (SVG_TABLE_HEADER_SIZE + \ #define SVG_MINIMUM_SIZE SVG_TABLE_HEADER_SIZE + \
SVG_DOCUMENT_LIST_MINIMUM_SIZE) SVG_DOCUMENT_LIST_MINIMUM_SIZE
typedef struct Svg_ typedef struct Svg_
@ -319,7 +319,7 @@
#ifdef FT_CONFIG_OPTION_USE_ZLIB #ifdef FT_CONFIG_OPTION_USE_ZLIB
FT_ULong uncomp_size; FT_ULong uncomp_size;
FT_Byte* uncomp_buffer = NULL; FT_Byte* uncomp_buffer;
/* /*

View File

@ -507,34 +507,19 @@
FT_DEFINE_SERVICE_MULTIMASTERSREC( FT_DEFINE_SERVICE_MULTIMASTERSREC(
tt_service_gx_multi_masters, tt_service_gx_multi_masters,
(FT_Get_MM_Func) NULL, /* get_mm */ (FT_Get_MM_Func) NULL, /* get_mm */
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */ (FT_Set_MM_Design_Func) NULL, /* set_mm_design */
(FT_Set_MM_Blend_Func) TT_Set_MM_Blend, /* set_mm_blend */ (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, /* set_mm_blend */
(FT_Get_MM_Blend_Func) TT_Get_MM_Blend, /* get_mm_blend */ (FT_Get_MM_Blend_Func) TT_Get_MM_Blend, /* get_mm_blend */
(FT_Get_MM_Var_Func) TT_Get_MM_Var, /* get_mm_var */ (FT_Get_MM_Var_Func) TT_Get_MM_Var, /* get_mm_var */
(FT_Set_Var_Design_Func)TT_Set_Var_Design, /* set_var_design */ (FT_Set_Var_Design_Func) TT_Set_Var_Design, /* set_var_design */
(FT_Get_Var_Design_Func)TT_Get_Var_Design, /* get_var_design */ (FT_Get_Var_Design_Func) TT_Get_Var_Design, /* get_var_design */
(FT_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */ (FT_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */
(FT_Set_MM_WeightVector_Func) (FT_Set_MM_WeightVector_Func)NULL, /* set_mm_weightvector */
NULL, /* set_mm_weightvector */ (FT_Get_MM_WeightVector_Func)NULL, /* get_mm_weightvector */
(FT_Get_MM_WeightVector_Func)
NULL, /* get_mm_weightvector */ (FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */
(FT_Var_Load_Delta_Set_Idx_Map_Func) (FT_Done_Blend_Func) tt_done_blend /* done_blend */
tt_var_load_delta_set_index_mapping,
/* load_delta_set_idx_map */
(FT_Var_Load_Item_Var_Store_Func)
tt_var_load_item_variation_store,
/* load_item_variation_store */
(FT_Var_Get_Item_Delta_Func)
tt_var_get_item_delta, /* get_item_delta */
(FT_Var_Done_Item_Var_Store_Func)
tt_var_done_item_variation_store,
/* done_item_variation_store */
(FT_Var_Done_Delta_Set_Idx_Map_Func)
tt_var_done_delta_set_index_map,
/* done_delta_set_index_map */
(FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */
(FT_Done_Blend_Func) tt_done_blend /* done_blend */
) )
FT_DEFINE_SERVICE_METRICSVARIATIONSREC( FT_DEFINE_SERVICE_METRICSVARIATIONSREC(

View File

@ -1104,8 +1104,8 @@
for ( ; vec < limit; vec++, u++ ) for ( ; vec < limit; vec++, u++ )
{ {
vec->x = ADD_LONG( FT_MulFix( u->x, x_scale ), 32 ) >> 6; vec->x = ( FT_MulFix( u->x, x_scale ) + 32 ) >> 6;
vec->y = ADD_LONG( FT_MulFix( u->y, y_scale ), 32 ) >> 6; vec->y = ( FT_MulFix( u->y, y_scale ) + 32 ) >> 6;
} }
} }
else else
@ -1228,8 +1228,8 @@
p1 = gloader->base.outline.points + k; p1 = gloader->base.outline.points + k;
p2 = gloader->base.outline.points + l; p2 = gloader->base.outline.points + l;
x = SUB_LONG( p1->x, p2->x ); x = p1->x - p2->x;
y = SUB_LONG( p1->y, p2->y ); y = p1->y - p2->y;
} }
else else
{ {
@ -2255,7 +2255,7 @@
if ( loader->widthp ) if ( loader->widthp )
glyph->metrics.horiAdvance = loader->widthp[glyph_index] * 64; glyph->metrics.horiAdvance = loader->widthp[glyph_index] * 64;
else else
glyph->metrics.horiAdvance = SUB_LONG( loader->pp2.x, loader->pp1.x ); glyph->metrics.horiAdvance = SUB_LONG(loader->pp2.x, loader->pp1.x);
/* set glyph dimensions */ /* set glyph dimensions */
glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin ); glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin );
@ -2787,12 +2787,11 @@
* A function used to load a single glyph within a given glyph slot, * A function used to load a single glyph within a given glyph slot,
* for a given size. * for a given size.
* *
* @InOut: * @Input:
* glyph :: * glyph ::
* A handle to a target slot object where the glyph * A handle to a target slot object where the glyph
* will be loaded. * will be loaded.
* *
* @Input:
* size :: * size ::
* A handle to the source face size at which the glyph * A handle to the source face size at which the glyph
* must be scaled/loaded. * must be scaled/loaded.
@ -2897,12 +2896,8 @@
} }
else else
{ {
if ( FT_IS_SCALABLE( glyph->face ) || if ( FT_IS_SCALABLE( glyph->face ) )
FT_HAS_SBIX( glyph->face ) )
{ {
TT_Face face = (TT_Face)glyph->face;
/* for the bbox we need the header only */ /* for the bbox we need the header only */
(void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
(void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
@ -2910,35 +2905,6 @@
glyph->linearHoriAdvance = loader.linear; glyph->linearHoriAdvance = loader.linear;
glyph->linearVertAdvance = loader.vadvance; glyph->linearVertAdvance = loader.vadvance;
/* Bitmaps from the 'sbix' table need special treatment: */
/* if there is a glyph contour, the bitmap origin must be */
/* shifted to be relative to the lower left corner of the */
/* glyph bounding box, also taking the left-side bearing */
/* (or top bearing) into account. */
if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX &&
loader.n_contours > 0 )
{
FT_Int bitmap_left;
FT_Int bitmap_top;
if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
{
/* This is a guess, since Apple's CoreText engine doesn't */
/* really do vertical typesetting. */
bitmap_left = loader.bbox.xMin;
bitmap_top = loader.top_bearing;
}
else
{
bitmap_left = loader.left_bearing;
bitmap_top = loader.bbox.yMin;
}
glyph->bitmap_left += FT_MulFix( bitmap_left, x_scale ) >> 6;
glyph->bitmap_top += FT_MulFix( bitmap_top, y_scale ) >> 6;
}
/* sanity checks: if `xxxAdvance' in the sbit metric */ /* sanity checks: if `xxxAdvance' in the sbit metric */
/* structure isn't set, use `linearXXXAdvance' */ /* structure isn't set, use `linearXXXAdvance' */
if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )

View File

@ -151,7 +151,9 @@
FT_UInt i, j; FT_UInt i, j;
FT_UShort first; FT_UShort first;
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
FT_Error error; FT_Error error = FT_Err_Ok;
FT_UNUSED( error );
*point_cnt = 0; *point_cnt = 0;
@ -264,7 +266,9 @@
FT_UInt i, j; FT_UInt i, j;
FT_UInt bytes_used; FT_UInt bytes_used;
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
FT_Error error; FT_Error error = FT_Err_Ok;
FT_UNUSED( error );
if ( FT_QNEW_ARRAY( deltas, delta_cnt ) ) if ( FT_QNEW_ARRAY( deltas, delta_cnt ) )
@ -357,12 +361,14 @@
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
GX_Blend blend = face->blend; GX_Blend blend = face->blend;
GX_AVarSegment segment; GX_AVarSegment segment;
FT_Error error; FT_Error error = FT_Err_Ok;
FT_Long version; FT_Long version;
FT_Long axisCount; FT_Long axisCount;
FT_Int i, j; FT_Int i, j;
FT_ULong table_len; FT_ULong table_len;
FT_UNUSED( error );
FT_TRACE2(( "AVAR " )); FT_TRACE2(( "AVAR " ));
@ -415,6 +421,7 @@
FT_FREE( blend->avar_segment[j].correspondence ); FT_FREE( blend->avar_segment[j].correspondence );
FT_FREE( blend->avar_segment ); FT_FREE( blend->avar_segment );
blend->avar_segment = NULL;
goto Exit; goto Exit;
} }
@ -438,8 +445,8 @@
} }
FT_LOCAL_DEF( FT_Error ) static FT_Error
tt_var_load_item_variation_store( TT_Face face, ft_var_load_item_variation_store( TT_Face face,
FT_ULong offset, FT_ULong offset,
GX_ItemVarStore itemStore ) GX_ItemVarStore itemStore )
{ {
@ -465,7 +472,7 @@
if ( format != 1 ) if ( format != 1 )
{ {
FT_TRACE2(( "tt_var_load_item_variation_store: bad store format %d\n", FT_TRACE2(( "ft_var_load_item_variation_store: bad store format %d\n",
format )); format ));
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
@ -479,17 +486,7 @@
/* we need at least one entry in `itemStore->varData' */ /* we need at least one entry in `itemStore->varData' */
if ( !itemStore->dataCount ) if ( !itemStore->dataCount )
{ {
FT_TRACE2(( "tt_var_load_item_variation_store: missing varData\n" )); FT_TRACE2(( "ft_var_load_item_variation_store: missing varData\n" ));
error = FT_THROW( Invalid_Table );
goto Exit;
}
/* new in OpenType 1.8.4: inner & outer index equal to 0xFFFF */
/* has a special meaning (i.e., no variation data for this item) */
if ( itemStore->dataCount == 0xFFFFU )
{
FT_TRACE2(( "ft_var_load_item_variation_store:"
" dataCount too large\n" ));
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
} }
@ -515,7 +512,7 @@
if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis ) if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis )
{ {
FT_TRACE2(( "tt_var_load_item_variation_store:" FT_TRACE2(( "ft_var_load_item_variation_store:"
" number of axes in item variation store\n" )); " number of axes in item variation store\n" ));
FT_TRACE2(( " " FT_TRACE2(( " "
" and `fvar' table are different\n" )); " and `fvar' table are different\n" ));
@ -526,7 +523,7 @@
/* new constraint in OpenType 1.8.4 */ /* new constraint in OpenType 1.8.4 */
if ( itemStore->regionCount >= 32768U ) if ( itemStore->regionCount >= 32768U )
{ {
FT_TRACE2(( "tt_var_load_item_variation_store:" FT_TRACE2(( "ft_var_load_item_variation_store:"
" too many variation region tables\n" )); " too many variation region tables\n" ));
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
@ -680,8 +677,8 @@
} }
FT_LOCAL_DEF( FT_Error ) static FT_Error
tt_var_load_delta_set_index_mapping( TT_Face face, ft_var_load_delta_set_index_mapping( TT_Face face,
FT_ULong offset, FT_ULong offset,
GX_DeltaSetIdxMap map, GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
@ -738,7 +735,7 @@
/* rough sanity check */ /* rough sanity check */
if ( map->mapCount * entrySize > table_len ) if ( map->mapCount * entrySize > table_len )
{ {
FT_TRACE1(( "tt_var_load_delta_set_index_mapping:" FT_TRACE1(( "ft_var_load_delta_set_index_mapping:"
" invalid number of delta-set index mappings\n" )); " invalid number of delta-set index mappings\n" ));
error = FT_THROW( Invalid_Table ); error = FT_THROW( Invalid_Table );
goto Exit; goto Exit;
@ -768,16 +765,6 @@
mapData = ( mapData << 8 ) | data; mapData = ( mapData << 8 ) | data;
} }
/* new in OpenType 1.8.4 */
if ( mapData == 0xFFFFFFFFUL )
{
/* no variation data for this item */
map->outerIndex[i] = 0xFFFFU;
map->innerIndex[i] = 0xFFFFU;
continue;
}
outerIndex = mapData >> innerBitCount; outerIndex = mapData >> innerBitCount;
if ( outerIndex >= itemStore->dataCount ) if ( outerIndex >= itemStore->dataCount )
@ -907,7 +894,7 @@
table = blend->hvar_table; table = blend->hvar_table;
} }
error = tt_var_load_item_variation_store( error = ft_var_load_item_variation_store(
face, face,
table_offset + store_offset, table_offset + store_offset,
&table->itemStore ); &table->itemStore );
@ -916,7 +903,7 @@
if ( widthMap_offset ) if ( widthMap_offset )
{ {
error = tt_var_load_delta_set_index_mapping( error = ft_var_load_delta_set_index_mapping(
face, face,
table_offset + widthMap_offset, table_offset + widthMap_offset,
&table->widthMap, &table->widthMap,
@ -958,8 +945,8 @@
} }
FT_LOCAL_DEF( FT_Int ) static FT_Int
tt_var_get_item_delta( TT_Face face, ft_var_get_item_delta( TT_Face face,
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
FT_UInt outerIndex, FT_UInt outerIndex,
FT_UInt innerIndex ) FT_UInt innerIndex )
@ -1148,29 +1135,19 @@
} }
} }
/* new test introduced in OpenType 1.8.4 */ delta = ft_var_get_item_delta( face,
if ( outerIndex == 0xFFFFU && innerIndex == 0xFFFFU ) &table->itemStore,
{ outerIndex,
FT_TRACE5(( "no adjustment to %s value %d\n", innerIndex );
vertical ? "vertical height" : "horizontal width",
*avalue ));
}
else
{
delta = tt_var_get_item_delta( face,
&table->itemStore,
outerIndex,
innerIndex );
FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n", FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
vertical ? "vertical height" : "horizontal width", vertical ? "vertical height" : "horizontal width",
*avalue, *avalue,
delta, delta,
delta == 1 ? "" : "s", delta == 1 ? "" : "s",
vertical ? "VVAR" : "HVAR" )); vertical ? "VVAR" : "HVAR" ));
*avalue += delta; *avalue += delta;
}
Exit: Exit:
return error; return error;
@ -1337,7 +1314,7 @@
records_offset = FT_STREAM_POS(); records_offset = FT_STREAM_POS();
error = tt_var_load_item_variation_store( error = ft_var_load_item_variation_store(
face, face,
table_offset + store_offset, table_offset + store_offset,
&blend->mvar_table->itemStore ); &blend->mvar_table->itemStore );
@ -1362,13 +1339,6 @@
value->outerIndex = FT_GET_USHORT(); value->outerIndex = FT_GET_USHORT();
value->innerIndex = FT_GET_USHORT(); value->innerIndex = FT_GET_USHORT();
/* new in OpenType 1.8.4 */
if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
{
/* no variation data for this item */
continue;
}
if ( value->outerIndex >= itemStore->dataCount || if ( value->outerIndex >= itemStore->dataCount ||
value->innerIndex >= itemStore->varData[value->outerIndex] value->innerIndex >= itemStore->varData[value->outerIndex]
.itemCount ) .itemCount )
@ -1459,14 +1429,7 @@
FT_Int delta; FT_Int delta;
/* new test introduced in OpenType 1.8.4 */ delta = ft_var_get_item_delta( face,
if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
{
/* no variation data for this item */
continue;
}
delta = tt_var_get_item_delta( face,
&blend->mvar_table->itemStore, &blend->mvar_table->itemStore,
value->outerIndex, value->outerIndex,
value->innerIndex ); value->innerIndex );
@ -2790,6 +2753,7 @@
/* The cvt table has been loaded already; every time we change the */ /* The cvt table has been loaded already; every time we change the */
/* blend we may need to reload and remodify the cvt table. */ /* blend we may need to reload and remodify the cvt table. */
FT_FREE( face->cvt ); FT_FREE( face->cvt );
face->cvt = NULL;
error = tt_face_load_cvt( face, face->root.stream ); error = tt_face_load_cvt( face, face->root.stream );
break; break;
@ -2808,6 +2772,7 @@
/* enforce recomputation of the PostScript name; */ /* enforce recomputation of the PostScript name; */
FT_FREE( face->postscript_name ); FT_FREE( face->postscript_name );
face->postscript_name = NULL;
Exit: Exit:
return error; return error;
@ -4349,8 +4314,8 @@
} }
FT_LOCAL_DEF( void ) static void
tt_var_done_item_variation_store( TT_Face face, ft_var_done_item_variation_store( TT_Face face,
GX_ItemVarStore itemStore ) GX_ItemVarStore itemStore )
{ {
FT_Memory memory = FT_FACE_MEMORY( face ); FT_Memory memory = FT_FACE_MEMORY( face );
@ -4378,18 +4343,6 @@
} }
FT_LOCAL_DEF( void )
tt_var_done_delta_set_index_map( TT_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap )
{
FT_Memory memory = FT_FACE_MEMORY( face );
FT_FREE( deltaSetIdxMap->innerIndex );
FT_FREE( deltaSetIdxMap->outerIndex );
}
/************************************************************************** /**************************************************************************
* *
* @Function: * @Function:
@ -4427,27 +4380,27 @@
if ( blend->hvar_table ) if ( blend->hvar_table )
{ {
tt_var_done_item_variation_store( face, ft_var_done_item_variation_store( face,
&blend->hvar_table->itemStore ); &blend->hvar_table->itemStore );
tt_var_done_delta_set_index_map( face, FT_FREE( blend->hvar_table->widthMap.innerIndex );
&blend->hvar_table->widthMap ); FT_FREE( blend->hvar_table->widthMap.outerIndex );
FT_FREE( blend->hvar_table ); FT_FREE( blend->hvar_table );
} }
if ( blend->vvar_table ) if ( blend->vvar_table )
{ {
tt_var_done_item_variation_store( face, ft_var_done_item_variation_store( face,
&blend->vvar_table->itemStore ); &blend->vvar_table->itemStore );
tt_var_done_delta_set_index_map( face, FT_FREE( blend->vvar_table->widthMap.innerIndex );
&blend->vvar_table->widthMap ); FT_FREE( blend->vvar_table->widthMap.outerIndex );
FT_FREE( blend->vvar_table ); FT_FREE( blend->vvar_table );
} }
if ( blend->mvar_table ) if ( blend->mvar_table )
{ {
tt_var_done_item_variation_store( face, ft_var_done_item_variation_store( face,
&blend->mvar_table->itemStore ); &blend->mvar_table->itemStore );
FT_FREE( blend->mvar_table->values ); FT_FREE( blend->mvar_table->values );

View File

@ -62,6 +62,57 @@ FT_BEGIN_HEADER
} GX_AVarSegmentRec, *GX_AVarSegment; } GX_AVarSegmentRec, *GX_AVarSegment;
typedef struct GX_ItemVarDataRec_
{
FT_UInt itemCount; /* number of delta sets per item */
FT_UInt regionIdxCount; /* number of region indices in this data */
FT_UInt* regionIndices; /* array of `regionCount' indices; */
/* these index `varRegionList' */
FT_Short* deltaSet; /* array of `itemCount' deltas */
/* use `innerIndex' for this array */
} GX_ItemVarDataRec, *GX_ItemVarData;
/* contribution of one axis to a region */
typedef struct GX_AxisCoordsRec_
{
FT_Fixed startCoord;
FT_Fixed peakCoord; /* zero means no effect (factor = 1) */
FT_Fixed endCoord;
} GX_AxisCoordsRec, *GX_AxisCoords;
typedef struct GX_VarRegionRec_
{
GX_AxisCoords axisList; /* array of axisCount records */
} GX_VarRegionRec, *GX_VarRegion;
/* item variation store */
typedef struct GX_ItemVarStoreRec_
{
FT_UInt dataCount;
GX_ItemVarData varData; /* array of dataCount records; */
/* use `outerIndex' for this array */
FT_UShort axisCount;
FT_UInt regionCount; /* total number of regions defined */
GX_VarRegion varRegionList;
} GX_ItemVarStoreRec, *GX_ItemVarStore;
typedef struct GX_DeltaSetIdxMapRec_
{
FT_ULong mapCount;
FT_UInt* outerIndex; /* indices to item var data */
FT_UInt* innerIndex; /* indices to delta set */
} GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
/************************************************************************** /**************************************************************************
* *
* @Struct: * @Struct:
@ -380,34 +431,6 @@ FT_BEGIN_HEADER
FT_LOCAL( void ) FT_LOCAL( void )
tt_apply_mvar( TT_Face face ); tt_apply_mvar( TT_Face face );
FT_LOCAL( FT_Error )
tt_var_load_item_variation_store( TT_Face face,
FT_ULong offset,
GX_ItemVarStore itemStore );
FT_LOCAL( FT_Error )
tt_var_load_delta_set_index_mapping( TT_Face face,
FT_ULong offset,
GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore,
FT_ULong table_len );
FT_LOCAL( FT_Int )
tt_var_get_item_delta( TT_Face face,
GX_ItemVarStore itemStore,
FT_UInt outerIndex,
FT_UInt innerIndex );
FT_LOCAL( void )
tt_var_done_item_variation_store( TT_Face face,
GX_ItemVarStore itemStore );
FT_LOCAL( void )
tt_var_done_delta_set_index_map( TT_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_get_var_blend( TT_Face face, tt_get_var_blend( TT_Face face,
FT_UInt *num_coords, FT_UInt *num_coords,

View File

@ -516,6 +516,14 @@
exec->GS.round_state = 1; exec->GS.round_state = 1;
exec->GS.loop = 1; exec->GS.loop = 1;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
exec->iup_called = FALSE;
#endif
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
exec->iupx_called = FALSE;
exec->iupy_called = FALSE;
#endif
/* some glyphs leave something on the stack. so we clean it */ /* some glyphs leave something on the stack. so we clean it */
/* before a new execution. */ /* before a new execution. */
exec->top = 0; exec->top = 0;
@ -7839,15 +7847,6 @@
Compute_Funcs( exc ); Compute_Funcs( exc );
Compute_Round( exc, (FT_Byte)exc->GS.round_state ); Compute_Round( exc, (FT_Byte)exc->GS.round_state );
/* These flags cancel execution of some opcodes after IUP is called */
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
exc->iup_called = FALSE;
#endif
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
exc->iupx_called = FALSE;
exc->iupy_called = FALSE;
#endif
do do
{ {
exc->opcode = exc->code[exc->IP]; exc->opcode = exc->code[exc->IP];

View File

@ -727,8 +727,7 @@
if ( error ) if ( error )
goto Exit; goto Exit;
if ( FT_IS_SCALABLE( ttface ) || if ( FT_IS_SCALABLE( ttface ) )
FT_HAS_SBIX( ttface ) )
{ {
#ifdef FT_CONFIG_OPTION_INCREMENTAL #ifdef FT_CONFIG_OPTION_INCREMENTAL
if ( !ttface->internal->incremental_interface ) if ( !ttface->internal->incremental_interface )

View File

@ -203,7 +203,7 @@
kp->index1 = FT_Get_Char_Index( t1_face, p[0] ); kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
kp->index2 = FT_Get_Char_Index( t1_face, p[1] ); kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
kp->x = (FT_Int)FT_PEEK_SHORT_LE( p + 2 ); kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
kp->y = 0; kp->y = 0;
kp++; kp++;

View File

@ -121,30 +121,19 @@
#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
static const FT_Service_MultiMastersRec t1_service_multi_masters = static const FT_Service_MultiMastersRec t1_service_multi_masters =
{ {
(FT_Get_MM_Func) T1_Get_Multi_Master, /* get_mm */ (FT_Get_MM_Func) T1_Get_Multi_Master, /* get_mm */
(FT_Set_MM_Design_Func) T1_Set_MM_Design, /* set_mm_design */ (FT_Set_MM_Design_Func) T1_Set_MM_Design, /* set_mm_design */
(FT_Set_MM_Blend_Func) T1_Set_MM_Blend, /* set_mm_blend */ (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, /* set_mm_blend */
(FT_Get_MM_Blend_Func) T1_Get_MM_Blend, /* get_mm_blend */ (FT_Get_MM_Blend_Func) T1_Get_MM_Blend, /* get_mm_blend */
(FT_Get_MM_Var_Func) T1_Get_MM_Var, /* get_mm_var */ (FT_Get_MM_Var_Func) T1_Get_MM_Var, /* get_mm_var */
(FT_Set_Var_Design_Func)T1_Set_Var_Design, /* set_var_design */ (FT_Set_Var_Design_Func) T1_Set_Var_Design, /* set_var_design */
(FT_Get_Var_Design_Func)T1_Get_Var_Design, /* get_var_design */ (FT_Get_Var_Design_Func) T1_Get_Var_Design, /* get_var_design */
(FT_Set_Instance_Func) T1_Reset_MM_Blend, /* set_instance */ (FT_Set_Instance_Func) T1_Reset_MM_Blend, /* set_instance */
(FT_Set_MM_WeightVector_Func) (FT_Set_MM_WeightVector_Func)T1_Set_MM_WeightVector, /* set_mm_weightvector */
T1_Set_MM_WeightVector, /* set_mm_weightvector */ (FT_Get_MM_WeightVector_Func)T1_Get_MM_WeightVector, /* get_mm_weightvector */
(FT_Get_MM_WeightVector_Func)
T1_Get_MM_WeightVector, /* get_mm_weightvector */ (FT_Get_Var_Blend_Func) NULL, /* get_var_blend */
(FT_Var_Load_Delta_Set_Idx_Map_Func) (FT_Done_Blend_Func) T1_Done_Blend /* done_blend */
NULL, /* load_delta_set_idx_map */
(FT_Var_Load_Item_Var_Store_Func)
NULL, /* load_item_variation_store */
(FT_Var_Get_Item_Delta_Func)
NULL, /* get_item_delta */
(FT_Var_Done_Item_Var_Store_Func)
NULL, /* done_item_variation_store */
(FT_Var_Done_Delta_Set_Idx_Map_Func)
NULL, /* done_delta_set_index_map */
(FT_Get_Var_Blend_Func) NULL, /* get_var_blend */
(FT_Done_Blend_Func) T1_Done_Blend /* done_blend */
}; };
#endif #endif

View File

@ -2057,9 +2057,9 @@
name_table->elements[n][len] = '\0'; name_table->elements[n][len] = '\0';
/* record index of /.notdef */ /* record index of /.notdef */
if ( *cur == '.' && if ( *cur == '.' &&
ft_strcmp( ".notdef", ft_strcmp( ".notdef",
(const char*)( name_table->elements[n] ) ) == 0 ) (const char*)(name_table->elements[n]) ) == 0 )
{ {
notdef_index = n; notdef_index = n;
notdef_found = 1; notdef_found = 1;
@ -2331,8 +2331,8 @@
/* in valid Type 1 fonts we don't see `RD' or `-|' directly */ /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
/* since those tokens are handled by parse_subrs and */ /* since those tokens are handled by parse_subrs and */
/* parse_charstrings */ /* parse_charstrings */
else if ( *cur == 'R' && cur + 6 < limit && *( cur + 1 ) == 'D' && else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
have_integer ) have_integer )
{ {
FT_ULong s; FT_ULong s;
FT_Byte* b; FT_Byte* b;
@ -2344,8 +2344,8 @@
have_integer = 0; have_integer = 0;
} }
else if ( *cur == '-' && cur + 6 < limit && *( cur + 1 ) == '|' && else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
have_integer ) have_integer )
{ {
FT_ULong s; FT_ULong s;
FT_Byte* b; FT_Byte* b;

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