forked from minhngoc25a/freetype2
Compare commits
74 Commits
VER-2-12-0
...
master
Author | SHA1 | Date |
---|---|---|
Dominik Röttsches | 275b116b40 | |
Dominik Röttsches | 44fd524ee4 | |
Dominik Röttsches | 603fef28a6 | |
Dominik Röttsches | d134b9e37b | |
Dominik Röttsches | 8ec531c26c | |
Dominik Röttsches | 9c4ad2a901 | |
Dominik Röttsches | 3414fef74f | |
Dominik Röttsches | 7c151abb69 | |
Dominik Röttsches | 8a9192f68e | |
Stephen Holdaway | d5d048bbfe | |
Dominik Röttsches | 31b14fd4dc | |
Chris Liddell | 1a242558be | |
Thomas Sondergaard | 55a97b0cb1 | |
Werner Lemberg | 31005d98a4 | |
Dominik Röttsches | bec4ef415e | |
Werner Lemberg | de27955c2a | |
Dominik Röttsches | 0607e0e959 | |
Dominik Röttsches | dece953516 | |
Dominik Röttsches | 15fef219d6 | |
Werner Lemberg | 2db58e061e | |
Dominik Röttsches | 117df36b4c | |
Alexei Podtelezhnikov | 5e48c88d57 | |
Alexei Podtelezhnikov | 9006ff7d10 | |
Werner Lemberg | 2848378be5 | |
Werner Lemberg | 40c6f97326 | |
Dominik Röttsches | 4b6f92e6b3 | |
Xavier Claessens | b861b24157 | |
Alexei Podtelezhnikov | 47103b2f19 | |
Alexei Podtelezhnikov | 705f416184 | |
Ben Wagner | f7daf9d293 | |
Alexei Podtelezhnikov | d9b8a69e9a | |
Alexei Podtelezhnikov | 9c706dcca7 | |
Ben Wagner | 9079521002 | |
Alexei Podtelezhnikov | d6fc8c6ba0 | |
Ben Wagner | 8bb7722a53 | |
Ben Wagner | 58395dd200 | |
Alexei Podtelezhnikov | 8b6bcc92c5 | |
Alexei Podtelezhnikov | e7482ff4c2 | |
Alexei Podtelezhnikov | 73631b9530 | |
Alexei Podtelezhnikov | 4fef1fcede | |
bruvzg | 9acefc4f51 | |
Ben Wagner | b11074cf6d | |
Ben Wagner | c26872ed59 | |
Alexei Podtelezhnikov | d685798123 | |
Alexei Podtelezhnikov | 8addad6065 | |
Alexei Podtelezhnikov | c26f0d0d7e | |
Behdad Esfahbod (بهداد اسفهبد) | b98dd169a1 | |
Dominik Röttsches | 7838c78f53 | |
Dominik Röttsches | 9aa99f2262 | |
Dominik Röttsches | a4c4566b6d | |
Dominik Röttsches | 5f19f49c81 | |
Werner Lemberg | e3ac7bb64a | |
Werner Lemberg | b4b7c3f607 | |
Werner Lemberg | c8a9c88975 | |
Werner Lemberg | 5d49473f85 | |
Werner Lemberg | e8ebfe988b | |
Anuj Verma | 7b3ebb9c12 | |
Werner Lemberg | 62bc04f4c5 | |
Brendan Shanks | 6fb7b7a09d | |
Alexei Podtelezhnikov | ed4d0710f1 | |
Alexei Podtelezhnikov | 581dd06405 | |
Xavier Claessens | d59c7ce1b9 | |
Werner Lemberg | 079a22da03 | |
Georg Brandl | 978eefee54 | |
Steve Lhomme | 3100c8120e | |
Ben Wagner | a1ca701023 | |
Werner Lemberg | aee6b94727 | |
Werner Lemberg | fc08295650 | |
Werner Lemberg | 1603378b91 | |
Eric Jing | 89d5cce58d | |
Werner Lemberg | 695d606ae5 | |
Ben Wagner | d247c56278 | |
Werner Lemberg | 385345037e | |
Werner Lemberg | 8a33164dad |
|
@ -5,7 +5,7 @@ stages:
|
|||
|
||||
# FIXME: Use --werror once warnings are fixed.
|
||||
variables:
|
||||
MESON_ARGS: --fatal-meson-warnings
|
||||
MESON_ARGS: --fatal-meson-warnings --default-library=both
|
||||
MESON_ARGS_WINDOWS: ${MESON_ARGS} --force-fallback-for=zlib
|
||||
|
||||
.build windows common:
|
||||
|
@ -47,8 +47,18 @@ variables:
|
|||
- Import-Certificate -CertStoreLocation "Cert:\LocalMachine\Root" "C:\roots.sst"
|
||||
# Make sure meson is up to date so we don't need to rebuild the image
|
||||
# with each release.
|
||||
- pip3 install meson==0.59.1
|
||||
- pip3 install -U 'meson==0.59.*'
|
||||
- pip3 install --upgrade certifi
|
||||
- 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:
|
||||
# For some reason, options are separated by newlines instead of spaces,
|
||||
# so we have to replace them first.
|
||||
|
@ -59,11 +69,10 @@ variables:
|
|||
# script. Environment variables substitutions is done by PowerShell
|
||||
# before calling `cmd.exe`, that's why we use `$env:FOO` instead of
|
||||
# `%FOO%`.
|
||||
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
|
||||
meson setup build $env:MESON_ARGS_WINDOWS &&
|
||||
meson compile --verbose -C build &&
|
||||
meson test -C build &&
|
||||
meson test -C build --benchmark"
|
||||
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH $env:VS_UWP &&
|
||||
meson setup build $env:MESON_ARGS_WINDOWS $env:MESON_ARGS_UWP &&
|
||||
meson compile --verbose -C build
|
||||
$env:MESON_WINDOWS_TESTS"
|
||||
|
||||
|
||||
# Format of job names:
|
||||
|
@ -76,12 +85,20 @@ windows meson vs2017 amd64:
|
|||
extends: '.build windows meson'
|
||||
variables:
|
||||
ARCH: 'amd64'
|
||||
MESON_WINDOWS_TESTS: '&& meson test -C build && meson test -C build --benchmark'
|
||||
|
||||
windows meson vs2017 x86:
|
||||
extends: '.build windows meson'
|
||||
variables:
|
||||
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.
|
||||
#
|
||||
|
@ -130,7 +147,8 @@ linux autotools libs clang:
|
|||
linux meson:
|
||||
extends: '.build linux common'
|
||||
script: |
|
||||
meson setup build -Dbrotli=disabled \
|
||||
meson setup build ${MESON_ARGS} \
|
||||
-Dbrotli=disabled \
|
||||
-Dbzip2=disabled \
|
||||
-Dharfbuzz=disabled \
|
||||
-Dpng=disabled \
|
||||
|
@ -142,7 +160,8 @@ linux meson:
|
|||
linux meson libs:
|
||||
extends: '.build linux common'
|
||||
script: |
|
||||
meson setup build -Dbrotli=enabled \
|
||||
meson setup build ${MESON_ARGS} \
|
||||
-Dbrotli=enabled \
|
||||
-Dbzip2=enabled \
|
||||
-Dharfbuzz=disabled \
|
||||
-Dpng=disabled \
|
||||
|
@ -205,7 +224,7 @@ macos meson:
|
|||
- pip3 install -U meson
|
||||
- pip3 install --upgrade certifi
|
||||
- pip3 install -U ninja
|
||||
|
||||
- meson setup build
|
||||
|
||||
- meson setup build ${MESON_ARGS}
|
||||
- meson compile --verbose -C build
|
||||
- sudo meson install -C build
|
||||
|
|
|
@ -121,7 +121,6 @@ endif ()
|
|||
|
||||
include(CheckIncludeFile)
|
||||
include(CMakeDependentOption)
|
||||
include(FindPkgConfig)
|
||||
|
||||
# CMAKE_TOOLCHAIN_FILE must be set before `project' is called, which
|
||||
# configures the base build environment and references the toolchain file
|
||||
|
@ -163,7 +162,7 @@ project(freetype C)
|
|||
|
||||
set(VERSION_MAJOR "2")
|
||||
set(VERSION_MINOR "12")
|
||||
set(VERSION_PATCH "0")
|
||||
set(VERSION_PATCH "1")
|
||||
|
||||
# Generate LIBRARY_VERSION and LIBRARY_SOVERSION.
|
||||
set(LIBTOOL_REGEX "version_info='([0-9]+):([0-9]+):([0-9]+)'")
|
||||
|
@ -245,6 +244,8 @@ endif ()
|
|||
|
||||
|
||||
# Find dependencies
|
||||
include(FindPkgConfig)
|
||||
|
||||
if (NOT FT_DISABLE_HARFBUZZ)
|
||||
set(HARFBUZZ_MIN_VERSION "2.0.0")
|
||||
if (FT_REQUIRE_HARFBUZZ)
|
||||
|
@ -491,46 +492,55 @@ if (BUILD_FRAMEWORK)
|
|||
)
|
||||
set_target_properties(freetype PROPERTIES
|
||||
FRAMEWORK TRUE
|
||||
MACOSX_FRAMEWORK_INFO_PLIST builds/mac/freetype-Info.plist
|
||||
MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/builds/mac/freetype-Info.plist
|
||||
PUBLIC_HEADER "${PUBLIC_HEADERS}"
|
||||
XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
|
||||
)
|
||||
endif ()
|
||||
|
||||
# 'freetype-interface' is an interface library, to be accessed with
|
||||
# `EXPORT_NAME Freetype::Freetype`. This is the target name provided by
|
||||
# CMake's `FindFreetype.cmake`, so we provide it for compatibility.
|
||||
add_library(freetype-interface INTERFACE)
|
||||
set_target_properties(freetype-interface PROPERTIES
|
||||
EXPORT_NAME Freetype::Freetype
|
||||
INTERFACE_LINK_LIBRARIES freetype)
|
||||
|
||||
set(PKG_CONFIG_REQUIRED_PRIVATE "")
|
||||
set(PKG_CONFIG_LIBS_PRIVATE "")
|
||||
set(PKGCONFIG_REQUIRES "")
|
||||
set(PKGCONFIG_REQUIRES_PRIVATE "")
|
||||
set(PKGCONFIG_LIBS "-L\${libdir} -lfreetype")
|
||||
set(PKGCONFIG_LIBS_PRIVATE "")
|
||||
|
||||
if (ZLIB_FOUND)
|
||||
target_link_libraries(freetype PRIVATE ${ZLIB_LIBRARIES})
|
||||
target_include_directories(freetype PRIVATE ${ZLIB_INCLUDE_DIRS})
|
||||
list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "zlib")
|
||||
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "zlib")
|
||||
endif ()
|
||||
if (BZIP2_FOUND)
|
||||
target_link_libraries(freetype PRIVATE ${BZIP2_LIBRARIES})
|
||||
target_include_directories(freetype PRIVATE ${BZIP2_INCLUDE_DIR}) # not BZIP2_INCLUDE_DIRS
|
||||
if (PC_BZIP2_FOUND)
|
||||
list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "bzip2")
|
||||
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "bzip2")
|
||||
else ()
|
||||
list(APPEND PKG_CONFIG_LIBS_PRIVATE "-lbz2")
|
||||
list(APPEND PKGCONFIG_LIBS_PRIVATE "-lbz2")
|
||||
endif ()
|
||||
endif ()
|
||||
if (PNG_FOUND)
|
||||
target_link_libraries(freetype PRIVATE ${PNG_LIBRARIES})
|
||||
target_compile_definitions(freetype PRIVATE ${PNG_DEFINITIONS})
|
||||
target_include_directories(freetype PRIVATE ${PNG_INCLUDE_DIRS})
|
||||
list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libpng")
|
||||
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "libpng")
|
||||
endif ()
|
||||
if (HarfBuzz_FOUND)
|
||||
target_link_libraries(freetype PRIVATE ${HarfBuzz_LIBRARY})
|
||||
target_include_directories(freetype PRIVATE ${HarfBuzz_INCLUDE_DIRS})
|
||||
list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}")
|
||||
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}")
|
||||
endif ()
|
||||
if (BROTLIDEC_FOUND)
|
||||
target_link_libraries(freetype PRIVATE ${BROTLIDEC_LIBRARIES})
|
||||
target_compile_definitions(freetype PRIVATE ${BROTLIDEC_DEFINITIONS})
|
||||
target_include_directories(freetype PRIVATE ${BROTLIDEC_INCLUDE_DIRS})
|
||||
list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libbrotlidec")
|
||||
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "libbrotlidec")
|
||||
endif ()
|
||||
|
||||
|
||||
|
@ -557,7 +567,7 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
|
|||
# Generate the pkg-config file
|
||||
file(READ "${PROJECT_SOURCE_DIR}/builds/unix/freetype2.in" FREETYPE2_PC_IN)
|
||||
|
||||
string(REPLACE ";" ", " PKG_CONFIG_REQUIRED_PRIVATE "${PKG_CONFIG_REQUIRED_PRIVATE}")
|
||||
string(REPLACE ";" ", " PKGCONFIG_REQUIRES_PRIVATE "${PKGCONFIG_REQUIRES_PRIVATE}")
|
||||
|
||||
string(REPLACE "%prefix%" ${CMAKE_INSTALL_PREFIX}
|
||||
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
|
||||
|
@ -569,10 +579,26 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
|
|||
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
|
||||
string(REPLACE "%ft_version%" "${LIBTOOL_CURRENT}.${LIBTOOL_REVISION}.${LIBTOOL_AGE}"
|
||||
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
|
||||
string(REPLACE "%REQUIRES_PRIVATE%" "${PKG_CONFIG_REQUIRED_PRIVATE}"
|
||||
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
|
||||
string(REPLACE "%LIBS_PRIVATE%" "${PKG_CONFIG_LIBS_PRIVATE}"
|
||||
FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
|
||||
|
||||
if (BUILD_SHARED_LIBS)
|
||||
string(REPLACE "%PKGCONFIG_REQUIRES%" "${PKGCONFIG_REQUIRES}"
|
||||
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")
|
||||
if (EXISTS "${FREETYPE2_PC_IN_NAME}")
|
||||
|
@ -596,7 +622,7 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
|
|||
COMPATIBILITY SameMajorVersion)
|
||||
|
||||
install(
|
||||
TARGETS freetype
|
||||
TARGETS freetype freetype-interface
|
||||
EXPORT freetype-targets
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
|
|
12
README
12
README
|
@ -1,4 +1,4 @@
|
|||
FreeType 2.12.0
|
||||
FreeType 2.12.1
|
||||
===============
|
||||
|
||||
Homepage: https://www.freetype.org
|
||||
|
@ -16,7 +16,9 @@ Read the files `docs/INSTALL*` for installation instructions; see the
|
|||
file `docs/LICENSE.TXT` for the available licenses.
|
||||
|
||||
For using FreeType's git repository instead of a distribution bundle,
|
||||
please read file `README.git`.
|
||||
please read file `README.git`. Note that you have to actually clone
|
||||
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`;
|
||||
use the file `index.html` as the top entry point. [Please note that
|
||||
|
@ -30,9 +32,9 @@ sites. Go to
|
|||
|
||||
and download one of the following files.
|
||||
|
||||
freetype-doc-2.12.0.tar.xz
|
||||
freetype-doc-2.12.0.tar.gz
|
||||
ftdoc2120.zip
|
||||
freetype-doc-2.12.1.tar.xz
|
||||
freetype-doc-2.12.1.tar.gz
|
||||
ftdoc2121.zip
|
||||
|
||||
To view the documentation online, go to
|
||||
|
||||
|
|
|
@ -182,7 +182,7 @@ copy_submodule_files ()
|
|||
cp $DLG_SRC_DIR/* src/dlg
|
||||
}
|
||||
|
||||
if test -d ".git"; then
|
||||
if test -e ".git"; then
|
||||
DLG_INC_DIR=subprojects/dlg/include/dlg
|
||||
DLG_SRC_DIR=subprojects/dlg/src/dlg
|
||||
|
||||
|
|
|
@ -317,6 +317,6 @@ do-dist: distclean refdoc
|
|||
rm -f docs/mkdocs.yml
|
||||
|
||||
@# Remove more stuff related to git.
|
||||
rm -rf subprojects
|
||||
rm -rf subprojects/dlg
|
||||
|
||||
# EOF
|
||||
|
|
|
@ -17,7 +17,7 @@ AC_CONFIG_SRCDIR([ftconfig.h.in])
|
|||
|
||||
# Don't forget to update `docs/VERSIONS.TXT'!
|
||||
|
||||
version_info='24:2:18'
|
||||
version_info='24:3:18'
|
||||
AC_SUBST([version_info])
|
||||
ft_version=`echo $version_info | tr : .`
|
||||
AC_SUBST([ft_version])
|
||||
|
@ -530,16 +530,28 @@ AC_SEARCH_LIBS([clock_gettime],
|
|||
[test "$ac_cv_search_clock_gettime" = "none required" \
|
||||
|| LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
|
||||
|
||||
# 'librsvg' is needed to demonstrate SVG support.
|
||||
PKG_CHECK_MODULES([LIBRSVG], [librsvg-2.0 >= 2.46.0],
|
||||
[have_librsvg="yes (pkg-config)"], [have_librsvg=no])
|
||||
|
||||
FT_DEMO_CFLAGS=""
|
||||
FT_DEMO_LDFLAGS="$LIB_CLOCK_GETTIME"
|
||||
|
||||
if test "$have_librsvg" != no; then
|
||||
FT_DEMO_CFLAGS="$FT_DEMO_CFLAGS $LIBRSVG_CFLAGS -DHAVE_LIBRSVG"
|
||||
FT_DEMO_LDFLAGS="$FT_DEMO_LDFLAGS $LIBRSVG_LIBS"
|
||||
# 'librsvg' is needed to demonstrate SVG support.
|
||||
AC_ARG_WITH([librsvg],
|
||||
[AS_HELP_STRING([--with-librsvg=@<:@yes|no|auto@:>@],
|
||||
[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
|
||||
|
||||
AC_SUBST([FT_DEMO_CFLAGS])
|
||||
|
|
|
@ -21,7 +21,7 @@ the following targets:
|
|||
<li>PPC/SP WM6 (Windows Mobile 6)</li>
|
||||
</ul>
|
||||
|
||||
It compiles the following libraries from the FreeType 2.12.0 sources:</p>
|
||||
It compiles the following libraries from the FreeType 2.12.1 sources:</p>
|
||||
|
||||
<ul>
|
||||
<pre>
|
||||
|
|
|
@ -21,7 +21,7 @@ the following targets:
|
|||
<li>PPC/SP WM6 (Windows Mobile 6)</li>
|
||||
</ul>
|
||||
|
||||
It compiles the following libraries from the FreeType 2.12.0 sources:</p>
|
||||
It compiles the following libraries from the FreeType 2.12.1 sources:</p>
|
||||
|
||||
<ul>
|
||||
<pre>
|
||||
|
|
|
@ -197,8 +197,7 @@
|
|||
|
||||
|
||||
/* non-desktop Universal Windows Platform */
|
||||
#if defined( WINAPI_FAMILY_PARTITION ) && \
|
||||
!WINAPI_FAMILY_PARTITION( WINAPI_PARTITION_DESKTOP )
|
||||
#if defined( WINAPI_FAMILY ) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
|
||||
|
||||
#define PACK_DWORD64( hi, lo ) ( ( (DWORD64)(hi) << 32 ) | (DWORD)(lo) )
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<p>This directory contains solution and project files for
|
||||
Visual C++ 2010 or newer, named <tt>freetype.sln</tt>,
|
||||
and <tt>freetype.vcxproj</tt>. It compiles the following libraries
|
||||
from the FreeType 2.12.0 sources:</p>
|
||||
from the FreeType 2.12.1 sources:</p>
|
||||
|
||||
<ul>
|
||||
<li>freetype.dll using 'Release' or 'Debug' configurations</li>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<p>This directory contains project files <tt>freetype.dsp</tt> for
|
||||
Visual C++ 6.0, and <tt>freetype.vcproj</tt> for Visual C++ 2002
|
||||
through 2008, which you might need to upgrade automatically.
|
||||
It compiles the following libraries from the FreeType 2.12.0 sources:</p>
|
||||
It compiles the following libraries from the FreeType 2.12.1 sources:</p>
|
||||
|
||||
<ul>
|
||||
<li>freetype.dll using 'Release' or 'Debug' configurations</li>
|
||||
|
|
|
@ -21,7 +21,7 @@ the following targets:
|
|||
<li>PPC/SP WM6 (Windows Mobile 6)</li>
|
||||
</ul>
|
||||
|
||||
It compiles the following libraries from the FreeType 2.12.0 sources:</p>
|
||||
It compiles the following libraries from the FreeType 2.12.1 sources:</p>
|
||||
|
||||
<ul>
|
||||
<pre>
|
||||
|
|
46
docs/CHANGES
46
docs/CHANGES
|
@ -1,3 +1,49 @@
|
|||
CHANGES BETWEEN 2.12.1 and 2.12.2
|
||||
|
||||
I. IMPORTANT BUG FIXES
|
||||
|
||||
II. MISCELLANEOUS
|
||||
|
||||
- TrueType interpreter version 38 (aka Infinality) that was first
|
||||
introduced about 10 years ago in FreeType 2.4.11 is now deprecated
|
||||
and slated to be removed in the next version. TrueType interpreter
|
||||
version 40 has been FreeType default version for 6 years now and
|
||||
provides an excelent alternative. This is the last FreeType version
|
||||
with TT_INTERPRETER_VERSION_38 and TT_INTERPRETER_VERSION_40 treated
|
||||
differently.
|
||||
|
||||
======================================================================
|
||||
|
||||
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
|
||||
|
||||
I. IMPORTANT CHANGES
|
||||
|
|
|
@ -60,6 +60,7 @@ found on _most_ systems, but not all of them:
|
|||
|
||||
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.0 24.0.18 6.18.0
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.TH FREETYPE-CONFIG 1 "March 2022" "FreeType 2.12.0"
|
||||
.TH FREETYPE-CONFIG 1 "May 2022" "FreeType 2.12.1"
|
||||
.
|
||||
.
|
||||
.SH NAME
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 5.3 KiB |
|
@ -2411,9 +2411,9 @@
|
|||
units per em (e.g. Inter). This patch fixes it.
|
||||
|
||||
The return value of af_loader_compute_darkening was also changed to
|
||||
use 16.16 fixed point to get rid of a redundant truncation operation.
|
||||
use 16.16 fixed-point to get rid of a redundant truncation operation.
|
||||
This should slightly improve the precision, although it's still
|
||||
bottlenecked by the emboldening function, which uses 26.6 fixed point.
|
||||
bottlenecked by the emboldening function, which uses 26.6 fixed-point.
|
||||
|
||||
* src/autofit/afloader.[ch]
|
||||
(af_loader_compute_darkening): Return FT_Fixed.
|
||||
|
|
|
@ -707,7 +707,7 @@
|
|||
[base] Fix integer overflow.
|
||||
|
||||
* src/base/ftoutln.c (FT_Outline_EmboldenXY): Normalize incoming and
|
||||
outgoing vectors and use fixed point arithmetic.
|
||||
outgoing vectors and use fixed-point arithmetic.
|
||||
|
||||
2013-01-23 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||
|
||||
|
|
|
@ -1892,13 +1892,13 @@ FT_BEGIN_HEADER
|
|||
* The advance width of the unhinted glyph. Its value is expressed in
|
||||
* 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when
|
||||
* loading the glyph. This field can be important to perform correct
|
||||
* WYSIWYG layout. Only relevant for outline glyphs.
|
||||
* WYSIWYG layout. Only relevant for scalable glyphs.
|
||||
*
|
||||
* linearVertAdvance ::
|
||||
* The advance height of the unhinted glyph. Its value is expressed in
|
||||
* 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when
|
||||
* loading the glyph. This field can be important to perform correct
|
||||
* WYSIWYG layout. Only relevant for outline glyphs.
|
||||
* WYSIWYG layout. Only relevant for scalable glyphs.
|
||||
*
|
||||
* advance ::
|
||||
* This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the
|
||||
|
@ -4942,7 +4942,7 @@ FT_BEGIN_HEADER
|
|||
*/
|
||||
#define FREETYPE_MAJOR 2
|
||||
#define FREETYPE_MINOR 12
|
||||
#define FREETYPE_PATCH 0
|
||||
#define FREETYPE_PATCH 1
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -521,21 +521,26 @@ FT_BEGIN_HEADER
|
|||
*
|
||||
* @description:
|
||||
* This iterator object is needed for @FT_Get_Colorline_Stops. It keeps
|
||||
* state while iterating over the stops of an @FT_ColorLine,
|
||||
* representing the `ColorLine` struct of the v1 extensions to 'COLR',
|
||||
* see 'https://github.com/googlefonts/colr-gradients-spec'.
|
||||
* state while iterating over the stops of an @FT_ColorLine, representing
|
||||
* the `ColorLine` struct of the v1 extensions to 'COLR', see
|
||||
* 'https://github.com/googlefonts/colr-gradients-spec'. Do not manually
|
||||
* modify fields of this iterator.
|
||||
*
|
||||
* @fields:
|
||||
* num_color_stops ::
|
||||
* The number of color stops for the requested glyph index. Set by
|
||||
* @FT_Get_Colorline_Stops.
|
||||
* @FT_Get_Paint.
|
||||
*
|
||||
* current_color_stop ::
|
||||
* The current color stop. Set by @FT_Get_Colorline_Stops.
|
||||
*
|
||||
* p ::
|
||||
* An opaque pointer into 'COLR' table data. The caller must set this
|
||||
* to `NULL` before the first call of @FT_Get_Colorline_Stops.
|
||||
* An opaque pointer into 'COLR' table data. Set by @FT_Get_Paint.
|
||||
* Updated by @FT_Get_Colorline_Stops.
|
||||
*
|
||||
* read_variable ::
|
||||
* A boolean keeping track of whether variable color lines are to be
|
||||
* read. Set by @FT_Get_Paint.
|
||||
*
|
||||
* @since:
|
||||
* 2.11 -- **currently experimental only!** There might be changes
|
||||
|
@ -549,6 +554,8 @@ FT_BEGIN_HEADER
|
|||
|
||||
FT_Byte* p;
|
||||
|
||||
FT_Bool read_variable;
|
||||
|
||||
} FT_ColorStopIterator;
|
||||
|
||||
|
||||
|
@ -592,7 +599,8 @@ FT_BEGIN_HEADER
|
|||
*
|
||||
* @fields:
|
||||
* stop_offset ::
|
||||
* The stop offset between 0 and 1 along the gradient.
|
||||
* The stop offset along the gradient, expressed as a 16.16 fixed-point
|
||||
* coordinate.
|
||||
*
|
||||
* color ::
|
||||
* The color information for this stop, see @FT_ColorIndex.
|
||||
|
@ -604,7 +612,7 @@ FT_BEGIN_HEADER
|
|||
*/
|
||||
typedef struct FT_ColorStop_
|
||||
{
|
||||
FT_F2Dot14 stop_offset;
|
||||
FT_Fixed stop_offset;
|
||||
FT_ColorIndex color;
|
||||
|
||||
} FT_ColorStop;
|
||||
|
|
|
@ -214,9 +214,9 @@ FT_BEGIN_HEADER
|
|||
* itself, it is possible to control its behaviour with @FT_Property_Set
|
||||
* and @FT_Property_Get.
|
||||
*
|
||||
* The TrueType driver's module name is 'truetype'; a single property
|
||||
* @interpreter-version is available, as documented in the @properties
|
||||
* section.
|
||||
* The TrueType driver's module name is 'truetype'; two properties are
|
||||
* available, @interpreter-version and @TEMPORARY-enable-variable-colrv1, as
|
||||
* documented in the @properties section.
|
||||
*
|
||||
* To help understand the differences between interpreter versions, we
|
||||
* introduce a list of definitions, kindly provided by Greg Hitchcock.
|
||||
|
@ -820,6 +820,48 @@ FT_BEGIN_HEADER
|
|||
* 2.5
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* @property:
|
||||
* TEMPORARY-enable-variable-colrv1
|
||||
*
|
||||
* @description:
|
||||
* Controls experimental support of variable COLRv1 and whether the COLRv1
|
||||
* implementation should take into account variation deltas. This tells the
|
||||
* COLRv1 API methods whether they should read from the font and apply
|
||||
* variable deltas to COLRv1 properties. The feature is default off. When
|
||||
* on, variable COLRv1 deltas are applied for COLRv1 features for which they
|
||||
* are already implemented. When off, variable deltas are ignored even if
|
||||
* the respective PaintVar* table may already be understood.
|
||||
*
|
||||
* WARNING: Temporary flag during development of variable COLRv1. This flag
|
||||
* will be removed, do not rely on it. Full variable COLRv1 support will be
|
||||
* announced separately.
|
||||
*
|
||||
* @note:
|
||||
* This property cannot be set via the `FREETYPE_PROPERTIES` environment
|
||||
* variable.
|
||||
*
|
||||
* @example:
|
||||
* The following example code demonstrates how to enable variable
|
||||
* COLRv1.
|
||||
*
|
||||
* ```
|
||||
* FT_Library library;
|
||||
* FT_Face face;
|
||||
* FT_Bool variable_colrv1 = TRUE;
|
||||
*
|
||||
*
|
||||
* FT_Init_FreeType( &library );
|
||||
*
|
||||
* FT_Property_Set( library, "truetype",
|
||||
* "TEMPORARY-enable-variable-colrv1",
|
||||
* &variable_colr_v1 );
|
||||
* ```
|
||||
*
|
||||
* @since:
|
||||
* 2.12.2
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
|
|
|
@ -398,6 +398,10 @@ FT_BEGIN_HEADER
|
|||
* FreeType error code. 0~means success.
|
||||
*
|
||||
* @note:
|
||||
* The design coordinates are 16.16 fractional values for TrueType GX and
|
||||
* OpenType variation fonts. For Adobe MM fonts, the values are
|
||||
* integers.
|
||||
*
|
||||
* [Since 2.8.1] To reset all axes to the default values, call the
|
||||
* function with `num_coords` set to zero and `coords` set to `NULL`.
|
||||
* [Since 2.9] 'Default values' means the currently selected named
|
||||
|
@ -440,6 +444,11 @@ FT_BEGIN_HEADER
|
|||
* @return:
|
||||
* FreeType error code. 0~means success.
|
||||
*
|
||||
* @note:
|
||||
* The design coordinates are 16.16 fractional values for TrueType GX and
|
||||
* OpenType variation fonts. For Adobe MM fonts, the values are
|
||||
* integers.
|
||||
*
|
||||
* @since:
|
||||
* 2.7.1
|
||||
*/
|
||||
|
@ -471,9 +480,9 @@ FT_BEGIN_HEADER
|
|||
* the number of axes, use default values for the remaining axes.
|
||||
*
|
||||
* coords ::
|
||||
* The design coordinates array (each element must be between 0 and 1.0
|
||||
* for Adobe MM fonts, and between -1.0 and 1.0 for TrueType GX and
|
||||
* OpenType variation fonts).
|
||||
* The design coordinates array. Each element is a 16.16 fractional
|
||||
* value and must be between 0 and 1.0 for Adobe MM fonts, and between
|
||||
* -1.0 and 1.0 for TrueType GX and OpenType variation fonts.
|
||||
*
|
||||
* @return:
|
||||
* FreeType error code. 0~means success.
|
||||
|
@ -518,7 +527,7 @@ FT_BEGIN_HEADER
|
|||
*
|
||||
* @output:
|
||||
* coords ::
|
||||
* The normalized blend coordinates array.
|
||||
* The normalized blend coordinates array (as 16.16 fractional values).
|
||||
*
|
||||
* @return:
|
||||
* FreeType error code. 0~means success.
|
||||
|
|
|
@ -293,7 +293,7 @@ FT_BEGIN_HEADER
|
|||
*
|
||||
* miter_limit ::
|
||||
* The maximum reciprocal sine of half-angle at the miter join,
|
||||
* expressed as 16.16 fixed point value.
|
||||
* expressed as 16.16 fixed-point value.
|
||||
*
|
||||
* @note:
|
||||
* The `radius` is expressed in the same units as the outline
|
||||
|
|
|
@ -229,7 +229,8 @@ FT_BEGIN_HEADER
|
|||
* A handle to the source stream.
|
||||
*
|
||||
* offset ::
|
||||
* The offset of read in stream (always from start).
|
||||
* The offset from the start of the stream to seek to if this is a seek
|
||||
* operation (see note).
|
||||
*
|
||||
* buffer ::
|
||||
* The address of the read buffer.
|
||||
|
@ -241,8 +242,13 @@ FT_BEGIN_HEADER
|
|||
* The number of bytes effectively read by the stream.
|
||||
*
|
||||
* @note:
|
||||
* This function might be called to perform a seek or skip operation with
|
||||
* a `count` of~0. A non-zero return value then indicates an error.
|
||||
* This function performs a seek *or* a read operation depending on the
|
||||
* argument values. If `count` is zero, the operation is a seek to
|
||||
* `offset` bytes. If `count` is >~0, the operation is a read of `count`
|
||||
* bytes from the current position in the stream, and the `offset` value
|
||||
* should be ignored.
|
||||
*
|
||||
* For seek operations, a non-zero return value indicates an error.
|
||||
*
|
||||
*/
|
||||
typedef unsigned long
|
||||
|
|
|
@ -315,7 +315,7 @@ FT_BEGIN_HEADER
|
|||
/* The normal stack then points to these values instead of the DICT */
|
||||
/* because all other operators in Private DICT clear the stack. */
|
||||
/* `blend_stack' could be cleared at each operator other than blend. */
|
||||
/* Blended values are stored as 5-byte fixed point values. */
|
||||
/* Blended values are stored as 5-byte fixed-point values. */
|
||||
|
||||
FT_Byte* blend_stack; /* base of stack allocation */
|
||||
FT_Byte* blend_top; /* first empty slot */
|
||||
|
|
|
@ -278,6 +278,40 @@ FT_BEGIN_HEADER
|
|||
FT_Long c );
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* @function:
|
||||
* FT_MulAddFix
|
||||
*
|
||||
* @description:
|
||||
* Compute `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`, where `s[n]` is
|
||||
* usually a 16.16 scalar.
|
||||
*
|
||||
* @input:
|
||||
* s ::
|
||||
* The array of scalars.
|
||||
* f ::
|
||||
* The array of factors.
|
||||
* count ::
|
||||
* The number of entries in the array.
|
||||
*
|
||||
* @return:
|
||||
* The result of `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`.
|
||||
*
|
||||
* @note:
|
||||
* This function is currently used for the scaled delta computation of
|
||||
* variation stores. It internally uses 64-bit data types when
|
||||
* available, otherwise it emulates 64-bit math by using 32-bit
|
||||
* operations, which produce a correct result but most likely at a slower
|
||||
* performance in comparison to the implementation base on `int64_t`.
|
||||
*
|
||||
*/
|
||||
FT_BASE( FT_Int32 )
|
||||
FT_MulAddFix( FT_Fixed* s,
|
||||
FT_Int32* f,
|
||||
FT_UInt count );
|
||||
|
||||
|
||||
/*
|
||||
* A variant of FT_Matrix_Multiply which scales its result afterwards. The
|
||||
* idea is that both `a' and `b' are scaled by factors of 10 so that the
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
/****************************************************************************
|
||||
*
|
||||
* 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 FT_Int32 FT_ItemVarDelta;
|
||||
|
||||
typedef struct GX_ItemVarDataRec_
|
||||
{
|
||||
FT_UInt itemCount; /* number of delta sets per item */
|
||||
FT_UInt regionIdxCount; /* number of region indices */
|
||||
FT_UInt* regionIndices; /* array of `regionCount' indices; */
|
||||
/* these index `varRegionList' */
|
||||
FT_ItemVarDelta* deltaSet; /* array of `itemCount' deltas */
|
||||
/* use `innerIndex' for this array */
|
||||
|
||||
} 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 */
|
|
@ -238,42 +238,42 @@ FT_BEGIN_HEADER
|
|||
#define FT_NEXT_BYTE( buffer ) \
|
||||
( (unsigned char)*buffer++ )
|
||||
|
||||
#define FT_NEXT_SHORT( buffer ) \
|
||||
( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
|
||||
#define FT_NEXT_SHORT( buffer ) \
|
||||
( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) )
|
||||
|
||||
#define FT_NEXT_USHORT( buffer ) \
|
||||
( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
|
||||
#define FT_NEXT_USHORT( buffer ) \
|
||||
( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) )
|
||||
|
||||
#define FT_NEXT_OFF3( buffer ) \
|
||||
( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
|
||||
#define FT_NEXT_OFF3( buffer ) \
|
||||
( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) )
|
||||
|
||||
#define FT_NEXT_UOFF3( buffer ) \
|
||||
( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
|
||||
#define FT_NEXT_UOFF3( buffer ) \
|
||||
( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) )
|
||||
|
||||
#define FT_NEXT_LONG( buffer ) \
|
||||
( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
|
||||
#define FT_NEXT_LONG( buffer ) \
|
||||
( buffer += 4, FT_PEEK_LONG( buffer - 4 ) )
|
||||
|
||||
#define FT_NEXT_ULONG( buffer ) \
|
||||
( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
|
||||
#define FT_NEXT_ULONG( buffer ) \
|
||||
( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) )
|
||||
|
||||
|
||||
#define FT_NEXT_SHORT_LE( buffer ) \
|
||||
( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
|
||||
#define FT_NEXT_SHORT_LE( buffer ) \
|
||||
( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) )
|
||||
|
||||
#define FT_NEXT_USHORT_LE( buffer ) \
|
||||
( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
|
||||
#define FT_NEXT_USHORT_LE( buffer ) \
|
||||
( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) )
|
||||
|
||||
#define FT_NEXT_OFF3_LE( buffer ) \
|
||||
( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
|
||||
#define FT_NEXT_OFF3_LE( buffer ) \
|
||||
( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) )
|
||||
|
||||
#define FT_NEXT_UOFF3_LE( buffer ) \
|
||||
( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
|
||||
#define FT_NEXT_UOFF3_LE( buffer ) \
|
||||
( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) )
|
||||
|
||||
#define FT_NEXT_LONG_LE( buffer ) \
|
||||
( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
|
||||
#define FT_NEXT_LONG_LE( buffer ) \
|
||||
( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) )
|
||||
|
||||
#define FT_NEXT_ULONG_LE( buffer ) \
|
||||
( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
|
||||
#define FT_NEXT_ULONG_LE( buffer ) \
|
||||
( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) )
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -307,17 +307,17 @@ FT_BEGIN_HEADER
|
|||
|
||||
#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetByte, FT_Char )
|
||||
#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetByte, FT_Byte )
|
||||
#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
|
||||
#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
|
||||
#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
|
||||
#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
|
||||
#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
|
||||
#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
|
||||
#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Int16 )
|
||||
#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UInt16 )
|
||||
#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_UInt32 )
|
||||
#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Int32 )
|
||||
#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
|
||||
#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
|
||||
|
||||
#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
|
||||
#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
|
||||
#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
|
||||
#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
|
||||
#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Int32 )
|
||||
#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UInt32 )
|
||||
#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Int32 )
|
||||
#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_UInt32 )
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -334,16 +334,16 @@ FT_BEGIN_HEADER
|
|||
*/
|
||||
#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Byte, var )
|
||||
#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Char, var )
|
||||
#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
|
||||
#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
|
||||
#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
|
||||
#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
|
||||
#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
|
||||
#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Int16, var )
|
||||
#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UInt16, var )
|
||||
#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_UInt32, var )
|
||||
#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Int32, var )
|
||||
#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_UInt32, var )
|
||||
|
||||
#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
|
||||
#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
|
||||
#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
|
||||
#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
|
||||
#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Int16, var )
|
||||
#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UInt16, var )
|
||||
#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Int32, var )
|
||||
#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_UInt32, var )
|
||||
|
||||
|
||||
#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
|
||||
|
@ -459,23 +459,23 @@ FT_BEGIN_HEADER
|
|||
FT_Stream_GetByte( FT_Stream stream );
|
||||
|
||||
/* read a 16-bit big-endian unsigned integer from an entered frame */
|
||||
FT_BASE( FT_UShort )
|
||||
FT_BASE( FT_UInt16 )
|
||||
FT_Stream_GetUShort( FT_Stream stream );
|
||||
|
||||
/* read a 24-bit big-endian unsigned integer from an entered frame */
|
||||
FT_BASE( FT_ULong )
|
||||
FT_BASE( FT_UInt32 )
|
||||
FT_Stream_GetUOffset( FT_Stream stream );
|
||||
|
||||
/* read a 32-bit big-endian unsigned integer from an entered frame */
|
||||
FT_BASE( FT_ULong )
|
||||
FT_BASE( FT_UInt32 )
|
||||
FT_Stream_GetULong( FT_Stream stream );
|
||||
|
||||
/* read a 16-bit little-endian unsigned integer from an entered frame */
|
||||
FT_BASE( FT_UShort )
|
||||
FT_BASE( FT_UInt16 )
|
||||
FT_Stream_GetUShortLE( FT_Stream stream );
|
||||
|
||||
/* read a 32-bit little-endian unsigned integer from an entered frame */
|
||||
FT_BASE( FT_ULong )
|
||||
FT_BASE( FT_UInt32 )
|
||||
FT_Stream_GetULongLE( FT_Stream stream );
|
||||
|
||||
|
||||
|
@ -485,7 +485,7 @@ FT_BEGIN_HEADER
|
|||
FT_Error* error );
|
||||
|
||||
/* read a 16-bit big-endian unsigned integer from a stream */
|
||||
FT_BASE( FT_UShort )
|
||||
FT_BASE( FT_UInt16 )
|
||||
FT_Stream_ReadUShort( FT_Stream stream,
|
||||
FT_Error* error );
|
||||
|
||||
|
@ -495,17 +495,17 @@ FT_BEGIN_HEADER
|
|||
FT_Error* error );
|
||||
|
||||
/* read a 32-bit big-endian integer from a stream */
|
||||
FT_BASE( FT_ULong )
|
||||
FT_BASE( FT_UInt32 )
|
||||
FT_Stream_ReadULong( FT_Stream stream,
|
||||
FT_Error* error );
|
||||
|
||||
/* read a 16-bit little-endian unsigned integer from a stream */
|
||||
FT_BASE( FT_UShort )
|
||||
FT_BASE( FT_UInt16 )
|
||||
FT_Stream_ReadUShortLE( FT_Stream stream,
|
||||
FT_Error* error );
|
||||
|
||||
/* read a 32-bit little-endian unsigned integer from a stream */
|
||||
FT_BASE( FT_ULong )
|
||||
FT_BASE( FT_UInt32 )
|
||||
FT_Stream_ReadULongLE( FT_Stream stream,
|
||||
FT_Error* error );
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* The FreeType Multiple Masters and GX var services (specification).
|
||||
*
|
||||
* Copyright (C) 2003-2022 by
|
||||
* David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
* David Turner, Robert Wilhelm, Werner Lemberg, 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
|
||||
|
@ -20,6 +20,7 @@
|
|||
#define SVMM_H_
|
||||
|
||||
#include <freetype/internal/ftserv.h>
|
||||
#include <freetype/internal/ftmmtypes.h>
|
||||
|
||||
|
||||
FT_BEGIN_HEADER
|
||||
|
@ -96,53 +97,94 @@ FT_BEGIN_HEADER
|
|||
FT_UInt* len,
|
||||
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_ItemVarDelta
|
||||
(*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_Get_MM_Func get_mm;
|
||||
FT_Set_MM_Design_Func set_mm_design;
|
||||
FT_Set_MM_Blend_Func set_mm_blend;
|
||||
FT_Get_MM_Blend_Func get_mm_blend;
|
||||
FT_Get_MM_Var_Func get_mm_var;
|
||||
FT_Set_Var_Design_Func set_var_design;
|
||||
FT_Get_Var_Design_Func get_var_design;
|
||||
FT_Set_Instance_Func set_instance;
|
||||
FT_Set_MM_WeightVector_Func set_mm_weightvector;
|
||||
FT_Get_MM_WeightVector_Func get_mm_weightvector;
|
||||
FT_Get_MM_Func get_mm;
|
||||
FT_Set_MM_Design_Func set_mm_design;
|
||||
FT_Set_MM_Blend_Func set_mm_blend;
|
||||
FT_Get_MM_Blend_Func get_mm_blend;
|
||||
FT_Get_MM_Var_Func get_mm_var;
|
||||
FT_Set_Var_Design_Func set_var_design;
|
||||
FT_Get_Var_Design_Func get_var_design;
|
||||
FT_Set_Instance_Func set_instance;
|
||||
FT_Set_MM_WeightVector_Func set_mm_weightvector;
|
||||
FT_Get_MM_WeightVector_Func get_mm_weightvector;
|
||||
|
||||
/* for internal use; only needed for code sharing between modules */
|
||||
FT_Get_Var_Blend_Func get_var_blend;
|
||||
FT_Done_Blend_Func done_blend;
|
||||
FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map;
|
||||
FT_Var_Load_Item_Var_Store_Func load_item_var_store;
|
||||
FT_Var_Get_Item_Delta_Func get_item_delta;
|
||||
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_, \
|
||||
get_mm_, \
|
||||
set_mm_design_, \
|
||||
set_mm_blend_, \
|
||||
get_mm_blend_, \
|
||||
get_mm_var_, \
|
||||
set_var_design_, \
|
||||
get_var_design_, \
|
||||
set_instance_, \
|
||||
set_weightvector_, \
|
||||
get_weightvector_, \
|
||||
get_var_blend_, \
|
||||
done_blend_ ) \
|
||||
static const FT_Service_MultiMastersRec class_ = \
|
||||
{ \
|
||||
get_mm_, \
|
||||
set_mm_design_, \
|
||||
set_mm_blend_, \
|
||||
get_mm_blend_, \
|
||||
get_mm_var_, \
|
||||
set_var_design_, \
|
||||
get_var_design_, \
|
||||
set_instance_, \
|
||||
set_weightvector_, \
|
||||
get_weightvector_, \
|
||||
get_var_blend_, \
|
||||
done_blend_ \
|
||||
#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
|
||||
get_mm_, \
|
||||
set_mm_design_, \
|
||||
set_mm_blend_, \
|
||||
get_mm_blend_, \
|
||||
get_mm_var_, \
|
||||
set_var_design_, \
|
||||
get_var_design_, \
|
||||
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_ ) \
|
||||
static const FT_Service_MultiMastersRec class_ = \
|
||||
{ \
|
||||
get_mm_, \
|
||||
set_mm_design_, \
|
||||
set_mm_blend_, \
|
||||
get_mm_blend_, \
|
||||
get_mm_var_, \
|
||||
set_var_design_, \
|
||||
get_var_design_, \
|
||||
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_ \
|
||||
};
|
||||
|
||||
/* */
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
project('freetype2', 'c',
|
||||
meson_version: '>= 0.55.0',
|
||||
default_options: ['default_library=both'],
|
||||
version: run_command('builds/meson/extract_freetype_version.py',
|
||||
'include/freetype/freetype.h',
|
||||
check: true).stdout().strip(),
|
||||
|
@ -336,7 +335,8 @@ endif
|
|||
# Harfbuzz support
|
||||
harfbuzz_dep = dependency('harfbuzz',
|
||||
version: '>= 2.0.0',
|
||||
required: get_option('harfbuzz'))
|
||||
required: get_option('harfbuzz'),
|
||||
default_options: ['freetype=disabled'])
|
||||
|
||||
if harfbuzz_dep.found()
|
||||
ftoption_command += ['--enable=FT_CONFIG_OPTION_USE_HARFBUZZ']
|
||||
|
|
|
@ -1085,4 +1085,71 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_Int32 )
|
||||
FT_MulAddFix( FT_Fixed* s,
|
||||
FT_Int32* f,
|
||||
FT_UInt count )
|
||||
{
|
||||
FT_UInt i;
|
||||
FT_Int64 temp;
|
||||
#ifndef FT_INT64
|
||||
FT_Int64 halfUnit;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef FT_INT64
|
||||
temp = 0;
|
||||
|
||||
for ( i = 0; i < count; ++i )
|
||||
temp += (FT_Int64)s[i] * f[i];
|
||||
|
||||
return ( temp + 0x8000 ) >> 16;
|
||||
#else
|
||||
temp.hi = 0;
|
||||
temp.lo = 0;
|
||||
|
||||
for ( i = 0; i < count; ++i )
|
||||
{
|
||||
FT_Int64 multResult;
|
||||
|
||||
FT_Int sign = 1;
|
||||
FT_UInt32 carry = 0;
|
||||
|
||||
FT_UInt32 scalar;
|
||||
FT_UInt32 factor;
|
||||
|
||||
|
||||
scalar = (FT_UInt32)s[i];
|
||||
factor = (FT_UInt32)f[i];
|
||||
|
||||
FT_MOVE_SIGN( s[i], scalar, sign );
|
||||
FT_MOVE_SIGN( f[i], factor, sign );
|
||||
|
||||
ft_multo64( scalar, factor, &multResult );
|
||||
|
||||
if ( sign < 0 )
|
||||
{
|
||||
/* Emulated `FT_Int64` negation. */
|
||||
carry = ( multResult.lo == 0 );
|
||||
|
||||
multResult.lo = ~multResult.lo + 1;
|
||||
multResult.hi = ~multResult.hi + carry;
|
||||
}
|
||||
|
||||
FT_Add64( &temp, &multResult, &temp );
|
||||
}
|
||||
|
||||
/* Round value. */
|
||||
halfUnit.hi = 0;
|
||||
halfUnit.lo = 0x8000;
|
||||
FT_Add64( &temp, &halfUnit, &temp );
|
||||
|
||||
return (FT_Int32)( ( (FT_Int32)( temp.hi & 0xFFFF ) << 16 ) |
|
||||
( temp.lo >> 16 ) );
|
||||
|
||||
#endif /* !FT_INT64 */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -217,7 +217,7 @@
|
|||
|
||||
error = FT_GlyphLoader_CreateExtra( loader );
|
||||
if ( error )
|
||||
return error;
|
||||
goto Exit;
|
||||
|
||||
/* check points & tags */
|
||||
new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points +
|
||||
|
@ -229,7 +229,10 @@
|
|||
new_max = FT_PAD_CEIL( new_max, 8 );
|
||||
|
||||
if ( new_max > FT_OUTLINE_POINTS_MAX )
|
||||
return FT_THROW( Array_Too_Large );
|
||||
{
|
||||
error = FT_THROW( Array_Too_Large );
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
|
||||
FT_RENEW_ARRAY( base->tags, old_max, new_max ) )
|
||||
|
@ -254,7 +257,7 @@
|
|||
|
||||
error = FT_GlyphLoader_CreateExtra( loader );
|
||||
if ( error )
|
||||
return error;
|
||||
goto Exit;
|
||||
|
||||
/* check contours */
|
||||
old_max = loader->max_contours;
|
||||
|
@ -265,7 +268,10 @@
|
|||
new_max = FT_PAD_CEIL( new_max, 4 );
|
||||
|
||||
if ( new_max > FT_OUTLINE_CONTOURS_MAX )
|
||||
return FT_THROW( Array_Too_Large );
|
||||
{
|
||||
error = FT_THROW( Array_Too_Large );
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
|
||||
goto Exit;
|
||||
|
|
|
@ -314,7 +314,7 @@
|
|||
NULL, NULL, NULL ) )
|
||||
return ( OSType ) 0;
|
||||
|
||||
return ((FInfo *)(info.finderInfo))->fdType;
|
||||
return ( (FInfo *)( info.finderInfo ) )->fdType;
|
||||
}
|
||||
|
||||
|
||||
|
@ -462,7 +462,7 @@
|
|||
|
||||
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;
|
||||
}
|
||||
if ( style->indexes[face_index] > 1 &&
|
||||
|
|
|
@ -605,7 +605,7 @@
|
|||
|
||||
|
||||
FT_FREE( doc->svg_document );
|
||||
slot->internal->load_flags &= ~FT_GLYPH_OWN_GZIP_SVG;
|
||||
slot->internal->flags &= ~FT_GLYPH_OWN_GZIP_SVG;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2215,7 +2215,8 @@
|
|||
if ( FT_QALLOC( sfnt_data, rlen ) )
|
||||
return error;
|
||||
error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, (FT_ULong)rlen );
|
||||
if ( error ) {
|
||||
if ( error )
|
||||
{
|
||||
FT_FREE( sfnt_data );
|
||||
goto Exit;
|
||||
}
|
||||
|
|
|
@ -402,17 +402,17 @@
|
|||
FT_Long *result_offset );
|
||||
|
||||
|
||||
CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
|
||||
ft_raccess_guess_rec)
|
||||
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(darwin_ufs_export, darwin_ufs_export)
|
||||
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(vfat, vfat)
|
||||
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_netatalk, linux_netatalk)
|
||||
CONST_FT_RFORK_RULE_ARRAY_BEGIN( ft_raccess_guess_table,
|
||||
ft_raccess_guess_rec )
|
||||
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( darwin_ufs_export, darwin_ufs_export )
|
||||
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( vfat, vfat )
|
||||
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_netatalk, linux_netatalk )
|
||||
CONST_FT_RFORK_RULE_ARRAY_END
|
||||
|
||||
|
||||
|
|
|
@ -363,11 +363,11 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_UShort )
|
||||
FT_BASE_DEF( FT_UInt16 )
|
||||
FT_Stream_GetUShort( FT_Stream stream )
|
||||
{
|
||||
FT_Byte* p;
|
||||
FT_UShort result;
|
||||
FT_UInt16 result;
|
||||
|
||||
|
||||
FT_ASSERT( stream && stream->cursor );
|
||||
|
@ -382,11 +382,11 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_UShort )
|
||||
FT_BASE_DEF( FT_UInt16 )
|
||||
FT_Stream_GetUShortLE( FT_Stream stream )
|
||||
{
|
||||
FT_Byte* p;
|
||||
FT_UShort result;
|
||||
FT_UInt16 result;
|
||||
|
||||
|
||||
FT_ASSERT( stream && stream->cursor );
|
||||
|
@ -401,11 +401,11 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_ULong )
|
||||
FT_BASE_DEF( FT_UInt32 )
|
||||
FT_Stream_GetUOffset( FT_Stream stream )
|
||||
{
|
||||
FT_Byte* p;
|
||||
FT_ULong result;
|
||||
FT_UInt32 result;
|
||||
|
||||
|
||||
FT_ASSERT( stream && stream->cursor );
|
||||
|
@ -419,11 +419,11 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_ULong )
|
||||
FT_BASE_DEF( FT_UInt32 )
|
||||
FT_Stream_GetULong( FT_Stream stream )
|
||||
{
|
||||
FT_Byte* p;
|
||||
FT_ULong result;
|
||||
FT_UInt32 result;
|
||||
|
||||
|
||||
FT_ASSERT( stream && stream->cursor );
|
||||
|
@ -437,11 +437,11 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_ULong )
|
||||
FT_BASE_DEF( FT_UInt32 )
|
||||
FT_Stream_GetULongLE( FT_Stream stream )
|
||||
{
|
||||
FT_Byte* p;
|
||||
FT_ULong result;
|
||||
FT_UInt32 result;
|
||||
|
||||
|
||||
FT_ASSERT( stream && stream->cursor );
|
||||
|
@ -493,13 +493,13 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_UShort )
|
||||
FT_BASE_DEF( FT_UInt16 )
|
||||
FT_Stream_ReadUShort( FT_Stream stream,
|
||||
FT_Error* error )
|
||||
{
|
||||
FT_Byte reads[2];
|
||||
FT_Byte* p;
|
||||
FT_UShort result = 0;
|
||||
FT_UInt16 result = 0;
|
||||
|
||||
|
||||
FT_ASSERT( stream );
|
||||
|
@ -538,13 +538,13 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_UShort )
|
||||
FT_BASE_DEF( FT_UInt16 )
|
||||
FT_Stream_ReadUShortLE( FT_Stream stream,
|
||||
FT_Error* error )
|
||||
{
|
||||
FT_Byte reads[2];
|
||||
FT_Byte* p;
|
||||
FT_UShort result = 0;
|
||||
FT_UInt16 result = 0;
|
||||
|
||||
|
||||
FT_ASSERT( stream );
|
||||
|
@ -628,13 +628,13 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_ULong )
|
||||
FT_BASE_DEF( FT_UInt32 )
|
||||
FT_Stream_ReadULong( FT_Stream stream,
|
||||
FT_Error* error )
|
||||
{
|
||||
FT_Byte reads[4];
|
||||
FT_Byte* p;
|
||||
FT_ULong result = 0;
|
||||
FT_UInt32 result = 0;
|
||||
|
||||
|
||||
FT_ASSERT( stream );
|
||||
|
@ -673,13 +673,13 @@
|
|||
}
|
||||
|
||||
|
||||
FT_BASE_DEF( FT_ULong )
|
||||
FT_BASE_DEF( FT_UInt32 )
|
||||
FT_Stream_ReadULongLE( FT_Stream stream,
|
||||
FT_Error* error )
|
||||
{
|
||||
FT_Byte reads[4];
|
||||
FT_Byte* p;
|
||||
FT_ULong result = 0;
|
||||
FT_UInt32 result = 0;
|
||||
|
||||
|
||||
FT_ASSERT( stream );
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
#include<windows.h>
|
||||
|
||||
#define FT_VERSION 2,12,0,0
|
||||
#define FT_VERSION_STR "2.12.0"
|
||||
#define FT_VERSION 2,12,1,0
|
||||
#define FT_VERSION_STR "2.12.1"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION FT_VERSION
|
||||
|
|
|
@ -57,8 +57,9 @@
|
|||
/* it is better to use FreeType memory routines instead of raw
|
||||
'malloc/free' */
|
||||
|
||||
typedef void *(* alloc_func)(void*, int, int);
|
||||
typedef void (* free_func)(void*, void*);
|
||||
typedef void* (*alloc_func)( void*, int, int );
|
||||
typedef void (*free_func) ( void*, void* );
|
||||
|
||||
|
||||
static void*
|
||||
ft_bzip2_alloc( FT_Memory memory,
|
||||
|
|
|
@ -210,7 +210,7 @@ FT_BEGIN_HEADER
|
|||
#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \
|
||||
FT_BEGIN_STMNT \
|
||||
FTC_Node *_bucket, *_pnode, _node; \
|
||||
FTC_Cache _cache = FTC_CACHE(cache); \
|
||||
FTC_Cache _cache = FTC_CACHE( cache ); \
|
||||
FT_Offset _hash = (FT_Offset)(hash); \
|
||||
FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \
|
||||
FT_Bool _list_changed = FALSE; \
|
||||
|
|
|
@ -140,8 +140,8 @@ FT_BEGIN_HEADER
|
|||
|
||||
} FTC_FamilyRec, *FTC_Family;
|
||||
|
||||
#define FTC_FAMILY(x) ( (FTC_Family)(x) )
|
||||
#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) )
|
||||
#define FTC_FAMILY( x ) ( (FTC_Family)(x) )
|
||||
#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) )
|
||||
|
||||
|
||||
typedef struct FTC_GNodeRec_
|
||||
|
@ -245,7 +245,7 @@ FT_BEGIN_HEADER
|
|||
#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(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 ) \
|
||||
( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class )
|
||||
|
||||
|
|
|
@ -51,8 +51,8 @@ FT_BEGIN_HEADER
|
|||
} FTC_INodeRec, *FTC_INode;
|
||||
|
||||
#define FTC_INODE( x ) ( (FTC_INode)( x ) )
|
||||
#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex
|
||||
#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family
|
||||
#define FTC_INODE_GINDEX( x ) FTC_GNODE( x )->gindex
|
||||
#define FTC_INODE_FAMILY( x ) FTC_GNODE( x )->family
|
||||
|
||||
typedef FT_Error
|
||||
(*FTC_IFamily_LoadGlyphFunc)( FTC_Family family,
|
||||
|
@ -72,7 +72,7 @@ FT_BEGIN_HEADER
|
|||
#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(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 */
|
||||
|
|
|
@ -171,7 +171,7 @@
|
|||
sbit->xadvance = (FT_Char)xadvance;
|
||||
sbit->yadvance = (FT_Char)yadvance;
|
||||
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 )
|
||||
{
|
||||
|
|
|
@ -61,7 +61,7 @@ FT_BEGIN_HEADER
|
|||
|
||||
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 ) \
|
||||
FTC_SFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class )
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
|
||||
if ( char_code < 255 )
|
||||
{
|
||||
FT_UInt code = (FT_UInt)(char_code + 1);
|
||||
FT_UInt code = (FT_UInt)( char_code + 1 );
|
||||
|
||||
|
||||
for (;;)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* OpenType font driver implementation (body).
|
||||
*
|
||||
* Copyright (C) 1996-2022 by
|
||||
* David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
* David Turner, Robert Wilhelm, Werner Lemberg, 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
|
||||
|
@ -936,22 +936,103 @@
|
|||
}
|
||||
|
||||
|
||||
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(
|
||||
cff_service_multi_masters,
|
||||
|
||||
(FT_Get_MM_Func) NULL, /* get_mm */
|
||||
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */
|
||||
(FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */
|
||||
(FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */
|
||||
(FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */
|
||||
(FT_Set_Var_Design_Func) cff_set_var_design, /* set_var_design */
|
||||
(FT_Get_Var_Design_Func) cff_get_var_design, /* get_var_design */
|
||||
(FT_Set_Instance_Func) cff_set_instance, /* set_instance */
|
||||
(FT_Set_MM_WeightVector_Func)cff_set_mm_weightvector, /* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)cff_get_mm_weightvector, /* get_mm_weightvector */
|
||||
|
||||
(FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */
|
||||
(FT_Done_Blend_Func) cff_done_blend /* done_blend */
|
||||
(FT_Get_MM_Func) NULL, /* get_mm */
|
||||
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */
|
||||
(FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */
|
||||
(FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */
|
||||
(FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */
|
||||
(FT_Set_Var_Design_Func)cff_set_var_design, /* set_var_design */
|
||||
(FT_Get_Var_Design_Func)cff_get_var_design, /* get_var_design */
|
||||
(FT_Set_Instance_Func) cff_set_instance, /* set_instance */
|
||||
(FT_Set_MM_WeightVector_Func)
|
||||
cff_set_mm_weightvector,
|
||||
/* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)
|
||||
cff_get_mm_weightvector,
|
||||
/* 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 */
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
#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,
|
||||
|
@ -111,7 +111,7 @@
|
|||
#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 );
|
||||
|
@ -370,8 +370,8 @@
|
|||
SFNT_Service sfnt;
|
||||
|
||||
|
||||
if ( size->root.metrics.x_ppem < 1 ||
|
||||
size->root.metrics.y_ppem < 1 )
|
||||
if ( size && (size->root.metrics.x_ppem < 1 ||
|
||||
size->root.metrics.y_ppem < 1 ) )
|
||||
{
|
||||
error = FT_THROW( Invalid_Size_Handle );
|
||||
return error;
|
||||
|
@ -404,6 +404,9 @@
|
|||
&dummy,
|
||||
&advanceY );
|
||||
|
||||
glyph->root.linearHoriAdvance = advanceX;
|
||||
glyph->root.linearVertAdvance = advanceY;
|
||||
|
||||
advanceX =
|
||||
(FT_UShort)FT_MulDiv( advanceX,
|
||||
glyph->root.face->size->metrics.x_ppem,
|
||||
|
|
|
@ -1288,7 +1288,7 @@
|
|||
/* Blended values are written to a different buffer, */
|
||||
/* using reserved operator 255. */
|
||||
/* */
|
||||
/* Blend calculation is done in 16.16 fixed point. */
|
||||
/* Blend calculation is done in 16.16 fixed-point. */
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
cff_blend_doBlend( CFF_SubFont subFont,
|
||||
CFF_Parser parser,
|
||||
|
@ -1364,7 +1364,7 @@
|
|||
FT_UInt32 sum;
|
||||
|
||||
|
||||
/* convert inputs to 16.16 fixed point */
|
||||
/* convert inputs to 16.16 fixed-point */
|
||||
sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000;
|
||||
|
||||
for ( j = 1; j < blend->lenBV; j++ )
|
||||
|
@ -1373,7 +1373,7 @@
|
|||
/* point parser stack to new value on blend_stack */
|
||||
parser->stack[i + base] = subFont->blend_top;
|
||||
|
||||
/* Push blended result as Type 2 5-byte fixed point number. This */
|
||||
/* Push blended result as Type 2 5-byte fixed-point number. This */
|
||||
/* will not conflict with actual DICTs because 255 is a reserved */
|
||||
/* opcode in both CFF and CFF2 DICTs. See `cff_parse_num' for */
|
||||
/* decode of this, which rounds to an integer. */
|
||||
|
|
|
@ -530,7 +530,7 @@
|
|||
|
||||
else if ( **d == 255 )
|
||||
{
|
||||
/* 16.16 fixed point is used internally for CFF2 blend results. */
|
||||
/* 16.16 fixed-point is used internally for CFF2 blend results. */
|
||||
/* Since these are trusted values, a limit check is not needed. */
|
||||
|
||||
/* After the 255, 4 bytes give the number. */
|
||||
|
|
|
@ -1033,7 +1033,7 @@
|
|||
GXV_NAME_ENTER( "StateArray" );
|
||||
|
||||
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:
|
||||
|
@ -1418,7 +1418,7 @@
|
|||
GXV_NAME_ENTER( "XStateArray" );
|
||||
|
||||
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:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Name: zlib
|
||||
Short Name: zlib
|
||||
URL: http://zlib.net/
|
||||
Version: 1.2.11
|
||||
Version: 1.2.12
|
||||
License: see `zlib.h`
|
||||
|
||||
Description:
|
||||
|
|
1296
src/gzip/crc32.c
1296
src/gzip/crc32.c
File diff suppressed because it is too large
Load Diff
9877
src/gzip/crc32.h
9877
src/gzip/crc32.h
File diff suppressed because it is too large
Load Diff
|
@ -790,6 +790,9 @@
|
|||
if ( err == Z_DATA_ERROR )
|
||||
return FT_THROW( Invalid_Table );
|
||||
|
||||
if ( err == Z_NEED_DICT )
|
||||
return FT_THROW( Invalid_Table );
|
||||
|
||||
return FT_Err_Ok;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* gzguts.h -- zlib internal header definitions for gz* operations
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
|
||||
* Copyright (C) 2004-2019 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
# include <io.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||
#if defined(_WIN32)
|
||||
# define WIDECHAR
|
||||
#endif
|
||||
|
||||
|
@ -190,6 +190,7 @@ typedef struct {
|
|||
/* just for writing */
|
||||
int level; /* compression level */
|
||||
int strategy; /* compression strategy */
|
||||
int reset; /* true if a reset is pending after a Z_FINISH */
|
||||
/* seek request */
|
||||
z_off64_t skip; /* amount to skip (already rewound if backwards) */
|
||||
int seek; /* true if seek request pending */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* infback.c -- inflate using a call-back interface
|
||||
* Copyright (C) 1995-2016 Mark Adler
|
||||
* Copyright (C) 1995-2022 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -477,6 +477,7 @@ int ZEXPORT inflateBack(
|
|||
}
|
||||
Tracev((stderr, "inflate: codes ok\n"));
|
||||
state->mode = LEN;
|
||||
/* fallthrough */
|
||||
|
||||
case LEN:
|
||||
/* use inflate_fast() if we have enough input and output */
|
||||
|
|
|
@ -70,7 +70,7 @@ void ZLIB_INTERNAL inflate_fast(
|
|||
code const FAR *dcode; /* local strm->distcode */
|
||||
unsigned lmask; /* mask for first level of length codes */
|
||||
unsigned dmask; /* mask for first level of distance codes */
|
||||
code here; /* retrieved table entry */
|
||||
code const *here; /* retrieved table entry */
|
||||
unsigned op; /* code bits, operation, extra bits, or */
|
||||
/* window position, window bytes to copy */
|
||||
unsigned len; /* match length, unused bytes */
|
||||
|
@ -107,20 +107,20 @@ void ZLIB_INTERNAL inflate_fast(
|
|||
hold += (unsigned long)(*in++) << bits;
|
||||
bits += 8;
|
||||
}
|
||||
here = lcode[hold & lmask];
|
||||
here = lcode + (hold & lmask);
|
||||
dolen:
|
||||
op = (unsigned)(here.bits);
|
||||
op = (unsigned)(here->bits);
|
||||
hold >>= op;
|
||||
bits -= op;
|
||||
op = (unsigned)(here.op);
|
||||
op = (unsigned)(here->op);
|
||||
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 0x%02x\n", here.val));
|
||||
*out++ = (unsigned char)(here.val);
|
||||
"inflate: literal 0x%02x\n", here->val));
|
||||
*out++ = (unsigned char)(here->val);
|
||||
}
|
||||
else if (op & 16) { /* length base */
|
||||
len = (unsigned)(here.val);
|
||||
len = (unsigned)(here->val);
|
||||
op &= 15; /* number of extra bits */
|
||||
if (op) {
|
||||
if (bits < op) {
|
||||
|
@ -138,14 +138,14 @@ void ZLIB_INTERNAL inflate_fast(
|
|||
hold += (unsigned long)(*in++) << bits;
|
||||
bits += 8;
|
||||
}
|
||||
here = dcode[hold & dmask];
|
||||
here = dcode + (hold & dmask);
|
||||
dodist:
|
||||
op = (unsigned)(here.bits);
|
||||
op = (unsigned)(here->bits);
|
||||
hold >>= op;
|
||||
bits -= op;
|
||||
op = (unsigned)(here.op);
|
||||
op = (unsigned)(here->op);
|
||||
if (op & 16) { /* distance base */
|
||||
dist = (unsigned)(here.val);
|
||||
dist = (unsigned)(here->val);
|
||||
op &= 15; /* number of extra bits */
|
||||
if (bits < op) {
|
||||
hold += (unsigned long)(*in++) << bits;
|
||||
|
@ -264,7 +264,7 @@ void ZLIB_INTERNAL inflate_fast(
|
|||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
else {
|
||||
|
@ -274,7 +274,7 @@ void ZLIB_INTERNAL inflate_fast(
|
|||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
else if (op & 32) { /* end-of-block */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* inflate.c -- zlib decompression
|
||||
* Copyright (C) 1995-2016 Mark Adler
|
||||
* Copyright (C) 1995-2022 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -132,6 +132,7 @@ int ZEXPORT inflateResetKeep(
|
|||
state->mode = HEAD;
|
||||
state->last = 0;
|
||||
state->havedict = 0;
|
||||
state->flags = -1;
|
||||
state->dmax = 32768U;
|
||||
state->head = Z_NULL;
|
||||
state->hold = 0;
|
||||
|
@ -269,7 +270,7 @@ int ZEXPORT inflatePrime(
|
|||
return Z_OK;
|
||||
}
|
||||
|
||||
#endif /* Z_FREETYPE */
|
||||
#endif /* !Z_FREETYPE */
|
||||
|
||||
/*
|
||||
Return state with length and distance decoding tables and index sizes set to
|
||||
|
@ -453,10 +454,10 @@ local int updatewindow(
|
|||
|
||||
/* check function to use adler32() for zlib or crc32() for gzip */
|
||||
#ifdef GUNZIP
|
||||
# define UPDATE(check, buf, len) \
|
||||
# define UPDATE_CHECK(check, buf, len) \
|
||||
(state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
|
||||
#else
|
||||
# define UPDATE(check, buf, len) adler32(check, buf, len)
|
||||
# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len)
|
||||
#endif
|
||||
|
||||
/* check macros for header crc */
|
||||
|
@ -676,7 +677,6 @@ int ZEXPORT inflate(
|
|||
state->mode = FLAGS;
|
||||
break;
|
||||
}
|
||||
state->flags = 0; /* expect zlib header */
|
||||
if (state->head != Z_NULL)
|
||||
state->head->done = -1;
|
||||
if (!(state->wrap & 1) || /* check if zlib header allowed */
|
||||
|
@ -703,6 +703,7 @@ int ZEXPORT inflate(
|
|||
break;
|
||||
}
|
||||
state->dmax = 1U << len;
|
||||
state->flags = 0; /* indicate zlib header */
|
||||
Tracev((stderr, "inflate: zlib header ok\n"));
|
||||
strm->adler = state->check = adler32(0L, Z_NULL, 0);
|
||||
state->mode = hold & 0x200 ? DICTID : TYPE;
|
||||
|
@ -728,6 +729,7 @@ int ZEXPORT inflate(
|
|||
CRC2(state->check, hold);
|
||||
INITBITS();
|
||||
state->mode = TIME;
|
||||
/* fallthrough */
|
||||
case TIME:
|
||||
NEEDBITS(32);
|
||||
if (state->head != Z_NULL)
|
||||
|
@ -736,6 +738,7 @@ int ZEXPORT inflate(
|
|||
CRC4(state->check, hold);
|
||||
INITBITS();
|
||||
state->mode = OS;
|
||||
/* fallthrough */
|
||||
case OS:
|
||||
NEEDBITS(16);
|
||||
if (state->head != Z_NULL) {
|
||||
|
@ -746,6 +749,7 @@ int ZEXPORT inflate(
|
|||
CRC2(state->check, hold);
|
||||
INITBITS();
|
||||
state->mode = EXLEN;
|
||||
/* fallthrough */
|
||||
case EXLEN:
|
||||
if (state->flags & 0x0400) {
|
||||
NEEDBITS(16);
|
||||
|
@ -759,6 +763,7 @@ int ZEXPORT inflate(
|
|||
else if (state->head != Z_NULL)
|
||||
state->head->extra = Z_NULL;
|
||||
state->mode = EXTRA;
|
||||
/* fallthrough */
|
||||
case EXTRA:
|
||||
if (state->flags & 0x0400) {
|
||||
copy = state->length;
|
||||
|
@ -781,6 +786,7 @@ int ZEXPORT inflate(
|
|||
}
|
||||
state->length = 0;
|
||||
state->mode = NAME;
|
||||
/* fallthrough */
|
||||
case NAME:
|
||||
if (state->flags & 0x0800) {
|
||||
if (have == 0) goto inf_leave;
|
||||
|
@ -802,6 +808,7 @@ int ZEXPORT inflate(
|
|||
state->head->name = Z_NULL;
|
||||
state->length = 0;
|
||||
state->mode = COMMENT;
|
||||
/* fallthrough */
|
||||
case COMMENT:
|
||||
if (state->flags & 0x1000) {
|
||||
if (have == 0) goto inf_leave;
|
||||
|
@ -822,6 +829,7 @@ int ZEXPORT inflate(
|
|||
else if (state->head != Z_NULL)
|
||||
state->head->comment = Z_NULL;
|
||||
state->mode = HCRC;
|
||||
/* fallthrough */
|
||||
case HCRC:
|
||||
if (state->flags & 0x0200) {
|
||||
NEEDBITS(16);
|
||||
|
@ -845,6 +853,7 @@ int ZEXPORT inflate(
|
|||
strm->adler = state->check = ZSWAP32(hold);
|
||||
INITBITS();
|
||||
state->mode = DICT;
|
||||
/* fallthrough */
|
||||
case DICT:
|
||||
if (state->havedict == 0) {
|
||||
RESTORE();
|
||||
|
@ -852,8 +861,10 @@ int ZEXPORT inflate(
|
|||
}
|
||||
strm->adler = state->check = adler32(0L, Z_NULL, 0);
|
||||
state->mode = TYPE;
|
||||
/* fallthrough */
|
||||
case TYPE:
|
||||
if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
|
||||
/* fallthrough */
|
||||
case TYPEDO:
|
||||
if (state->last) {
|
||||
BYTEBITS();
|
||||
|
@ -904,8 +915,10 @@ int ZEXPORT inflate(
|
|||
INITBITS();
|
||||
state->mode = COPY_;
|
||||
if (flush == Z_TREES) goto inf_leave;
|
||||
/* fallthrough */
|
||||
case COPY_:
|
||||
state->mode = COPY;
|
||||
/* fallthrough */
|
||||
case COPY:
|
||||
copy = state->length;
|
||||
if (copy) {
|
||||
|
@ -941,6 +954,7 @@ int ZEXPORT inflate(
|
|||
Tracev((stderr, "inflate: table sizes ok\n"));
|
||||
state->have = 0;
|
||||
state->mode = LENLENS;
|
||||
/* fallthrough */
|
||||
case LENLENS:
|
||||
while (state->have < state->ncode) {
|
||||
NEEDBITS(3);
|
||||
|
@ -962,6 +976,7 @@ int ZEXPORT inflate(
|
|||
Tracev((stderr, "inflate: code lengths ok\n"));
|
||||
state->have = 0;
|
||||
state->mode = CODELENS;
|
||||
/* fallthrough */
|
||||
case CODELENS:
|
||||
while (state->have < state->nlen + state->ndist) {
|
||||
for (;;) {
|
||||
|
@ -1045,8 +1060,10 @@ int ZEXPORT inflate(
|
|||
Tracev((stderr, "inflate: codes ok\n"));
|
||||
state->mode = LEN_;
|
||||
if (flush == Z_TREES) goto inf_leave;
|
||||
/* fallthrough */
|
||||
case LEN_:
|
||||
state->mode = LEN;
|
||||
/* fallthrough */
|
||||
case LEN:
|
||||
if (have >= 6 && left >= 258) {
|
||||
RESTORE();
|
||||
|
@ -1096,6 +1113,7 @@ int ZEXPORT inflate(
|
|||
}
|
||||
state->extra = (unsigned)(here.op) & 15;
|
||||
state->mode = LENEXT;
|
||||
/* fallthrough */
|
||||
case LENEXT:
|
||||
if (state->extra) {
|
||||
NEEDBITS(state->extra);
|
||||
|
@ -1106,6 +1124,7 @@ int ZEXPORT inflate(
|
|||
Tracevv((stderr, "inflate: length %u\n", state->length));
|
||||
state->was = state->length;
|
||||
state->mode = DIST;
|
||||
/* fallthrough */
|
||||
case DIST:
|
||||
for (;;) {
|
||||
here = state->distcode[BITS(state->distbits)];
|
||||
|
@ -1133,6 +1152,7 @@ int ZEXPORT inflate(
|
|||
state->offset = (unsigned)here.val;
|
||||
state->extra = (unsigned)(here.op) & 15;
|
||||
state->mode = DISTEXT;
|
||||
/* fallthrough */
|
||||
case DISTEXT:
|
||||
if (state->extra) {
|
||||
NEEDBITS(state->extra);
|
||||
|
@ -1149,6 +1169,7 @@ int ZEXPORT inflate(
|
|||
#endif
|
||||
Tracevv((stderr, "inflate: distance %u\n", state->offset));
|
||||
state->mode = MATCH;
|
||||
/* fallthrough */
|
||||
case MATCH:
|
||||
if (left == 0) goto inf_leave;
|
||||
copy = out - left;
|
||||
|
@ -1208,7 +1229,7 @@ int ZEXPORT inflate(
|
|||
state->total += out;
|
||||
if ((state->wrap & 4) && out)
|
||||
strm->adler = state->check =
|
||||
UPDATE(state->check, put - out, out);
|
||||
UPDATE_CHECK(state->check, put - out, out);
|
||||
out = left;
|
||||
if ((state->wrap & 4) && (
|
||||
#ifdef GUNZIP
|
||||
|
@ -1224,10 +1245,11 @@ int ZEXPORT inflate(
|
|||
}
|
||||
#ifdef GUNZIP
|
||||
state->mode = LENGTH;
|
||||
/* fallthrough */
|
||||
case LENGTH:
|
||||
if (state->wrap && state->flags) {
|
||||
NEEDBITS(32);
|
||||
if (hold != (state->total & 0xffffffffUL)) {
|
||||
if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
|
||||
strm->msg = (char *)"incorrect length check";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
|
@ -1237,6 +1259,7 @@ int ZEXPORT inflate(
|
|||
}
|
||||
#endif
|
||||
state->mode = DONE;
|
||||
/* fallthrough */
|
||||
case DONE:
|
||||
ret = Z_STREAM_END;
|
||||
goto inf_leave;
|
||||
|
@ -1246,6 +1269,7 @@ int ZEXPORT inflate(
|
|||
case MEM:
|
||||
return Z_MEM_ERROR;
|
||||
case SYNC:
|
||||
/* fallthrough */
|
||||
default:
|
||||
return Z_STREAM_ERROR;
|
||||
}
|
||||
|
@ -1271,7 +1295,7 @@ int ZEXPORT inflate(
|
|||
state->total += out;
|
||||
if ((state->wrap & 4) && out)
|
||||
strm->adler = state->check =
|
||||
UPDATE(state->check, strm->next_out - out, out);
|
||||
UPDATE_CHECK(state->check, strm->next_out - out, out);
|
||||
strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
|
||||
(state->mode == TYPE ? 128 : 0) +
|
||||
(state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
|
||||
|
@ -1409,6 +1433,7 @@ int ZEXPORT inflateSync(
|
|||
z_streamp strm)
|
||||
{
|
||||
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 char buf[4]; /* to restore bit buffer to byte string */
|
||||
struct inflate_state FAR *state;
|
||||
|
@ -1441,9 +1466,15 @@ int ZEXPORT inflateSync(
|
|||
|
||||
/* return no joy or set up to restart inflate() on a new block */
|
||||
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;
|
||||
inflateReset(strm);
|
||||
strm->total_in = in; strm->total_out = out;
|
||||
state->flags = flags;
|
||||
state->mode = TYPE;
|
||||
return Z_OK;
|
||||
}
|
||||
|
@ -1468,7 +1499,7 @@ int ZEXPORT inflateSyncPoint(
|
|||
return state->mode == STORED && state->bits == 0;
|
||||
}
|
||||
|
||||
#if !Z_FREETYPE
|
||||
#ifndef Z_FREETYPE
|
||||
|
||||
int ZEXPORT inflateCopy(
|
||||
z_streamp dest,
|
||||
|
@ -1545,7 +1576,7 @@ int ZEXPORT inflateValidate(
|
|||
|
||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
if (check)
|
||||
if (check && state->wrap)
|
||||
state->wrap |= 4;
|
||||
else
|
||||
state->wrap &= ~4;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* inflate.h -- internal inflate state definition
|
||||
* Copyright (C) 1995-2016 Mark Adler
|
||||
* Copyright (C) 1995-2019 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -89,7 +89,8 @@ struct inflate_state {
|
|||
int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
|
||||
bit 2 true to validate check value */
|
||||
int havedict; /* true if dictionary provided */
|
||||
int flags; /* gzip header method and flags (0 if zlib) */
|
||||
int flags; /* gzip header method and flags, 0 if zlib, or
|
||||
-1 if raw or no header yet */
|
||||
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
|
||||
unsigned long check; /* protected copy of check value */
|
||||
unsigned long total; /* protected copy of output count */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||
* Copyright (C) 1995-2017 Mark Adler
|
||||
* Copyright (C) 1995-2022 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
#define MAXBITS 15
|
||||
|
||||
const char inflate_copyright[] =
|
||||
" inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
|
||||
" inflate 1.2.12 Copyright 1995-2022 Mark Adler ";
|
||||
/*
|
||||
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
|
||||
|
@ -62,7 +62,7 @@ int ZLIB_INTERNAL inflate_table(
|
|||
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 */
|
||||
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, 77, 202};
|
||||
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 202};
|
||||
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,
|
||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||
|
|
|
@ -6,8 +6,6 @@ are compiled as part of `src/gzip/ftgzip.c`.
|
|||
* src/gzip/adler32.c: Do not define unused functions when `Z_FREETYPE`
|
||||
is set.
|
||||
|
||||
* src/gzip/crc32.c (DO1, DO8): Undefine. Already defined in `adler32.c`.
|
||||
|
||||
* src/gzip/gzguts.h (COPY): Rename to...
|
||||
(COPY__): ... this since `COPY` and `COPY_` conflict with enum values,
|
||||
which have the same name in `zlib.h`.
|
||||
|
@ -25,10 +23,10 @@ Omit unused function declarations when `Z_FREETYPE` is defined.
|
|||
* src/gzip/inflate.h, src/gzip/inftrees.h: Add header guard macros to
|
||||
prevent compiler errors.
|
||||
|
||||
diff --git b/src/gzip/adler32.c a/src/gzip/adler32.c
|
||||
diff --git a/src/gzip/adler32.c b/src/gzip/adler32.c
|
||||
index be5e8a247..aa032e1dd 100644
|
||||
--- b/src/gzip/adler32.c
|
||||
+++ a/src/gzip/adler32.c
|
||||
--- a/src/gzip/adler32.c
|
||||
+++ b/src/gzip/adler32.c
|
||||
@@ -7,7 +7,9 @@
|
||||
|
||||
#include "zutil.h"
|
||||
|
@ -54,23 +52,10 @@ index be5e8a247..aa032e1dd 100644
|
|||
}
|
||||
+
|
||||
+#endif /* !Z_FREETYPE */
|
||||
diff --git b/src/gzip/crc32.c a/src/gzip/crc32.c
|
||||
index 3e3eb1794..ffced1ea7 100644
|
||||
--- b/src/gzip/crc32.c
|
||||
+++ 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
|
||||
diff --git a/src/gzip/gzguts.h b/src/gzip/gzguts.h
|
||||
index 57faf3716..4f09a52a7 100644
|
||||
--- a/src/gzip/gzguts.h
|
||||
+++ b/src/gzip/gzguts.h
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
/* values for gz_state how */
|
||||
|
@ -80,10 +65,10 @@ index 990a4d251..c81f8f392 100644
|
|||
#define GZIP 2 /* decompress a gzip stream */
|
||||
|
||||
/* internal gzip file state data structure */
|
||||
diff --git b/src/gzip/inflate.c a/src/gzip/inflate.c
|
||||
index 3f7ea647b..7387e6f57 100644
|
||||
--- b/src/gzip/inflate.c
|
||||
+++ a/src/gzip/inflate.c
|
||||
diff --git a/src/gzip/inflate.c b/src/gzip/inflate.c
|
||||
index 4375557b4..5bf5b815e 100644
|
||||
--- a/src/gzip/inflate.c
|
||||
+++ b/src/gzip/inflate.c
|
||||
@@ -99,8 +99,10 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
|
||||
#ifdef BUILDFIXED
|
||||
void makefixed OF((void));
|
||||
|
@ -95,7 +80,7 @@ index 3f7ea647b..7387e6f57 100644
|
|||
|
||||
local int inflateStateCheck(
|
||||
z_streamp strm)
|
||||
@@ -244,6 +246,8 @@ int ZEXPORT inflateInit_(
|
||||
@@ -245,6 +247,8 @@ int ZEXPORT inflateInit_(
|
||||
return inflateInit2_(strm, DEF_WBITS, version, stream_size);
|
||||
}
|
||||
|
||||
|
@ -104,16 +89,16 @@ index 3f7ea647b..7387e6f57 100644
|
|||
int ZEXPORT inflatePrime(
|
||||
z_streamp strm,
|
||||
int bits,
|
||||
@@ -265,6 +269,8 @@ int ZEXPORT inflatePrime(
|
||||
@@ -266,6 +270,8 @@ int ZEXPORT inflatePrime(
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
+#endif /* Z_FREETYPE */
|
||||
+#endif /* !Z_FREETYPE */
|
||||
+
|
||||
/*
|
||||
Return state with length and distance decoding tables and index sizes set to
|
||||
fixed code decoding. Normally this returns fixed tables from inffixed.h.
|
||||
@@ -1288,6 +1294,8 @@ int ZEXPORT inflateEnd(
|
||||
@@ -1312,6 +1318,8 @@ int ZEXPORT inflateEnd(
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
@ -122,7 +107,7 @@ index 3f7ea647b..7387e6f57 100644
|
|||
int ZEXPORT inflateGetDictionary(
|
||||
z_streamp strm,
|
||||
Bytef *dictionary,
|
||||
@@ -1440,6 +1448,8 @@ int ZEXPORT inflateSync(
|
||||
@@ -1471,6 +1479,8 @@ int ZEXPORT inflateSync(
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
@ -131,16 +116,16 @@ index 3f7ea647b..7387e6f57 100644
|
|||
/*
|
||||
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
|
||||
@@ -1458,6 +1468,8 @@ int ZEXPORT inflateSyncPoint(
|
||||
@@ -1489,6 +1499,8 @@ int ZEXPORT inflateSyncPoint(
|
||||
return state->mode == STORED && state->bits == 0;
|
||||
}
|
||||
|
||||
+#if !Z_FREETYPE
|
||||
+#ifndef Z_FREETYPE
|
||||
+
|
||||
int ZEXPORT inflateCopy(
|
||||
z_streamp dest,
|
||||
z_streamp source)
|
||||
@@ -1505,6 +1517,8 @@ int ZEXPORT inflateCopy(
|
||||
@@ -1536,6 +1548,8 @@ int ZEXPORT inflateCopy(
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
@ -149,7 +134,7 @@ index 3f7ea647b..7387e6f57 100644
|
|||
int ZEXPORT inflateUndermine(
|
||||
z_streamp strm,
|
||||
int subvert)
|
||||
@@ -1538,6 +1552,8 @@ int ZEXPORT inflateValidate(
|
||||
@@ -1569,6 +1583,8 @@ int ZEXPORT inflateValidate(
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
@ -158,16 +143,16 @@ index 3f7ea647b..7387e6f57 100644
|
|||
long ZEXPORT inflateMark(
|
||||
z_streamp strm)
|
||||
{
|
||||
@@ -1559,3 +1575,5 @@ unsigned long ZEXPORT inflateCodesUsed(
|
||||
@@ -1590,3 +1606,5 @@ unsigned long ZEXPORT inflateCodesUsed(
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
return (unsigned long)(state->next - state->codes);
|
||||
}
|
||||
+
|
||||
+#endif /* !Z_FREETYPE */
|
||||
diff --git b/src/gzip/inflate.h a/src/gzip/inflate.h
|
||||
index a46cce6b6..92ea758e2 100644
|
||||
--- b/src/gzip/inflate.h
|
||||
+++ a/src/gzip/inflate.h
|
||||
diff --git a/src/gzip/inflate.h b/src/gzip/inflate.h
|
||||
index f127b6b1f..c6f5a52e1 100644
|
||||
--- a/src/gzip/inflate.h
|
||||
+++ b/src/gzip/inflate.h
|
||||
@@ -3,6 +3,9 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
@ -178,16 +163,16 @@ index a46cce6b6..92ea758e2 100644
|
|||
/* WARNING: this file should *not* be used by applications. It is
|
||||
part of the implementation of the compression library and is
|
||||
subject to change. Applications should only use zlib.h.
|
||||
@@ -123,3 +126,5 @@ struct inflate_state {
|
||||
@@ -124,3 +127,5 @@ struct inflate_state {
|
||||
int back; /* bits back of last unprocessed length/lit */
|
||||
unsigned was; /* initial length of match */
|
||||
};
|
||||
+
|
||||
+#endif /* INFLATE_H */
|
||||
diff --git b/src/gzip/inftrees.h a/src/gzip/inftrees.h
|
||||
diff --git a/src/gzip/inftrees.h b/src/gzip/inftrees.h
|
||||
index baa53a0b1..c94eb78b5 100644
|
||||
--- b/src/gzip/inftrees.h
|
||||
+++ a/src/gzip/inftrees.h
|
||||
--- a/src/gzip/inftrees.h
|
||||
+++ b/src/gzip/inftrees.h
|
||||
@@ -3,6 +3,9 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
@ -204,10 +189,10 @@ index baa53a0b1..c94eb78b5 100644
|
|||
unsigned FAR *bits, unsigned short FAR *work));
|
||||
+
|
||||
+#endif /* INFTREES_H_ */
|
||||
diff --git b/src/gzip/zlib.h a/src/gzip/zlib.h
|
||||
index f09cdaf1e..1807c0645 100644
|
||||
--- b/src/gzip/zlib.h
|
||||
+++ a/src/gzip/zlib.h
|
||||
diff --git a/src/gzip/zlib.h b/src/gzip/zlib.h
|
||||
index 4a98e38bf..d760140c2 100644
|
||||
--- a/src/gzip/zlib.h
|
||||
+++ b/src/gzip/zlib.h
|
||||
@@ -31,7 +31,7 @@
|
||||
#ifndef ZLIB_H
|
||||
#define ZLIB_H
|
||||
|
@ -251,7 +236,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
/*
|
||||
ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
|
||||
int level,
|
||||
@@ -954,6 +958,8 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
|
||||
@@ -956,6 +960,8 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
|
||||
destination.
|
||||
*/
|
||||
|
||||
|
@ -260,7 +245,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
|
||||
/*
|
||||
This function is equivalent to inflateEnd followed by inflateInit,
|
||||
@@ -978,6 +984,8 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
|
||||
@@ -980,6 +986,8 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
|
||||
the windowBits parameter is invalid.
|
||||
*/
|
||||
|
||||
|
@ -269,7 +254,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
|
||||
int bits,
|
||||
int value));
|
||||
@@ -1067,6 +1075,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
|
||||
@@ -1069,6 +1077,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
|
||||
stream state was inconsistent.
|
||||
*/
|
||||
|
||||
|
@ -278,7 +263,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
/*
|
||||
ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
|
||||
unsigned char FAR *window));
|
||||
@@ -1093,6 +1103,8 @@ typedef unsigned (*in_func) OF((void FAR *,
|
||||
@@ -1095,6 +1105,8 @@ typedef unsigned (*in_func) OF((void FAR *,
|
||||
z_const unsigned char FAR * FAR *));
|
||||
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
|
||||
|
||||
|
@ -287,7 +272,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
||||
in_func in, void FAR *in_desc,
|
||||
out_func out, void FAR *out_desc));
|
||||
@@ -1212,6 +1224,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
|
||||
@@ -1214,6 +1226,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
|
||||
27-31: 0 (reserved)
|
||||
*/
|
||||
|
||||
|
@ -296,16 +281,16 @@ index f09cdaf1e..1807c0645 100644
|
|||
#ifndef Z_SOLO
|
||||
|
||||
/* utility functions */
|
||||
@@ -1739,6 +1753,8 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
||||
@@ -1742,6 +1756,8 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
||||
if (crc != original_crc) error();
|
||||
*/
|
||||
|
||||
+#ifndef Z_FREETYPE
|
||||
+
|
||||
ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
|
||||
ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
|
||||
z_size_t len));
|
||||
/*
|
||||
@@ -1805,6 +1821,19 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
|
||||
@@ -1822,6 +1838,19 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
|
||||
ZLIB_VERSION, (int)sizeof(z_stream))
|
||||
#endif
|
||||
|
||||
|
@ -325,13 +310,14 @@ index f09cdaf1e..1807c0645 100644
|
|||
#ifndef Z_SOLO
|
||||
|
||||
/* gzgetc() macro and its supporting function and exposed data structure. Note
|
||||
@@ -1879,12 +1908,15 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
||||
@@ -1901,13 +1930,16 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
||||
|
||||
#else /* Z_SOLO */
|
||||
|
||||
+#ifndef Z_FREETYPE
|
||||
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_gen OF((z_off_t));
|
||||
+#endif
|
||||
|
||||
#endif /* !Z_SOLO */
|
||||
|
@ -341,7 +327,7 @@ index f09cdaf1e..1807c0645 100644
|
|||
ZEXTERN const char * ZEXPORT zError OF((int));
|
||||
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
|
||||
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
|
||||
@@ -1904,6 +1936,7 @@ ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
|
||||
@@ -1927,6 +1959,7 @@ ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
|
||||
va_list va));
|
||||
# endif
|
||||
#endif
|
||||
|
@ -349,21 +335,11 @@ index f09cdaf1e..1807c0645 100644
|
|||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
diff --git b/src/gzip/zutil.h a/src/gzip/zutil.h
|
||||
index b079ea6a8..2d734a835 100644
|
||||
--- b/src/gzip/zutil.h
|
||||
+++ a/src/gzip/zutil.h
|
||||
@@ -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 */
|
||||
diff --git a/src/gzip/zutil.h b/src/gzip/zutil.h
|
||||
index d9a20ae1b..14f0f1a85 100644
|
||||
--- a/src/gzip/zutil.h
|
||||
+++ b/src/gzip/zutil.h
|
||||
@@ -188,6 +188,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
#pragma warn -8066
|
||||
#endif
|
||||
|
||||
|
@ -372,7 +348,7 @@ index b079ea6a8..2d734a835 100644
|
|||
/* provide prototypes for these when building zlib without LFS */
|
||||
#if !defined(_WIN32) && \
|
||||
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||
@@ -192,6 +196,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
@@ -195,6 +197,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));
|
||||
#endif
|
||||
|
||||
|
@ -381,7 +357,7 @@ index b079ea6a8..2d734a835 100644
|
|||
/* common defaults */
|
||||
|
||||
#ifndef OS_CODE
|
||||
@@ -223,9 +229,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
@@ -226,9 +230,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
# define zmemcmp _fmemcmp
|
||||
# define zmemzero(dest, len) _fmemset(dest, 0, len)
|
||||
# else
|
||||
|
|
223
src/gzip/zlib.h
223
src/gzip/zlib.h
|
@ -1,7 +1,7 @@
|
|||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 1.2.11, January 15th, 2017
|
||||
version 1.2.12, March 11th, 2022
|
||||
|
||||
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||
Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
@ -37,11 +37,11 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZLIB_VERSION "1.2.11"
|
||||
#define ZLIB_VERNUM 0x12b0
|
||||
#define ZLIB_VERSION "1.2.12"
|
||||
#define ZLIB_VERNUM 0x12c0
|
||||
#define ZLIB_VER_MAJOR 1
|
||||
#define ZLIB_VER_MINOR 2
|
||||
#define ZLIB_VER_REVISION 11
|
||||
#define ZLIB_VER_REVISION 12
|
||||
#define ZLIB_VER_SUBREVISION 0
|
||||
|
||||
/*
|
||||
|
@ -547,8 +547,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
|
|||
int strategy));
|
||||
|
||||
This is another version of deflateInit with more compression options. The
|
||||
fields next_in, zalloc, zfree and opaque must be initialized before by the
|
||||
caller.
|
||||
fields zalloc, zfree and opaque must be initialized before by the caller.
|
||||
|
||||
The method parameter is the compression method. It must be Z_DEFLATED in
|
||||
this version of the library.
|
||||
|
@ -716,11 +715,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
|
|||
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.
|
||||
If the compression approach (which is a function of the level) or the
|
||||
strategy is changed, and if any input has been consumed in a previous
|
||||
deflate() call, then the input available so far is compressed with the old
|
||||
level and strategy using deflate(strm, Z_BLOCK). There are three approaches
|
||||
for the compression levels 0, 1..3, and 4..9 respectively. The new level
|
||||
and strategy will take effect at the next call of deflate().
|
||||
strategy is changed, and if there have been any deflate() calls since the
|
||||
state was initialized or reset, then the input available so far is
|
||||
compressed with the old level and strategy using deflate(strm, Z_BLOCK).
|
||||
There are three approaches for the compression levels 0, 1..3, and 4..9
|
||||
respectively. The new level and strategy will take effect at the next call
|
||||
of deflate().
|
||||
|
||||
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
|
||||
|
@ -869,9 +869,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
|
|||
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
|
||||
CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
|
||||
below), inflate() will not automatically decode concatenated gzip streams.
|
||||
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 stream.
|
||||
below), inflate() will *not* automatically decode concatenated gzip members.
|
||||
inflate() will return Z_STREAM_END at the end of the gzip member. The state
|
||||
would need to be reset to continue decoding a subsequent gzip member. This
|
||||
*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
|
||||
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
|
||||
|
@ -1316,14 +1318,14 @@ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
|
|||
/*
|
||||
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
|
||||
|
||||
Opens a gzip (.gz) file for reading or writing. The mode parameter is as
|
||||
in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
|
||||
a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
|
||||
compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
|
||||
for fixed code compression as in "wb9F". (See the description of
|
||||
deflateInit2 for more information about the strategy parameter.) 'T' will
|
||||
request transparent writing or appending with no compression and not using
|
||||
the gzip format.
|
||||
Open the gzip (.gz) file at path for reading and decompressing, or
|
||||
compressing and writing. The mode parameter is as in fopen ("rb" or "wb")
|
||||
but can also include a compression level ("wb9") or a strategy: 'f' for
|
||||
filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h",
|
||||
'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression
|
||||
as in "wb9F". (See the description of deflateInit2 for more information
|
||||
about the strategy parameter.) 'T' will request transparent writing or
|
||||
appending with no compression and not using the gzip format.
|
||||
|
||||
"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
|
||||
|
@ -1353,9 +1355,9 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
|
|||
|
||||
ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
|
||||
/*
|
||||
gzdopen associates a gzFile with the file descriptor fd. File descriptors
|
||||
are obtained from calls like open, dup, creat, pipe or fileno (if the file
|
||||
has been previously opened with fopen). The mode parameter is as in gzopen.
|
||||
Associate a gzFile with the file descriptor fd. File descriptors are
|
||||
obtained from calls like open, dup, creat, pipe or fileno (if the file 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
|
||||
descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
|
||||
|
@ -1376,13 +1378,13 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
|
|||
|
||||
ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
|
||||
/*
|
||||
Set the internal buffer size used by this library's functions. The
|
||||
default buffer size is 8192 bytes. This function must be called after
|
||||
gzopen() or gzdopen(), and before any other calls that read or write the
|
||||
file. The buffer memory allocation is always deferred to the first read or
|
||||
write. Three times that size in buffer space is allocated. A larger buffer
|
||||
size of, for example, 64K or 128K bytes will noticeably increase the speed
|
||||
of decompression (reading).
|
||||
Set the internal buffer size used by this library's functions for file to
|
||||
size. The default buffer size is 8192 bytes. This function must be called
|
||||
after gzopen() or gzdopen(), and before any other calls that read or write
|
||||
the file. The buffer memory allocation is always deferred to the first read
|
||||
or write. Three times that size in buffer space is allocated. A larger
|
||||
buffer size of, for example, 64K or 128K bytes will noticeably increase the
|
||||
speed of decompression (reading).
|
||||
|
||||
The new buffer size also affects the maximum length for gzprintf().
|
||||
|
||||
|
@ -1392,9 +1394,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
|
|||
|
||||
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
|
||||
/*
|
||||
Dynamically update the compression level or strategy. See the description
|
||||
of deflateInit2 for the meaning of these parameters. Previously provided
|
||||
data is flushed before the parameter change.
|
||||
Dynamically update the compression level and strategy for file. See the
|
||||
description of deflateInit2 for the meaning of these parameters. Previously
|
||||
provided data is flushed before applying the parameter changes.
|
||||
|
||||
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,
|
||||
|
@ -1403,7 +1405,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
|
|||
|
||||
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
||||
/*
|
||||
Reads the given number of uncompressed bytes from the compressed file. If
|
||||
Read and decompress up to len uncompressed bytes from file into buf. If
|
||||
the input file is not in gzip format, gzread copies the given number of
|
||||
bytes into the buffer directly from the file.
|
||||
|
||||
|
@ -1434,11 +1436,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,
|
||||
gzFile file));
|
||||
/*
|
||||
Read up to nitems items of size size from file to buf, otherwise operating
|
||||
as gzread() does. This duplicates the interface of stdio's fread(), with
|
||||
size_t request and return types. If 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.
|
||||
Read and decompress up to nitems items of size size from file into buf,
|
||||
otherwise operating as gzread() does. This duplicates the interface of
|
||||
stdio's fread(), with size_t request and return types. If 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.
|
||||
|
||||
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
|
||||
|
@ -1457,18 +1459,16 @@ 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.
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
|
||||
voidpc buf, unsigned len));
|
||||
ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
|
||||
/*
|
||||
Writes the given number of uncompressed bytes into the compressed file.
|
||||
gzwrite returns the number of uncompressed bytes written or 0 in case of
|
||||
error.
|
||||
Compress and write the len uncompressed bytes at buf to file. 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,
|
||||
z_size_t nitems, gzFile file));
|
||||
/*
|
||||
gzfwrite() writes nitems items of size size from buf to file, duplicating
|
||||
Compress and write 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 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.
|
||||
|
@ -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, ...));
|
||||
/*
|
||||
Converts, formats, and writes the arguments to the compressed file under
|
||||
control of the format string, as in fprintf. gzprintf returns the number of
|
||||
Convert, format, compress, and write the arguments (...) to file under
|
||||
control of the string format, as in fprintf. gzprintf returns the number of
|
||||
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
|
||||
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
|
||||
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
|
||||
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.
|
||||
This can be determined using zlibCompileFlags().
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
|
||||
/*
|
||||
Writes the given null-terminated string to the compressed file, excluding
|
||||
Compress and write the given null-terminated string s to file, excluding
|
||||
the terminating null character.
|
||||
|
||||
gzputs returns the number of characters written, or -1 in case of error.
|
||||
|
@ -1504,11 +1504,12 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
|
|||
|
||||
ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
|
||||
/*
|
||||
Reads bytes from the compressed file until len-1 characters are read, or a
|
||||
newline character is read and transferred to buf, or an end-of-file
|
||||
condition is encountered. If any characters are read or if len == 1, the
|
||||
string is terminated with a null character. If no characters are read due
|
||||
to an end-of-file or len < 1, then the buffer is left untouched.
|
||||
Read and decompress bytes from file into buf, until len-1 characters are
|
||||
read, or until a newline character is read and transferred to buf, or an
|
||||
end-of-file condition is encountered. If any characters are read or if len
|
||||
is one, the string is terminated with a null character. If no characters
|
||||
are read due to an end-of-file or len is less than one, then the buffer is
|
||||
left untouched.
|
||||
|
||||
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
|
||||
|
@ -1517,13 +1518,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
|
|||
|
||||
ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
|
||||
/*
|
||||
Writes c, converted to an unsigned char, into the compressed file. gzputc
|
||||
Compress and write c, converted to an unsigned char, into file. gzputc
|
||||
returns the value that was written, or -1 in case of error.
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
|
||||
/*
|
||||
Reads one byte from the compressed file. gzgetc returns this byte or -1
|
||||
Read and decompress one byte from file. gzgetc returns this byte or -1
|
||||
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.
|
||||
it does not check to see if file is NULL, nor whether the structure file
|
||||
|
@ -1532,8 +1533,8 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
|
|||
|
||||
ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
|
||||
/*
|
||||
Push one character back onto the stream to be read as the first character
|
||||
on the next read. At least one character of push-back is allowed.
|
||||
Push c back onto the stream for file to be read as the first character on
|
||||
the next read. At least one character of push-back is always allowed.
|
||||
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
|
||||
yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
|
||||
|
@ -1544,9 +1545,9 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
|
|||
|
||||
ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
|
||||
/*
|
||||
Flushes all pending output into the compressed file. The parameter flush
|
||||
is as in the deflate() function. The return value is the zlib error number
|
||||
(see function gzerror below). gzflush is only permitted when writing.
|
||||
Flush all pending output to file. The parameter flush is as in the
|
||||
deflate() function. The return value is the zlib error number (see function
|
||||
gzerror below). gzflush is only permitted when writing.
|
||||
|
||||
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
|
||||
|
@ -1561,8 +1562,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
|
|||
ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
|
||||
z_off_t offset, int whence));
|
||||
|
||||
Sets the starting position for the next gzread or gzwrite on the given
|
||||
compressed file. The offset represents a number of bytes in the
|
||||
Set the starting position to offset relative to whence for the next gzread
|
||||
or gzwrite on file. The offset represents a number of bytes in the
|
||||
uncompressed data stream. The whence parameter is defined as in lseek(2);
|
||||
the value SEEK_END is not supported.
|
||||
|
||||
|
@ -1579,18 +1580,18 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
|
|||
|
||||
ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
|
||||
/*
|
||||
Rewinds the given file. This function is supported only for reading.
|
||||
Rewind 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));
|
||||
|
||||
Returns the starting position for the next gzread or gzwrite on the given
|
||||
compressed file. This position represents a number of bytes in the
|
||||
uncompressed data stream, and is zero when starting, even if appending or
|
||||
reading a gzip stream from the middle of a file using gzdopen().
|
||||
Return the starting position for the next gzread or gzwrite on file.
|
||||
This position represents a number of bytes in the uncompressed data stream,
|
||||
and is zero when starting, even if appending or reading a gzip stream from
|
||||
the middle of a file using gzdopen().
|
||||
|
||||
gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
|
||||
*/
|
||||
|
@ -1598,22 +1599,22 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
|
|||
/*
|
||||
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
|
||||
|
||||
Returns the current offset in the file being read or written. This offset
|
||||
includes the count of bytes that precede the gzip stream, for example when
|
||||
appending or when using gzdopen() for reading. When reading, the offset
|
||||
does not include as yet unused buffered input. This information can be used
|
||||
for a progress indicator. On error, gzoffset() returns -1.
|
||||
Return the current compressed (actual) read or write offset of file. This
|
||||
offset includes the count of bytes that precede the gzip stream, for example
|
||||
when appending or when using gzdopen() for reading. When reading, the
|
||||
offset does not include as yet unused buffered input. This information can
|
||||
be used for a progress indicator. On error, gzoffset() returns -1.
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT gzeof OF((gzFile file));
|
||||
/*
|
||||
Returns true (1) if the end-of-file indicator has been set while reading,
|
||||
false (0) otherwise. Note that the end-of-file indicator is set only if the
|
||||
read tried to go past the end of the input, but came up short. Therefore,
|
||||
just like feof(), gzeof() may return false even if there is no more data to
|
||||
read, in the event that the last read request was for the exact number of
|
||||
bytes remaining in the input file. This will happen if the input file size
|
||||
is an exact multiple of the buffer size.
|
||||
Return true (1) if the end-of-file indicator for file has been set while
|
||||
reading, false (0) otherwise. Note that the end-of-file indicator is set
|
||||
only if the read tried to go past the end of the input, but came up short.
|
||||
Therefore, just like feof(), gzeof() may return false even if there is no
|
||||
more data to read, in the event that the last read request was for the exact
|
||||
number of bytes remaining in the input file. This will happen if the input
|
||||
file size is an exact multiple of the buffer size.
|
||||
|
||||
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
|
||||
|
@ -1622,7 +1623,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
|
|||
|
||||
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
|
||||
/*
|
||||
Returns true (1) if file is being copied directly while reading, or false
|
||||
Return true (1) if file is being copied directly while reading, or false
|
||||
(0) if file is a gzip stream being decompressed.
|
||||
|
||||
If the input file is empty, gzdirect() will return true, since the input
|
||||
|
@ -1643,8 +1644,8 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
|
|||
|
||||
ZEXTERN int ZEXPORT gzclose OF((gzFile file));
|
||||
/*
|
||||
Flushes all pending output if necessary, closes the compressed file and
|
||||
deallocates the (de)compression state. Note that once file is closed, you
|
||||
Flush all pending output for file, if necessary, close file and
|
||||
deallocate the (de)compression state. Note that once file is closed, you
|
||||
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
|
||||
must not be called more than once on the same allocation.
|
||||
|
@ -1668,10 +1669,10 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
|
|||
|
||||
ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
|
||||
/*
|
||||
Returns the error message for the last error which occurred on the given
|
||||
compressed file. errnum is set to zlib error number. If an error occurred
|
||||
in the file system and not in the compression library, errnum is set to
|
||||
Z_ERRNO and the application may consult errno to get the exact error code.
|
||||
Return the error message for the last error which occurred on file.
|
||||
errnum is set to zlib error number. If an error occurred in the file system
|
||||
and not in the compression library, errnum is set to 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
|
||||
this function may invalidate the previously returned string. If file is
|
||||
|
@ -1684,7 +1685,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
|
|||
|
||||
ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
|
||||
/*
|
||||
Clears the error and end-of-file flags for file. This is analogous to the
|
||||
Clear 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
|
||||
file that is being written concurrently.
|
||||
*/
|
||||
|
@ -1702,8 +1703,9 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
|
|||
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
|
||||
return the updated checksum. If buf is Z_NULL, this function returns the
|
||||
required initial value for the checksum.
|
||||
return the updated checksum. An Adler-32 value is in the range of a 32-bit
|
||||
unsigned integer. If buf is Z_NULL, this function returns the required
|
||||
initial value for the checksum.
|
||||
|
||||
An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed
|
||||
much faster.
|
||||
|
@ -1736,12 +1738,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
|
|||
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
|
||||
updated CRC-32. If buf is Z_NULL, this function returns the required
|
||||
initial value for the crc. Pre- and post-conditioning (one's complement) is
|
||||
performed within this function so it shouldn't be done by the application.
|
||||
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
|
||||
If buf is Z_NULL, this function returns the required initial value for the
|
||||
crc. Pre- and post-conditioning (one's complement) is performed within this
|
||||
function so it shouldn't be done by the application.
|
||||
|
||||
Usage example:
|
||||
|
||||
|
@ -1755,7 +1758,7 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
|||
|
||||
#ifndef Z_FREETYPE
|
||||
|
||||
ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
|
||||
ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
|
||||
z_size_t len));
|
||||
/*
|
||||
Same as crc32(), but with a size_t length.
|
||||
|
@ -1771,6 +1774,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t 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 :) */
|
||||
|
||||
|
@ -1871,6 +1888,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
||||
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_combine_gen64 OF((z_off64_t));
|
||||
#endif
|
||||
|
||||
#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
|
||||
|
@ -1881,6 +1899,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
# define z_gzoffset z_gzoffset64
|
||||
# define z_adler32_combine z_adler32_combine64
|
||||
# define z_crc32_combine z_crc32_combine64
|
||||
# define z_crc32_combine_gen z_crc32_combine_gen64
|
||||
# else
|
||||
# define gzopen gzopen64
|
||||
# define gzseek gzseek64
|
||||
|
@ -1888,6 +1907,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
# define gzoffset gzoffset64
|
||||
# define adler32_combine adler32_combine64
|
||||
# define crc32_combine crc32_combine64
|
||||
# define crc32_combine_gen crc32_combine_gen64
|
||||
# endif
|
||||
# ifndef Z_LARGE64
|
||||
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
||||
|
@ -1896,6 +1916,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
|
||||
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_combine_gen64 OF((z_off_t));
|
||||
# endif
|
||||
#else
|
||||
ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
|
||||
|
@ -1904,6 +1925,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
|
||||
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_gen OF((z_off_t));
|
||||
#endif
|
||||
|
||||
#else /* Z_SOLO */
|
||||
|
@ -1911,6 +1933,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
|||
#ifndef Z_FREETYPE
|
||||
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_gen OF((z_off_t));
|
||||
#endif
|
||||
|
||||
#endif /* !Z_SOLO */
|
||||
|
@ -1925,7 +1948,7 @@ ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
|
|||
ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp));
|
||||
ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
|
||||
ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
|
||||
#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
|
||||
#if defined(_WIN32) && !defined(Z_SOLO)
|
||||
ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
|
||||
const char *mode));
|
||||
#endif
|
||||
|
|
|
@ -136,8 +136,8 @@ const char * ZEXPORT zError(
|
|||
return ERR_MSG(err);
|
||||
}
|
||||
|
||||
#if defined(_WIN32_WCE)
|
||||
/* The Microsoft C Run-Time Library for Windows CE doesn't have
|
||||
#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
|
||||
/* The older Microsoft C Run-Time Library for Windows CE doesn't have
|
||||
* errno. We define it as a global variable to simplify porting.
|
||||
* Its value is always 0 and should not be used.
|
||||
*/
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* zutil.h -- internal interface and configuration of the compression library
|
||||
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
||||
* Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
|
@ -29,12 +29,6 @@
|
|||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef Z_SOLO
|
||||
# ifndef Z_FREETYPE
|
||||
typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef local
|
||||
# define local static
|
||||
#endif
|
||||
|
@ -48,6 +42,17 @@ typedef unsigned short ush;
|
|||
typedef ush FAR ushf;
|
||||
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 */
|
||||
/* (size given to avoid silly warnings with Visual C++) */
|
||||
|
||||
|
@ -172,10 +177,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||
#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
|
||||
# if defined(_WIN32_WCE)
|
||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||
# ifndef _PTRDIFF_T_DEFINED
|
||||
typedef int ptrdiff_t;
|
||||
# define _PTRDIFF_T_DEFINED
|
||||
# endif
|
||||
# else
|
||||
# define fdopen(fd,type) _fdopen(fd,type)
|
||||
# endif
|
||||
|
|
|
@ -143,7 +143,7 @@
|
|||
return -1;
|
||||
}
|
||||
|
||||
if ( FT_QRENEW_ARRAY( state->stack, old_size, new_size ) )
|
||||
if ( FT_QREALLOC( state->stack, old_size, new_size ) )
|
||||
return -1;
|
||||
|
||||
/* if relocating to heap */
|
||||
|
|
|
@ -207,7 +207,7 @@
|
|||
|
||||
pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 );
|
||||
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 )
|
||||
{
|
||||
|
|
|
@ -248,7 +248,7 @@
|
|||
else
|
||||
#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 );
|
||||
|
|
|
@ -535,11 +535,11 @@
|
|||
|
||||
if ( r & 1 )
|
||||
{
|
||||
*buffer = (FT_Byte)(*buffer + c);
|
||||
*buffer = (FT_Byte)( *buffer + c );
|
||||
buffer++;
|
||||
}
|
||||
else
|
||||
*buffer = (FT_Byte)(c << 4);
|
||||
*buffer = (FT_Byte)( c << 4 );
|
||||
|
||||
r++;
|
||||
}
|
||||
|
@ -572,8 +572,8 @@
|
|||
if ( p >= limit )
|
||||
return 0;
|
||||
|
||||
if ( n > (FT_UInt)(limit - p) )
|
||||
n = (FT_UInt)(limit - p);
|
||||
if ( n > (FT_UInt)( limit - p ) )
|
||||
n = (FT_UInt)( limit - p );
|
||||
|
||||
for ( r = 0; r < n; r++ )
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* psfixed.h
|
||||
*
|
||||
* Adobe's code for Fixed Point Mathematics (specification only).
|
||||
* Adobe's code for Fixed-Point Mathematics (specification only).
|
||||
*
|
||||
* Copyright 2007-2013 Adobe Systems Incorporated.
|
||||
*
|
||||
|
@ -43,10 +43,10 @@
|
|||
FT_BEGIN_HEADER
|
||||
|
||||
|
||||
/* rasterizer integer and fixed point arithmetic must be 32-bit */
|
||||
/* rasterizer integer and fixed-point arithmetic must be 32-bit */
|
||||
|
||||
#define CF2_Fixed CF2_F16Dot16
|
||||
typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */
|
||||
typedef FT_Int32 CF2_Frac; /* 2.30 fixed-point */
|
||||
|
||||
|
||||
#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL )
|
||||
|
|
|
@ -72,7 +72,7 @@ FT_BEGIN_HEADER
|
|||
} CF2_PathOp;
|
||||
|
||||
|
||||
/* a matrix of fixed point values */
|
||||
/* a matrix of fixed-point values */
|
||||
typedef struct CF2_Matrix_
|
||||
{
|
||||
CF2_F16Dot16 a;
|
||||
|
|
|
@ -518,7 +518,7 @@
|
|||
|
||||
if ( *cur == '<' ) /* <...> */
|
||||
{
|
||||
if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */
|
||||
if ( cur + 1 < limit && *( cur + 1 ) == '<' ) /* << */
|
||||
{
|
||||
cur++;
|
||||
cur++;
|
||||
|
|
|
@ -49,8 +49,8 @@ FT_BEGIN_HEADER
|
|||
{
|
||||
union
|
||||
{
|
||||
CF2_Fixed r; /* 16.16 fixed point */
|
||||
CF2_Frac f; /* 2.30 fixed point (for font matrix) */
|
||||
CF2_Fixed r; /* 16.16 fixed-point */
|
||||
CF2_Frac f; /* 2.30 fixed-point (for font matrix) */
|
||||
CF2_Int i;
|
||||
} u;
|
||||
|
||||
|
|
|
@ -2269,7 +2269,7 @@
|
|||
/* This is due to the fact that, in the vast majority of cases, */
|
||||
/* the span length in bytes is relatively small. */
|
||||
while ( --c2 > 0 )
|
||||
*(++target) = 0xFF;
|
||||
*( ++target ) = 0xFF;
|
||||
|
||||
target[1] |= f2;
|
||||
}
|
||||
|
|
|
@ -1939,7 +1939,7 @@
|
|||
/* now factor is 16.16 */
|
||||
factor = FT_DivFix( factor, sq_line_length );
|
||||
|
||||
/* clamp the factor between 0.0 and 1.0 in fixed point */
|
||||
/* clamp the factor between 0.0 and 1.0 in fixed-point */
|
||||
if ( factor > FT_INT_16D16( 1 ) )
|
||||
factor = FT_INT_16D16( 1 );
|
||||
if ( factor < 0 )
|
||||
|
@ -3014,7 +3014,7 @@
|
|||
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 );
|
||||
else if ( diff < 0 )
|
||||
min_dist = current_dist;
|
||||
|
@ -3164,7 +3164,7 @@
|
|||
if ( min_dist.distance > sp_sq )
|
||||
min_dist.distance = sp_sq;
|
||||
|
||||
/* square_root the values and fit in a 6.10 fixed point */
|
||||
/* square_root the values and fit in a 6.10 fixed-point */
|
||||
if ( USE_SQUARED_DISTANCES )
|
||||
min_dist.distance = square_root( min_dist.distance );
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
*
|
||||
* https://github.com/chmike/fpsqrt
|
||||
*
|
||||
* Use this to compute the square root of a 16.16 fixed point number.
|
||||
* Use this to compute the square root of a 16.16 fixed-point number.
|
||||
*/
|
||||
FT_LOCAL_DEF( FT_16D16 )
|
||||
square_root( FT_16D16 val )
|
||||
|
@ -72,8 +72,8 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Convert 16.16 fixed point values to the desired output format.
|
||||
* In this case we reduce 16.16 fixed point values to normalized
|
||||
* Convert 16.16 fixed-point values to the desired output format.
|
||||
* In this case we reduce 16.16 fixed-point values to normalized
|
||||
* 8-bit values.
|
||||
*
|
||||
* The `max_value` in the parameter is the maximum value in the
|
||||
|
|
|
@ -298,15 +298,9 @@
|
|||
goto Exit;
|
||||
}
|
||||
|
||||
/* the rows and pitch must be valid after presetting the */
|
||||
/* bitmap using outline */
|
||||
/* nothing to render */
|
||||
if ( !bitmap->rows || !bitmap->pitch )
|
||||
{
|
||||
FT_ERROR(( "ft_sdf_render: failed to preset bitmap\n" ));
|
||||
|
||||
error = FT_THROW( Cannot_Render_Glyph );
|
||||
goto Exit;
|
||||
}
|
||||
return FT_Err_Ok;
|
||||
|
||||
/* the padding will simply be equal to the `spread' */
|
||||
x_pad = sdf_module->spread;
|
||||
|
@ -525,13 +519,9 @@
|
|||
goto Exit;
|
||||
}
|
||||
|
||||
/* nothing to render */
|
||||
if ( !bitmap->rows || !bitmap->pitch )
|
||||
{
|
||||
FT_ERROR(( "ft_bsdf_render: invalid bitmap size\n" ));
|
||||
|
||||
error = FT_THROW( Invalid_Argument );
|
||||
goto Exit;
|
||||
}
|
||||
return FT_Err_Ok;
|
||||
|
||||
FT_Bitmap_New( &target );
|
||||
|
||||
|
|
|
@ -367,7 +367,7 @@
|
|||
}
|
||||
|
||||
/* 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 );
|
||||
|
||||
if ( bitdepth == 16 )
|
||||
|
@ -387,7 +387,7 @@
|
|||
png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
|
||||
|
||||
/* recheck header after setting EXPAND options */
|
||||
png_read_update_info(png, info );
|
||||
png_read_update_info( png, info );
|
||||
png_get_IHDR( png, info,
|
||||
&imgWidth, &imgHeight,
|
||||
&bitdepth, &color_type, &interlace,
|
||||
|
|
|
@ -657,7 +657,7 @@
|
|||
|
||||
|
||||
/*
|
||||
* Find the shortest decimal representation of a 16.16 fixed point
|
||||
* Find the shortest decimal representation of a 16.16 fixed-point
|
||||
* number. The function fills `buf' with the result, returning a pointer
|
||||
* to the position after the representation's last byte.
|
||||
*/
|
||||
|
@ -733,7 +733,7 @@
|
|||
an equivalent representation of `fixed'.
|
||||
|
||||
The above FOR loop always finds the larger of the two values; I
|
||||
verified this by iterating over all possible fixed point numbers.
|
||||
verified this by iterating over all possible fixed-point numbers.
|
||||
|
||||
If the remainder is 17232*10, both values are equally good, and we
|
||||
take the next even number (following IEEE 754's `round to nearest,
|
||||
|
@ -741,7 +741,7 @@
|
|||
|
||||
If the remainder is smaller than 17232*10, the lower of the two
|
||||
numbers is nearer to the exact result (values 17232 and 34480 were
|
||||
also found by testing all possible fixed point values).
|
||||
also found by testing all possible fixed-point values).
|
||||
|
||||
We use this to find a shorter decimal representation. If not ending
|
||||
with digit zero, we take the representation with less error.
|
||||
|
|
|
@ -1066,7 +1066,8 @@
|
|||
*/
|
||||
if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC ||
|
||||
face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ||
|
||||
face->colr )
|
||||
face->colr ||
|
||||
face->svg )
|
||||
flags |= FT_FACE_FLAG_COLOR; /* color glyphs */
|
||||
|
||||
if ( has_outline == TRUE )
|
||||
|
|
|
@ -162,8 +162,7 @@
|
|||
}
|
||||
|
||||
/* Don't trust `totalSfntSize' before thorough checks. */
|
||||
if ( FT_QALLOC( sfnt, 12 + woff.num_tables * 16UL ) ||
|
||||
FT_NEW( sfnt_stream ) )
|
||||
if ( FT_QALLOC( sfnt, 12 ) || FT_NEW( sfnt_stream ) )
|
||||
goto Exit;
|
||||
|
||||
sfnt_header = sfnt;
|
||||
|
@ -196,8 +195,8 @@
|
|||
/* tag value, the tables themselves are not. We thus have to */
|
||||
/* sort them by offset and check that they don't overlap. */
|
||||
|
||||
if ( FT_NEW_ARRAY( tables, woff.num_tables ) ||
|
||||
FT_NEW_ARRAY( indices, woff.num_tables ) )
|
||||
if ( FT_QNEW_ARRAY( tables, woff.num_tables ) ||
|
||||
FT_QNEW_ARRAY( indices, woff.num_tables ) )
|
||||
goto Exit;
|
||||
|
||||
FT_TRACE2(( "\n" ));
|
||||
|
@ -328,9 +327,7 @@
|
|||
}
|
||||
|
||||
/* Now use `totalSfntSize'. */
|
||||
if ( FT_REALLOC( sfnt,
|
||||
12 + woff.num_tables * 16UL,
|
||||
woff.totalSfntSize ) )
|
||||
if ( FT_QREALLOC( sfnt, 12, woff.totalSfntSize ) )
|
||||
goto Exit;
|
||||
|
||||
sfnt_header = sfnt + 12;
|
||||
|
|
|
@ -229,9 +229,9 @@
|
|||
{
|
||||
FT_TRACE6(( "Reallocating %lu to %lu.\n",
|
||||
*dst_size, (*offset + size) ));
|
||||
if ( FT_REALLOC( dst,
|
||||
(FT_ULong)( *dst_size ),
|
||||
(FT_ULong)( *offset + size ) ) )
|
||||
if ( FT_QREALLOC( dst,
|
||||
(FT_ULong)( *dst_size ),
|
||||
(FT_ULong)( *offset + size ) ) )
|
||||
goto Exit;
|
||||
|
||||
*dst_size = *offset + size;
|
||||
|
@ -784,7 +784,7 @@
|
|||
goto Fail;
|
||||
|
||||
loca_buf_size = loca_values_size * offset_size;
|
||||
if ( FT_QNEW_ARRAY( loca_buf, loca_buf_size ) )
|
||||
if ( FT_QALLOC( loca_buf, loca_buf_size ) )
|
||||
goto Fail;
|
||||
|
||||
dst = loca_buf;
|
||||
|
@ -863,7 +863,7 @@
|
|||
WOFF2_Point points = NULL;
|
||||
|
||||
|
||||
if ( FT_NEW_ARRAY( substreams, num_substreams ) )
|
||||
if ( FT_QNEW_ARRAY( substreams, num_substreams ) )
|
||||
goto Fail;
|
||||
|
||||
if ( FT_STREAM_SKIP( 2 ) )
|
||||
|
@ -926,7 +926,7 @@
|
|||
offset += overlap_bitmap_length;
|
||||
}
|
||||
|
||||
if ( FT_NEW_ARRAY( loca_values, num_glyphs + 1 ) )
|
||||
if ( FT_QNEW_ARRAY( loca_values, num_glyphs + 1 ) )
|
||||
goto Fail;
|
||||
|
||||
points_size = 0;
|
||||
|
@ -938,10 +938,10 @@
|
|||
substreams[BBOX_STREAM].offset += bbox_bitmap_length;
|
||||
|
||||
glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF;
|
||||
if ( FT_NEW_ARRAY( glyph_buf, glyph_buf_size ) )
|
||||
if ( FT_QALLOC( glyph_buf, glyph_buf_size ) )
|
||||
goto Fail;
|
||||
|
||||
if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) )
|
||||
if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) )
|
||||
goto Fail;
|
||||
|
||||
for ( i = 0; i < num_glyphs; ++i )
|
||||
|
@ -973,7 +973,7 @@
|
|||
/* composite glyph */
|
||||
FT_Bool have_instructions = FALSE;
|
||||
FT_UShort instruction_size = 0;
|
||||
FT_ULong composite_size;
|
||||
FT_ULong composite_size = 0;
|
||||
FT_ULong size_needed;
|
||||
FT_Byte* pointer = NULL;
|
||||
|
||||
|
@ -999,7 +999,7 @@
|
|||
size_needed = 12 + composite_size + instruction_size;
|
||||
if ( glyph_buf_size < size_needed )
|
||||
{
|
||||
if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) )
|
||||
if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) )
|
||||
goto Fail;
|
||||
glyph_buf_size = size_needed;
|
||||
}
|
||||
|
@ -1075,7 +1075,7 @@
|
|||
have_overlap = TRUE;
|
||||
}
|
||||
|
||||
if ( FT_NEW_ARRAY( n_points_arr, n_contours ) )
|
||||
if ( FT_QNEW_ARRAY( n_points_arr, n_contours ) )
|
||||
goto Fail;
|
||||
|
||||
if ( FT_STREAM_SEEK( substreams[N_POINTS_STREAM].offset ) )
|
||||
|
@ -1112,7 +1112,7 @@
|
|||
|
||||
/* Create array to store point information. */
|
||||
points_size = total_n_points;
|
||||
if ( FT_NEW_ARRAY( points, points_size ) )
|
||||
if ( FT_QNEW_ARRAY( points, points_size ) )
|
||||
goto Fail;
|
||||
|
||||
if ( triplet_decode( flags_buf,
|
||||
|
@ -1141,7 +1141,7 @@
|
|||
instruction_size;
|
||||
if ( glyph_buf_size < size_needed )
|
||||
{
|
||||
if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) )
|
||||
if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) )
|
||||
goto Fail;
|
||||
glyph_buf_size = size_needed;
|
||||
}
|
||||
|
@ -1226,8 +1226,7 @@
|
|||
*glyf_checksum += compute_ULong_sum( glyph_buf, glyph_size );
|
||||
|
||||
/* Store x_mins, may be required to reconstruct `hmtx'. */
|
||||
if ( n_contours > 0 )
|
||||
info->x_mins[i] = (FT_Short)x_min;
|
||||
info->x_mins[i] = (FT_Short)x_min;
|
||||
}
|
||||
|
||||
info->glyf_table->dst_length = dest_offset - info->glyf_table->dst_offset;
|
||||
|
@ -1344,7 +1343,7 @@
|
|||
offset_size = index_format ? 4 : 2;
|
||||
|
||||
/* Create `x_mins' array. */
|
||||
if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) )
|
||||
if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) )
|
||||
return error;
|
||||
|
||||
loca_offset = info->loca_table->src_offset;
|
||||
|
@ -1432,8 +1431,8 @@
|
|||
if ( num_hmetrics < 1 )
|
||||
goto Fail;
|
||||
|
||||
if ( FT_NEW_ARRAY( advance_widths, num_hmetrics ) ||
|
||||
FT_NEW_ARRAY( lsbs, num_glyphs ) )
|
||||
if ( FT_QNEW_ARRAY( advance_widths, num_hmetrics ) ||
|
||||
FT_QNEW_ARRAY( lsbs, num_glyphs ) )
|
||||
goto Fail;
|
||||
|
||||
/* Read `advanceWidth' stream. Always present. */
|
||||
|
@ -1484,7 +1483,7 @@
|
|||
|
||||
/* Build the hmtx table. */
|
||||
hmtx_table_size = 2 * num_hmetrics + 2 * num_glyphs;
|
||||
if ( FT_NEW_ARRAY( hmtx_table, hmtx_table_size ) )
|
||||
if ( FT_QALLOC( hmtx_table, hmtx_table_size ) )
|
||||
goto Fail;
|
||||
|
||||
dst = hmtx_table;
|
||||
|
@ -1541,10 +1540,10 @@
|
|||
{
|
||||
/* Memory management of `transformed_buf' is handled by the caller. */
|
||||
|
||||
FT_Error error = FT_Err_Ok;
|
||||
FT_Stream stream = NULL;
|
||||
FT_Byte* buf_cursor = NULL;
|
||||
FT_Byte* table_entry = NULL;
|
||||
FT_Error error = FT_Err_Ok;
|
||||
FT_Stream stream = NULL;
|
||||
FT_Byte* buf_cursor = NULL;
|
||||
FT_Byte table_entry[16];
|
||||
|
||||
/* We are reallocating memory for `sfnt', so its pointer may change. */
|
||||
FT_Byte* sfnt = *sfnt_bytes;
|
||||
|
@ -1585,10 +1584,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* Create buffer for table entries. */
|
||||
if ( FT_NEW_ARRAY( table_entry, 16 ) )
|
||||
goto Fail;
|
||||
|
||||
/* Create a stream for the uncompressed buffer. */
|
||||
if ( FT_NEW( stream ) )
|
||||
goto Fail;
|
||||
|
@ -1751,7 +1746,6 @@
|
|||
/* Set pointer of sfnt stream to its correct value. */
|
||||
*sfnt_bytes = sfnt;
|
||||
|
||||
FT_FREE( table_entry );
|
||||
FT_Stream_Close( stream );
|
||||
FT_FREE( stream );
|
||||
|
||||
|
@ -1764,7 +1758,6 @@
|
|||
/* Set pointer of sfnt stream to its correct value. */
|
||||
*sfnt_bytes = sfnt;
|
||||
|
||||
FT_FREE( table_entry );
|
||||
FT_Stream_Close( stream );
|
||||
FT_FREE( stream );
|
||||
|
||||
|
@ -1877,8 +1870,8 @@
|
|||
woff2.ttc_fonts = NULL;
|
||||
|
||||
/* Read table directory. */
|
||||
if ( FT_NEW_ARRAY( tables, woff2.num_tables ) ||
|
||||
FT_NEW_ARRAY( indices, woff2.num_tables ) )
|
||||
if ( FT_QNEW_ARRAY( tables, woff2.num_tables ) ||
|
||||
FT_QNEW_ARRAY( indices, woff2.num_tables ) )
|
||||
goto Exit;
|
||||
|
||||
FT_TRACE2(( "\n" ));
|
||||
|
@ -1949,10 +1942,11 @@
|
|||
goto Exit;
|
||||
}
|
||||
|
||||
table->flags = flags;
|
||||
table->src_offset = src_offset;
|
||||
table->src_length = table->TransformLength;
|
||||
src_offset += table->TransformLength;
|
||||
table->flags = flags;
|
||||
table->dst_offset = 0;
|
||||
|
||||
FT_TRACE2(( " %c%c%c%c %08d %08d %08ld %08ld %08ld\n",
|
||||
(FT_Char)( table->Tag >> 24 ),
|
||||
|
@ -2010,6 +2004,7 @@
|
|||
|
||||
FT_TRACE4(( "Number of fonts in TTC: %d\n", woff2.num_fonts ));
|
||||
|
||||
/* pre-zero pointers within in case of failure */
|
||||
if ( FT_NEW_ARRAY( woff2.ttc_fonts, woff2.num_fonts ) )
|
||||
goto Exit;
|
||||
|
||||
|
@ -2023,7 +2018,7 @@
|
|||
if ( FT_READ_ULONG( ttc_font->flavor ) )
|
||||
goto Exit;
|
||||
|
||||
if ( FT_NEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) )
|
||||
if ( FT_QNEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) )
|
||||
goto Exit;
|
||||
|
||||
FT_TRACE5(( "Number of tables in font %d: %d\n",
|
||||
|
@ -2104,7 +2099,7 @@
|
|||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
}
|
||||
file_offset = ROUND4(woff2.metaOffset + woff2.metaLength);
|
||||
file_offset = ROUND4( woff2.metaOffset + woff2.metaLength );
|
||||
}
|
||||
|
||||
if ( woff2.privOffset )
|
||||
|
@ -2114,7 +2109,7 @@
|
|||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
}
|
||||
file_offset = ROUND4(woff2.privOffset + woff2.privLength);
|
||||
file_offset = ROUND4( woff2.privOffset + woff2.privLength );
|
||||
}
|
||||
|
||||
if ( file_offset != ( ROUND4( woff2.length ) ) )
|
||||
|
@ -2302,9 +2297,9 @@
|
|||
{
|
||||
FT_TRACE5(( "Trimming sfnt stream from %lu to %lu.\n",
|
||||
sfnt_size, woff2.actual_sfnt_size ));
|
||||
if ( FT_REALLOC( sfnt,
|
||||
(FT_ULong)( sfnt_size ),
|
||||
(FT_ULong)( woff2.actual_sfnt_size ) ) )
|
||||
if ( FT_QREALLOC( sfnt,
|
||||
(FT_ULong)( sfnt_size ),
|
||||
(FT_ULong)( woff2.actual_sfnt_size ) ) )
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
|
|
|
@ -465,7 +465,7 @@
|
|||
if ( 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_Int delta;
|
||||
FT_UInt offset;
|
||||
|
|
|
@ -30,10 +30,17 @@
|
|||
#include <freetype/internal/ftcalc.h>
|
||||
#include <freetype/internal/ftdebug.h>
|
||||
#include <freetype/internal/ftstream.h>
|
||||
#include <freetype/internal/services/svmm.h>
|
||||
#include <freetype/tttags.h>
|
||||
#include <freetype/ftcolor.h>
|
||||
#include <freetype/config/integer-types.h>
|
||||
|
||||
/* the next two code lines are a temporary hack, to be removed together */
|
||||
/* with `VARIABLE_COLRV1_ENABLED` and related code as soon as variable */
|
||||
/* 'COLR' support is complete and tested */
|
||||
#include "../truetype/ttobjs.h"
|
||||
#include "../truetype/ttdriver.h"
|
||||
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_COLOR_LAYERS
|
||||
|
||||
|
@ -50,13 +57,33 @@
|
|||
#define COLR_HEADER_SIZE 14U
|
||||
|
||||
|
||||
#define VARIABLE_COLRV1_ENABLED \
|
||||
( ((TT_Driver)FT_FACE_DRIVER( face ))->root.clazz == \
|
||||
&tt_driver_class && \
|
||||
((TT_Driver)FT_FACE_DRIVER( face ))->enable_variable_colrv1 )
|
||||
|
||||
|
||||
typedef enum FT_PaintFormat_Internal_
|
||||
{
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER = 18,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM = 20,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER = 22,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER = 26,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER = 30
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID = 3,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_LINEAR_GRADIENT = 5,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_RADIAL_GRADIENT = 7,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SWEEP_GRADIENT = 9,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM = 13,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE = 15,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE = 17,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER = 18,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER = 19,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM = 20,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM = 21,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER = 22,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER = 23,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE = 25,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER = 26,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER = 27,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW = 29,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER = 30,
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER = 31,
|
||||
|
||||
} FT_PaintFormat_Internal;
|
||||
|
||||
|
@ -104,6 +131,10 @@
|
|||
*/
|
||||
FT_Byte* paints_start_v1;
|
||||
|
||||
/* Item Variation Store for variable 'COLR' v1. */
|
||||
GX_ItemVarStoreRec var_store;
|
||||
GX_DeltaSetIdxMapRec delta_set_idx_map;
|
||||
|
||||
/* The memory that backs up the `COLR' table. */
|
||||
void* table;
|
||||
FT_ULong table_size;
|
||||
|
@ -138,7 +169,9 @@
|
|||
FT_ULong base_glyph_offset, layer_offset;
|
||||
FT_ULong base_glyphs_offset_v1, num_base_glyphs_v1;
|
||||
FT_ULong layer_offset_v1, num_layers_v1, clip_list_offset;
|
||||
FT_ULong var_idx_map_offset, var_store_offset;
|
||||
FT_ULong table_size;
|
||||
FT_ULong colr_offset_in_stream;
|
||||
|
||||
|
||||
/* `COLR' always needs `CPAL' */
|
||||
|
@ -149,6 +182,8 @@
|
|||
if ( error )
|
||||
goto NoColr;
|
||||
|
||||
colr_offset_in_stream = FT_STREAM_POS();
|
||||
|
||||
if ( table_size < COLR_HEADER_SIZE )
|
||||
goto InvalidTable;
|
||||
|
||||
|
@ -239,6 +274,64 @@
|
|||
colr->clip_list = (FT_Byte*)( table + clip_list_offset );
|
||||
else
|
||||
colr->clip_list = 0;
|
||||
|
||||
colr->var_store.dataCount = 0;
|
||||
colr->var_store.varData = NULL;
|
||||
colr->var_store.axisCount = 0;
|
||||
colr->var_store.regionCount = 0;
|
||||
colr->var_store.varRegionList = 0;
|
||||
|
||||
colr->delta_set_idx_map.mapCount = 0;
|
||||
colr->delta_set_idx_map.outerIndex = NULL;
|
||||
colr->delta_set_idx_map.innerIndex = NULL;
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
|
||||
|
||||
|
||||
var_idx_map_offset = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( var_idx_map_offset >= table_size )
|
||||
goto InvalidTable;
|
||||
|
||||
var_store_offset = FT_NEXT_ULONG( p );
|
||||
if ( var_store_offset >= table_size )
|
||||
goto InvalidTable;
|
||||
|
||||
if ( var_store_offset )
|
||||
{
|
||||
/* If variation info has not been initialized yet, try doing so, */
|
||||
/* otherwise loading the variation store will fail as it */
|
||||
/* requires access to `blend` for checking the number of axes. */
|
||||
if ( !face->blend )
|
||||
if ( mm->get_mm_var( FT_FACE( face ), NULL ) )
|
||||
goto InvalidTable;
|
||||
|
||||
/* Try loading `VarIdxMap` and `VarStore`. */
|
||||
error = mm->load_item_var_store(
|
||||
FT_FACE( face ),
|
||||
colr_offset_in_stream + var_store_offset,
|
||||
&colr->var_store );
|
||||
if ( error != FT_Err_Ok )
|
||||
goto InvalidTable;
|
||||
}
|
||||
|
||||
if ( colr->var_store.axisCount && var_idx_map_offset )
|
||||
{
|
||||
error = mm->load_delta_set_idx_map(
|
||||
FT_FACE( face ),
|
||||
colr_offset_in_stream + var_idx_map_offset,
|
||||
&colr->delta_set_idx_map,
|
||||
&colr->var_store,
|
||||
table_size );
|
||||
if ( error != FT_Err_Ok )
|
||||
goto InvalidTable;
|
||||
}
|
||||
}
|
||||
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
||||
}
|
||||
|
||||
colr->base_glyphs = (FT_Byte*)( table + base_glyph_offset );
|
||||
|
@ -251,6 +344,19 @@
|
|||
return FT_Err_Ok;
|
||||
|
||||
InvalidTable:
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
|
||||
|
||||
|
||||
mm->done_delta_set_idx_map( FT_FACE( face ),
|
||||
&colr->delta_set_idx_map );
|
||||
mm->done_item_var_store( FT_FACE( face ),
|
||||
&colr->var_store );
|
||||
}
|
||||
#endif
|
||||
|
||||
error = FT_THROW( Invalid_Table );
|
||||
|
||||
NoColr:
|
||||
|
@ -272,6 +378,18 @@
|
|||
|
||||
if ( colr )
|
||||
{
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
|
||||
|
||||
|
||||
mm->done_delta_set_idx_map( FT_FACE( face ),
|
||||
&colr->delta_set_idx_map );
|
||||
mm->done_item_var_store( FT_FACE( face ),
|
||||
&colr->var_store );
|
||||
}
|
||||
#endif
|
||||
FT_FRAME_RELEASE( colr->table );
|
||||
FT_FREE( colr );
|
||||
}
|
||||
|
@ -372,8 +490,9 @@
|
|||
|
||||
|
||||
static FT_Bool
|
||||
read_color_line( FT_Byte* color_line_p,
|
||||
FT_ColorLine *colorline )
|
||||
read_color_line( FT_Byte* color_line_p,
|
||||
FT_ColorLine* colorline,
|
||||
FT_Bool read_variable )
|
||||
{
|
||||
FT_Byte* p = color_line_p;
|
||||
FT_PaintExtend paint_extend;
|
||||
|
@ -388,6 +507,7 @@
|
|||
colorline->color_stop_iterator.num_color_stops = FT_NEXT_USHORT( p );
|
||||
colorline->color_stop_iterator.p = p;
|
||||
colorline->color_stop_iterator.current_color_stop = 0;
|
||||
colorline->color_stop_iterator.read_variable = read_variable;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -428,13 +548,81 @@
|
|||
}
|
||||
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
|
||||
static FT_Bool
|
||||
read_paint( Colr* colr,
|
||||
get_deltas_for_var_index_base ( TT_Face face,
|
||||
Colr* colr,
|
||||
FT_ULong var_index_base,
|
||||
FT_UInt num_deltas,
|
||||
FT_ItemVarDelta* deltas )
|
||||
{
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
||||
FT_UInt outer_index = 0;
|
||||
FT_UInt inner_index = 0;
|
||||
FT_ULong loop_var_index = var_index_base;
|
||||
|
||||
FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm;
|
||||
|
||||
FT_UInt i = 0;
|
||||
|
||||
|
||||
if ( !VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
FT_ASSERT( 0 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( var_index_base == 0xFFFFFFFF )
|
||||
{
|
||||
for ( i = 0; i < num_deltas; ++i )
|
||||
deltas[i] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
for ( i = 0; i < num_deltas; ++i )
|
||||
{
|
||||
loop_var_index = var_index_base + i;
|
||||
|
||||
if ( colr->delta_set_idx_map.innerIndex )
|
||||
{
|
||||
if ( loop_var_index >= colr->delta_set_idx_map.mapCount )
|
||||
loop_var_index = colr->delta_set_idx_map.mapCount - 1;
|
||||
|
||||
outer_index = colr->delta_set_idx_map.outerIndex[loop_var_index];
|
||||
inner_index = colr->delta_set_idx_map.innerIndex[loop_var_index];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: Direct lookup case not implemented or tested yet. */
|
||||
FT_ASSERT( 0 );
|
||||
error = FT_THROW( Unimplemented_Feature );
|
||||
return error;
|
||||
}
|
||||
|
||||
deltas[i] = mm->get_item_delta( FT_FACE( face ), &colr->var_store,
|
||||
outer_index, inner_index );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
||||
|
||||
|
||||
static FT_Bool
|
||||
read_paint( TT_Face face,
|
||||
Colr* colr,
|
||||
FT_Byte* p,
|
||||
FT_COLR_Paint* apaint )
|
||||
{
|
||||
FT_Byte* paint_base = p;
|
||||
FT_Byte* child_table_p = NULL;
|
||||
FT_Byte* paint_base = p;
|
||||
FT_Byte* child_table_p = NULL;
|
||||
FT_Bool do_read_var = FALSE;
|
||||
FT_ULong var_index_base = 0;
|
||||
/* Longest varIndexBase offset is 5 in the spec. */
|
||||
FT_ItemVarDelta item_deltas[6] = { 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
|
||||
if ( !p || !colr || !colr->table )
|
||||
|
@ -475,11 +663,30 @@
|
|||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SOLID )
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SOLID ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID )
|
||||
{
|
||||
apaint->u.solid.color.palette_index = FT_NEXT_USHORT( p );
|
||||
apaint->u.solid.color.alpha = FT_NEXT_SHORT( p );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 1,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.solid.color.alpha += item_deltas[0];
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_SOLID;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -500,10 +707,14 @@
|
|||
if ( !get_child_table_pointer( colr, paint_base, &p, &child_table_p ) )
|
||||
return 0;
|
||||
|
||||
if ( apaint->format == FT_COLR_PAINTFORMAT_LINEAR_GRADIENT )
|
||||
if ( apaint->format == FT_COLR_PAINTFORMAT_LINEAR_GRADIENT ||
|
||||
( do_read_var =
|
||||
( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_LINEAR_GRADIENT ) ) )
|
||||
{
|
||||
if ( !read_color_line( child_table_p,
|
||||
&apaint->u.linear_gradient.colorline ) )
|
||||
&apaint->u.linear_gradient.colorline,
|
||||
do_read_var ) )
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -517,16 +728,40 @@
|
|||
apaint->u.linear_gradient.p2.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
apaint->u.linear_gradient.p2.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( do_read_var && VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG ( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.linear_gradient.p0.x += INT_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.linear_gradient.p0.y += INT_TO_FIXED( item_deltas[1] );
|
||||
apaint->u.linear_gradient.p1.x += INT_TO_FIXED( item_deltas[2] );
|
||||
apaint->u.linear_gradient.p1.y += INT_TO_FIXED( item_deltas[3] );
|
||||
apaint->u.linear_gradient.p2.x += INT_TO_FIXED( item_deltas[4] );
|
||||
apaint->u.linear_gradient.p2.y += INT_TO_FIXED( item_deltas[5] );
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_LINEAR_GRADIENT;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_RADIAL_GRADIENT )
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_RADIAL_GRADIENT ||
|
||||
( do_read_var =
|
||||
( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_RADIAL_GRADIENT ) ) )
|
||||
{
|
||||
FT_Pos tmp;
|
||||
|
||||
|
||||
if ( !read_color_line( child_table_p,
|
||||
&apaint->u.radial_gradient.colorline ) )
|
||||
&apaint->u.radial_gradient.colorline,
|
||||
do_read_var ) )
|
||||
return 0;
|
||||
|
||||
/* In the OpenType specification, `r0` and `r1` are defined as */
|
||||
|
@ -546,13 +781,41 @@
|
|||
tmp = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
apaint->u.radial_gradient.r1 = tmp < 0 ? FT_INT_MAX : tmp;
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( do_read_var && VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG ( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.radial_gradient.c0.x += INT_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.radial_gradient.c0.y += INT_TO_FIXED( item_deltas[1] );
|
||||
|
||||
// TODO: Anything to be done about UFWORD deltas here?
|
||||
apaint->u.radial_gradient.r0 += INT_TO_FIXED( item_deltas[2] );
|
||||
|
||||
apaint->u.radial_gradient.c1.x += INT_TO_FIXED( item_deltas[3] );
|
||||
apaint->u.radial_gradient.c1.y += INT_TO_FIXED( item_deltas[4] );
|
||||
|
||||
apaint->u.radial_gradient.r1 += INT_TO_FIXED( item_deltas[5] );
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_RADIAL_GRADIENT;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SWEEP_GRADIENT )
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SWEEP_GRADIENT ||
|
||||
( do_read_var =
|
||||
( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SWEEP_GRADIENT ) ) )
|
||||
{
|
||||
if ( !read_color_line( child_table_p,
|
||||
&apaint->u.sweep_gradient.colorline ) )
|
||||
&apaint->u.sweep_gradient.colorline,
|
||||
do_read_var) )
|
||||
return 0;
|
||||
|
||||
apaint->u.sweep_gradient.center.x =
|
||||
|
@ -565,6 +828,27 @@
|
|||
apaint->u.sweep_gradient.end_angle =
|
||||
F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( do_read_var && VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG ( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
// TODO: Handle overflow?
|
||||
apaint->u.sweep_gradient.center.x += INT_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.sweep_gradient.center.y += INT_TO_FIXED( item_deltas[1] );
|
||||
|
||||
apaint->u.sweep_gradient.start_angle +=
|
||||
F2DOT14_TO_FIXED( item_deltas[2] );
|
||||
apaint->u.sweep_gradient.end_angle +=
|
||||
F2DOT14_TO_FIXED( item_deltas[3] );
|
||||
}
|
||||
#endif
|
||||
apaint->format = FT_COLR_PAINTFORMAT_SWEEP_GRADIENT;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -577,7 +861,9 @@
|
|||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSFORM )
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSFORM ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM )
|
||||
{
|
||||
apaint->u.transform.paint.p = child_table_p;
|
||||
apaint->u.transform.paint.insert_root_transform = 0;
|
||||
|
@ -598,10 +884,34 @@
|
|||
apaint->u.transform.affine.dx = FT_NEXT_LONG( p );
|
||||
apaint->u.transform.affine.dy = FT_NEXT_LONG( p );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.transform.affine.xx += (FT_Fixed)item_deltas[0];
|
||||
apaint->u.transform.affine.yx += (FT_Fixed)item_deltas[1];
|
||||
apaint->u.transform.affine.xy += (FT_Fixed)item_deltas[2];
|
||||
apaint->u.transform.affine.yy += (FT_Fixed)item_deltas[3];
|
||||
apaint->u.transform.affine.dx += (FT_Fixed)item_deltas[4];
|
||||
apaint->u.transform.affine.dy += (FT_Fixed)item_deltas[5];
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_TRANSFORM;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSLATE )
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSLATE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE )
|
||||
{
|
||||
apaint->u.translate.paint.p = child_table_p;
|
||||
apaint->u.translate.paint.insert_root_transform = 0;
|
||||
|
@ -609,17 +919,30 @@
|
|||
apaint->u.translate.dx = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
apaint->u.translate.dy = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.translate.dx += INT_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.translate.dy += INT_TO_FIXED( item_deltas[1] );
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_TRANSLATE;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_SCALE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER )
|
||||
else if ( apaint->format >= FT_COLR_PAINTFORMAT_SCALE &&
|
||||
(FT_PaintFormat_Internal)apaint->format <=
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER )
|
||||
{
|
||||
apaint->u.scale.paint.p = child_table_p;
|
||||
apaint->u.scale.paint.insert_root_transform = 0;
|
||||
|
@ -628,10 +951,13 @@
|
|||
apaint->u.scale.scale_x = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
/* Non-uniform ones read an extra y value. */
|
||||
if ( apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_SCALE ||
|
||||
if ( apaint->format == FT_COLR_PAINTFORMAT_SCALE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER )
|
||||
apaint->u.scale.scale_y = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
else
|
||||
apaint->u.scale.scale_y = apaint->u.scale.scale_x;
|
||||
|
@ -639,9 +965,13 @@
|
|||
/* Scale paints that have a center read center coordinates, */
|
||||
/* otherwise the center is (0,0). */
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER ||
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER )
|
||||
{
|
||||
apaint->u.scale.center_x = INT_TO_FIXED( FT_NEXT_SHORT ( p ) );
|
||||
apaint->u.scale.center_y = INT_TO_FIXED( FT_NEXT_SHORT ( p ) );
|
||||
|
@ -652,6 +982,71 @@
|
|||
apaint->u.scale.center_y = 0;
|
||||
}
|
||||
|
||||
/* Base values set, now handle variations. */
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER ) &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[1] );
|
||||
}
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[1] );
|
||||
apaint->u.scale.center_x += INT_TO_FIXED( item_deltas[2] );
|
||||
apaint->u.scale.center_y += INT_TO_FIXED( item_deltas[3] );
|
||||
}
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 1,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
}
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 3,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.scale.center_x += INT_TO_FIXED( item_deltas[1] );
|
||||
apaint->u.scale.center_y += INT_TO_FIXED( item_deltas[2] );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* FT 'COLR' v1 API output format always returns fully defined */
|
||||
/* structs; we thus set the format to the public API value. */
|
||||
apaint->format = FT_COLR_PAINTFORMAT_SCALE;
|
||||
|
@ -659,17 +1054,26 @@
|
|||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE ||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER )
|
||||
{
|
||||
FT_UInt num_deltas = 0;
|
||||
|
||||
|
||||
apaint->u.rotate.paint.p = child_table_p;
|
||||
apaint->u.rotate.paint.insert_root_transform = 0;
|
||||
|
||||
apaint->u.rotate.angle = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER )
|
||||
{
|
||||
apaint->u.rotate.center_x = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
apaint->u.rotate.center_y = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
@ -680,14 +1084,52 @@
|
|||
apaint->u.rotate.center_y = 0;
|
||||
}
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER ) &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER )
|
||||
num_deltas = 3;
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE )
|
||||
num_deltas = 1;
|
||||
|
||||
if ( num_deltas > 0 )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base,
|
||||
num_deltas, item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.rotate.angle += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
|
||||
if ( num_deltas == 3 )
|
||||
{
|
||||
apaint->u.rotate.center_x += INT_TO_FIXED( item_deltas[1] );
|
||||
apaint->u.rotate.center_y += INT_TO_FIXED( item_deltas[2] );
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_ROTATE;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW ||
|
||||
else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER )
|
||||
{
|
||||
apaint->u.skew.paint.p = child_table_p;
|
||||
apaint->u.skew.paint.insert_root_transform = 0;
|
||||
|
@ -696,7 +1138,9 @@
|
|||
apaint->u.skew.y_skew_angle = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER )
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER )
|
||||
{
|
||||
apaint->u.skew.center_x = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
apaint->u.skew.center_y = INT_TO_FIXED( FT_NEXT_SHORT( p ) );
|
||||
|
@ -707,6 +1151,42 @@
|
|||
apaint->u.skew.center_y = 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW ||
|
||||
(FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER ) &&
|
||||
VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.skew.x_skew_angle += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.skew.y_skew_angle += F2DOT14_TO_FIXED( item_deltas[1] );
|
||||
}
|
||||
|
||||
if ( (FT_PaintFormat_Internal)apaint->format ==
|
||||
FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
apaint->u.skew.x_skew_angle += F2DOT14_TO_FIXED( item_deltas[0] );
|
||||
apaint->u.skew.y_skew_angle += F2DOT14_TO_FIXED( item_deltas[1] );
|
||||
apaint->u.skew.center_x += INT_TO_FIXED( item_deltas[2] );
|
||||
apaint->u.skew.center_y += INT_TO_FIXED( item_deltas[3] );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
apaint->format = FT_COLR_PAINTFORMAT_SKEW;
|
||||
|
||||
return 1;
|
||||
|
@ -1037,6 +1517,8 @@
|
|||
Colr* colr = (Colr*)face->colr;
|
||||
|
||||
FT_Byte* p;
|
||||
FT_Long var_index_base;
|
||||
FT_Int item_deltas[2];
|
||||
|
||||
|
||||
if ( !colr || !colr->table )
|
||||
|
@ -1054,12 +1536,34 @@
|
|||
/* Iterator points at first `ColorStop` of `ColorLine`. */
|
||||
p = iterator->p;
|
||||
|
||||
color_stop->stop_offset = FT_NEXT_SHORT( p );
|
||||
color_stop->stop_offset = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
||||
|
||||
color_stop->color.palette_index = FT_NEXT_USHORT( p );
|
||||
|
||||
color_stop->color.alpha = FT_NEXT_SHORT( p );
|
||||
|
||||
if ( iterator->read_variable )
|
||||
{
|
||||
/* Pointer p needs to be advanced independently of whether we intend */
|
||||
/* to take variable deltas into account or not. Otherwise iteration */
|
||||
/* would fail due to wrong offsets. */
|
||||
var_index_base = FT_NEXT_ULONG( p );
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( VARIABLE_COLRV1_ENABLED )
|
||||
{
|
||||
if ( !get_deltas_for_var_index_base( face, colr,
|
||||
var_index_base,
|
||||
2,
|
||||
item_deltas ) )
|
||||
return 0;
|
||||
|
||||
color_stop->stop_offset += (FT_Fixed)item_deltas[0] << 2;
|
||||
color_stop->color.alpha += item_deltas[1];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
iterator->p = p;
|
||||
iterator->current_color_stop++;
|
||||
|
||||
|
@ -1139,7 +1643,7 @@
|
|||
return 1;
|
||||
}
|
||||
|
||||
return read_paint( colr, opaque_paint.p, paint );
|
||||
return read_paint( face, colr, opaque_paint.p, paint );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -306,7 +306,7 @@
|
|||
}
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( var )
|
||||
if ( var && face->blend )
|
||||
{
|
||||
FT_Face f = FT_FACE( face );
|
||||
FT_Int a = (FT_Int)*aadvance;
|
||||
|
|
|
@ -1909,10 +1909,10 @@ typedef ptrdiff_t FT_PtrDist;
|
|||
|
||||
|
||||
static int
|
||||
gray_convert_glyph_inner( RAS_ARG,
|
||||
gray_convert_glyph_inner( RAS_ARG_
|
||||
int continued )
|
||||
{
|
||||
int error;
|
||||
volatile int error;
|
||||
|
||||
|
||||
if ( ft_setjmp( ras.jump_buffer ) == 0 )
|
||||
|
@ -2004,7 +2004,7 @@ typedef ptrdiff_t FT_PtrDist;
|
|||
ras.max_ey = band[0];
|
||||
ras.count_ey = width;
|
||||
|
||||
error = gray_convert_glyph_inner( RAS_VAR, continued );
|
||||
error = gray_convert_glyph_inner( RAS_VAR_ continued );
|
||||
continued = 1;
|
||||
|
||||
if ( !error )
|
||||
|
|
|
@ -108,6 +108,23 @@
|
|||
return error;
|
||||
}
|
||||
|
||||
if ( !ft_strcmp( property_name, "TEMPORARY-enable-variable-colrv1" ) )
|
||||
{
|
||||
/* This flag is temporary and can't be set with environment variables. */
|
||||
if ( !value_is_string )
|
||||
{
|
||||
FT_Bool* bv = (FT_Bool*)value;
|
||||
|
||||
if ( *bv == TRUE || *bv == FALSE)
|
||||
driver->enable_variable_colrv1 = *bv;
|
||||
else
|
||||
error = FT_ERR( Unimplemented_Feature );
|
||||
} else
|
||||
error = FT_ERR( Invalid_Argument );
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
FT_TRACE2(( "tt_property_set: missing property `%s'\n",
|
||||
property_name ));
|
||||
return FT_THROW( Missing_Property );
|
||||
|
@ -507,19 +524,34 @@
|
|||
FT_DEFINE_SERVICE_MULTIMASTERSREC(
|
||||
tt_service_gx_multi_masters,
|
||||
|
||||
(FT_Get_MM_Func) NULL, /* get_mm */
|
||||
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */
|
||||
(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_Var_Func) TT_Get_MM_Var, /* get_mm_var */
|
||||
(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_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */
|
||||
(FT_Set_MM_WeightVector_Func)NULL, /* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)NULL, /* get_mm_weightvector */
|
||||
|
||||
(FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */
|
||||
(FT_Done_Blend_Func) tt_done_blend /* done_blend */
|
||||
(FT_Get_MM_Func) NULL, /* get_mm */
|
||||
(FT_Set_MM_Design_Func) NULL, /* set_mm_design */
|
||||
(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_Var_Func) TT_Get_MM_Var, /* get_mm_var */
|
||||
(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_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */
|
||||
(FT_Set_MM_WeightVector_Func)
|
||||
NULL, /* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)
|
||||
NULL, /* get_mm_weightvector */
|
||||
(FT_Var_Load_Delta_Set_Idx_Map_Func)
|
||||
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(
|
||||
|
|
|
@ -801,7 +801,7 @@
|
|||
FT_UInt start_point,
|
||||
FT_UInt start_contour )
|
||||
{
|
||||
zone->n_points = (FT_UShort)load->outline.n_points -
|
||||
zone->n_points = (FT_UShort)load->outline.n_points + 4 -
|
||||
(FT_UShort)start_point;
|
||||
zone->n_contours = load->outline.n_contours -
|
||||
(FT_Short)start_contour;
|
||||
|
@ -970,11 +970,6 @@
|
|||
outline->points[n_points + 2] = loader->pp3;
|
||||
outline->points[n_points + 3] = loader->pp4;
|
||||
|
||||
outline->tags[n_points ] = 0;
|
||||
outline->tags[n_points + 1] = 0;
|
||||
outline->tags[n_points + 2] = 0;
|
||||
outline->tags[n_points + 3] = 0;
|
||||
|
||||
n_points += 4;
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
|
@ -985,24 +980,9 @@
|
|||
goto Exit;
|
||||
|
||||
/* Deltas apply to the unscaled data. */
|
||||
error = TT_Vary_Apply_Glyph_Deltas( loader->face,
|
||||
loader->glyph_index,
|
||||
error = TT_Vary_Apply_Glyph_Deltas( loader,
|
||||
outline,
|
||||
unrounded,
|
||||
(FT_UInt)n_points );
|
||||
|
||||
/* recalculate linear horizontal and vertical advances */
|
||||
/* if we don't have HVAR and VVAR, respectively */
|
||||
|
||||
/* XXX: change all FreeType modules to store `linear' and `vadvance' */
|
||||
/* in 26.6 format before the `base' module scales them to 16.16 */
|
||||
if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x -
|
||||
unrounded[n_points - 4].x ) / 64;
|
||||
if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].x -
|
||||
unrounded[n_points - 2].x ) / 64;
|
||||
|
||||
unrounded );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
}
|
||||
|
@ -1014,7 +994,7 @@
|
|||
tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
|
||||
|
||||
FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
|
||||
loader->zone.n_points + 4 );
|
||||
loader->zone.n_points );
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -1104,8 +1084,8 @@
|
|||
|
||||
for ( ; vec < limit; vec++, u++ )
|
||||
{
|
||||
vec->x = ( FT_MulFix( u->x, x_scale ) + 32 ) >> 6;
|
||||
vec->y = ( FT_MulFix( u->y, y_scale ) + 32 ) >> 6;
|
||||
vec->x = ADD_LONG( FT_MulFix( u->x, x_scale ), 32 ) >> 6;
|
||||
vec->y = ADD_LONG( FT_MulFix( u->y, y_scale ), 32 ) >> 6;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1156,11 +1136,7 @@
|
|||
}
|
||||
|
||||
if ( IS_HINTED( loader->load_flags ) )
|
||||
{
|
||||
loader->zone.n_points += 4;
|
||||
|
||||
error = TT_Hint_Glyph( loader, 0 );
|
||||
}
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
Exit:
|
||||
|
@ -1228,8 +1204,8 @@
|
|||
p1 = gloader->base.outline.points + k;
|
||||
p2 = gloader->base.outline.points + l;
|
||||
|
||||
x = p1->x - p2->x;
|
||||
y = p1->y - p2->y;
|
||||
x = SUB_LONG( p1->x, p2->x );
|
||||
y = SUB_LONG( p1->y, p2->y );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1373,11 +1349,6 @@
|
|||
outline->points[outline->n_points + 2] = loader->pp3;
|
||||
outline->points[outline->n_points + 3] = loader->pp4;
|
||||
|
||||
outline->tags[outline->n_points ] = 0;
|
||||
outline->tags[outline->n_points + 1] = 0;
|
||||
outline->tags[outline->n_points + 2] = 0;
|
||||
outline->tags[outline->n_points + 3] = 0;
|
||||
|
||||
#ifdef TT_USE_BYTECODE_INTERPRETER
|
||||
|
||||
{
|
||||
|
@ -1436,11 +1407,9 @@
|
|||
|
||||
/* Some points are likely touched during execution of */
|
||||
/* instructions on components. So let's untouch them. */
|
||||
for ( i = 0; i < loader->zone.n_points; i++ )
|
||||
for ( i = 0; i < loader->zone.n_points - 4U; i++ )
|
||||
loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
|
||||
|
||||
loader->zone.n_points += 4;
|
||||
|
||||
return TT_Hint_Glyph( loader, 1 );
|
||||
}
|
||||
|
||||
|
@ -1761,57 +1730,29 @@
|
|||
/* a small outline structure with four elements for */
|
||||
/* communication with `TT_Vary_Apply_Glyph_Deltas' */
|
||||
FT_Vector points[4];
|
||||
char tags[4] = { 1, 1, 1, 1 };
|
||||
short contours[4] = { 0, 1, 2, 3 };
|
||||
FT_Outline outline;
|
||||
|
||||
/* unrounded values */
|
||||
FT_Vector unrounded[4] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} };
|
||||
|
||||
|
||||
points[0].x = loader->pp1.x;
|
||||
points[0].y = loader->pp1.y;
|
||||
points[1].x = loader->pp2.x;
|
||||
points[1].y = loader->pp2.y;
|
||||
points[0] = loader->pp1;
|
||||
points[1] = loader->pp2;
|
||||
points[2] = loader->pp3;
|
||||
points[3] = loader->pp4;
|
||||
|
||||
points[2].x = loader->pp3.x;
|
||||
points[2].y = loader->pp3.y;
|
||||
points[3].x = loader->pp4.x;
|
||||
points[3].y = loader->pp4.y;
|
||||
|
||||
outline.n_points = 4;
|
||||
outline.n_contours = 4;
|
||||
outline.n_points = 0;
|
||||
outline.n_contours = 0;
|
||||
outline.points = points;
|
||||
outline.tags = tags;
|
||||
outline.contours = contours;
|
||||
outline.tags = NULL;
|
||||
outline.contours = NULL;
|
||||
|
||||
/* this must be done before scaling */
|
||||
error = TT_Vary_Apply_Glyph_Deltas( loader->face,
|
||||
glyph_index,
|
||||
error = TT_Vary_Apply_Glyph_Deltas( loader,
|
||||
&outline,
|
||||
unrounded,
|
||||
(FT_UInt)outline.n_points );
|
||||
unrounded );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
loader->pp1.x = points[0].x;
|
||||
loader->pp1.y = points[0].y;
|
||||
loader->pp2.x = points[1].x;
|
||||
loader->pp2.y = points[1].y;
|
||||
|
||||
loader->pp3.x = points[2].x;
|
||||
loader->pp3.y = points[2].y;
|
||||
loader->pp4.x = points[3].x;
|
||||
loader->pp4.y = points[3].y;
|
||||
|
||||
/* recalculate linear horizontal and vertical advances */
|
||||
/* if we don't have HVAR and VVAR, respectively */
|
||||
if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
loader->linear = FT_PIX_ROUND( unrounded[1].x -
|
||||
unrounded[0].x ) / 64;
|
||||
if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
loader->vadvance = FT_PIX_ROUND( unrounded[3].x -
|
||||
unrounded[2].x ) / 64;
|
||||
}
|
||||
|
||||
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
||||
|
@ -1959,17 +1900,16 @@
|
|||
|
||||
/* construct an outline structure for */
|
||||
/* communication with `TT_Vary_Apply_Glyph_Deltas' */
|
||||
outline.n_points = (short)( gloader->current.num_subglyphs + 4 );
|
||||
outline.n_contours = outline.n_points;
|
||||
outline.n_contours = outline.n_points = limit;
|
||||
|
||||
outline.points = NULL;
|
||||
outline.tags = NULL;
|
||||
outline.contours = NULL;
|
||||
|
||||
if ( FT_NEW_ARRAY( points, outline.n_points ) ||
|
||||
FT_NEW_ARRAY( tags, outline.n_points ) ||
|
||||
FT_NEW_ARRAY( contours, outline.n_points ) ||
|
||||
FT_NEW_ARRAY( unrounded, outline.n_points ) )
|
||||
if ( FT_NEW_ARRAY( points, limit + 4 ) ||
|
||||
FT_NEW_ARRAY( tags, limit + 4 ) ||
|
||||
FT_NEW_ARRAY( contours, limit + 4 ) ||
|
||||
FT_NEW_ARRAY( unrounded, limit + 4 ) )
|
||||
goto Exit1;
|
||||
|
||||
subglyph = gloader->current.subglyphs;
|
||||
|
@ -1985,28 +1925,10 @@
|
|||
contours[i] = i;
|
||||
}
|
||||
|
||||
points[i].x = loader->pp1.x;
|
||||
points[i].y = loader->pp1.y;
|
||||
tags[i] = 1;
|
||||
contours[i] = i;
|
||||
|
||||
i++;
|
||||
points[i].x = loader->pp2.x;
|
||||
points[i].y = loader->pp2.y;
|
||||
tags[i] = 1;
|
||||
contours[i] = i;
|
||||
|
||||
i++;
|
||||
points[i].x = loader->pp3.x;
|
||||
points[i].y = loader->pp3.y;
|
||||
tags[i] = 1;
|
||||
contours[i] = i;
|
||||
|
||||
i++;
|
||||
points[i].x = loader->pp4.x;
|
||||
points[i].y = loader->pp4.y;
|
||||
tags[i] = 1;
|
||||
contours[i] = i;
|
||||
points[i++] = loader->pp1;
|
||||
points[i++] = loader->pp2;
|
||||
points[i++] = loader->pp3;
|
||||
points[i ] = loader->pp4;
|
||||
|
||||
outline.points = points;
|
||||
outline.tags = tags;
|
||||
|
@ -2014,12 +1936,9 @@
|
|||
|
||||
/* this call provides additional offsets */
|
||||
/* for each component's translation */
|
||||
if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas(
|
||||
face,
|
||||
glyph_index,
|
||||
&outline,
|
||||
unrounded,
|
||||
(FT_UInt)outline.n_points ) ) )
|
||||
if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( loader,
|
||||
&outline,
|
||||
unrounded ) ) )
|
||||
goto Exit1;
|
||||
|
||||
subglyph = gloader->current.subglyphs;
|
||||
|
@ -2033,27 +1952,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
loader->pp1.x = points[i + 0].x;
|
||||
loader->pp1.y = points[i + 0].y;
|
||||
loader->pp2.x = points[i + 1].x;
|
||||
loader->pp2.y = points[i + 1].y;
|
||||
|
||||
loader->pp3.x = points[i + 2].x;
|
||||
loader->pp3.y = points[i + 2].y;
|
||||
loader->pp4.x = points[i + 3].x;
|
||||
loader->pp4.y = points[i + 3].y;
|
||||
|
||||
/* recalculate linear horizontal and vertical advances */
|
||||
/* if we don't have HVAR and VVAR, respectively */
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
loader->linear =
|
||||
FT_PIX_ROUND( unrounded[outline.n_points - 3].x -
|
||||
unrounded[outline.n_points - 4].x ) / 64;
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
loader->vadvance =
|
||||
FT_PIX_ROUND( unrounded[outline.n_points - 1].x -
|
||||
unrounded[outline.n_points - 2].x ) / 64;
|
||||
|
||||
Exit1:
|
||||
FT_FREE( outline.points );
|
||||
FT_FREE( outline.tags );
|
||||
|
@ -2255,7 +2153,7 @@
|
|||
if ( loader->widthp )
|
||||
glyph->metrics.horiAdvance = loader->widthp[glyph_index] * 64;
|
||||
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 */
|
||||
glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin );
|
||||
|
@ -3005,6 +2903,9 @@
|
|||
&topBearing,
|
||||
&advanceY );
|
||||
|
||||
glyph->linearHoriAdvance = advanceX;
|
||||
glyph->linearVertAdvance = advanceY;
|
||||
|
||||
advanceX = (FT_UShort)FT_MulDiv( advanceX,
|
||||
glyph->face->size->metrics.x_ppem,
|
||||
glyph->face->units_per_EM );
|
||||
|
|
|
@ -438,8 +438,8 @@
|
|||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
ft_var_load_item_variation_store( TT_Face face,
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
tt_var_load_item_variation_store( TT_Face face,
|
||||
FT_ULong offset,
|
||||
GX_ItemVarStore itemStore )
|
||||
{
|
||||
|
@ -465,7 +465,7 @@
|
|||
|
||||
if ( format != 1 )
|
||||
{
|
||||
FT_TRACE2(( "ft_var_load_item_variation_store: bad store format %d\n",
|
||||
FT_TRACE2(( "tt_var_load_item_variation_store: bad store format %d\n",
|
||||
format ));
|
||||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
|
@ -479,7 +479,17 @@
|
|||
/* we need at least one entry in `itemStore->varData' */
|
||||
if ( !itemStore->dataCount )
|
||||
{
|
||||
FT_TRACE2(( "ft_var_load_item_variation_store: missing varData\n" ));
|
||||
FT_TRACE2(( "tt_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 );
|
||||
goto Exit;
|
||||
}
|
||||
|
@ -505,7 +515,7 @@
|
|||
|
||||
if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis )
|
||||
{
|
||||
FT_TRACE2(( "ft_var_load_item_variation_store:"
|
||||
FT_TRACE2(( "tt_var_load_item_variation_store:"
|
||||
" number of axes in item variation store\n" ));
|
||||
FT_TRACE2(( " "
|
||||
" and `fvar' table are different\n" ));
|
||||
|
@ -516,7 +526,7 @@
|
|||
/* new constraint in OpenType 1.8.4 */
|
||||
if ( itemStore->regionCount >= 32768U )
|
||||
{
|
||||
FT_TRACE2(( "ft_var_load_item_variation_store:"
|
||||
FT_TRACE2(( "tt_var_load_item_variation_store:"
|
||||
" too many variation region tables\n" ));
|
||||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
|
@ -621,44 +631,25 @@
|
|||
varData->regionIdxCount * varData->itemCount ) )
|
||||
goto Exit;
|
||||
|
||||
/* the delta set is stored as a 2-dimensional array of shorts */
|
||||
if ( long_words )
|
||||
for ( j = 0; j < varData->itemCount * varData->regionIdxCount; )
|
||||
{
|
||||
/* new in OpenType 1.9, currently for 'COLR' table only; */
|
||||
/* the deltas are interpreted as 16.16 fixed-point scaling values */
|
||||
|
||||
/* not supported yet */
|
||||
|
||||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( j = 0; j < varData->itemCount * varData->regionIdxCount; )
|
||||
if ( long_words )
|
||||
{
|
||||
for ( k = 0; k < wordDeltaCount; k++, j++ )
|
||||
{
|
||||
/* read the short deltas */
|
||||
FT_Short delta;
|
||||
|
||||
|
||||
if ( FT_READ_SHORT( delta ) )
|
||||
if ( FT_READ_LONG( varData->deltaSet[j] ) )
|
||||
goto Exit;
|
||||
|
||||
varData->deltaSet[j] = delta;
|
||||
}
|
||||
|
||||
for ( ; k < varData->regionIdxCount; k++, j++ )
|
||||
{
|
||||
/* read the (signed) byte deltas */
|
||||
FT_Char delta;
|
||||
|
||||
|
||||
if ( FT_READ_CHAR( delta ) )
|
||||
if ( FT_READ_SHORT( varData->deltaSet[j] ) )
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( k = 0; k < wordDeltaCount; k++, j++ )
|
||||
if ( FT_READ_SHORT( varData->deltaSet[j] ) )
|
||||
goto Exit;
|
||||
for ( ; k < varData->regionIdxCount; k++, j++ )
|
||||
if ( FT_READ_CHAR( varData->deltaSet[j] ) )
|
||||
goto Exit;
|
||||
|
||||
varData->deltaSet[j] = delta;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -670,8 +661,8 @@
|
|||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
ft_var_load_delta_set_index_mapping( TT_Face face,
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
tt_var_load_delta_set_index_mapping( TT_Face face,
|
||||
FT_ULong offset,
|
||||
GX_DeltaSetIdxMap map,
|
||||
GX_ItemVarStore itemStore,
|
||||
|
@ -728,7 +719,7 @@
|
|||
/* rough sanity check */
|
||||
if ( map->mapCount * entrySize > table_len )
|
||||
{
|
||||
FT_TRACE1(( "ft_var_load_delta_set_index_mapping:"
|
||||
FT_TRACE1(( "tt_var_load_delta_set_index_mapping:"
|
||||
" invalid number of delta-set index mappings\n" ));
|
||||
error = FT_THROW( Invalid_Table );
|
||||
goto Exit;
|
||||
|
@ -758,6 +749,16 @@
|
|||
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;
|
||||
|
||||
if ( outerIndex >= itemStore->dataCount )
|
||||
|
@ -887,7 +888,7 @@
|
|||
table = blend->hvar_table;
|
||||
}
|
||||
|
||||
error = ft_var_load_item_variation_store(
|
||||
error = tt_var_load_item_variation_store(
|
||||
face,
|
||||
table_offset + store_offset,
|
||||
&table->itemStore );
|
||||
|
@ -896,7 +897,7 @@
|
|||
|
||||
if ( widthMap_offset )
|
||||
{
|
||||
error = ft_var_load_delta_set_index_mapping(
|
||||
error = tt_var_load_delta_set_index_mapping(
|
||||
face,
|
||||
table_offset + widthMap_offset,
|
||||
&table->widthMap,
|
||||
|
@ -938,20 +939,28 @@
|
|||
}
|
||||
|
||||
|
||||
static FT_Int
|
||||
ft_var_get_item_delta( TT_Face face,
|
||||
FT_LOCAL_DEF( FT_ItemVarDelta )
|
||||
tt_var_get_item_delta( TT_Face face,
|
||||
GX_ItemVarStore itemStore,
|
||||
FT_UInt outerIndex,
|
||||
FT_UInt innerIndex )
|
||||
{
|
||||
GX_ItemVarData varData;
|
||||
FT_Short* deltaSet;
|
||||
FT_Stream stream = FT_FACE_STREAM( face );
|
||||
FT_Memory memory = stream->memory;
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
||||
FT_UInt master, j;
|
||||
FT_Fixed netAdjustment = 0; /* accumulated adjustment */
|
||||
FT_Fixed scaledDelta;
|
||||
FT_Fixed delta;
|
||||
GX_ItemVarData varData;
|
||||
FT_ItemVarDelta* deltaSet;
|
||||
|
||||
FT_UInt master, j;
|
||||
FT_Fixed* scalars;
|
||||
FT_ItemVarDelta returnValue;
|
||||
|
||||
|
||||
/* OpenType 1.8.4+: No variation data for this item
|
||||
* as indices have special value 0xFFFF. */
|
||||
if (outerIndex == 0xFFFF && innerIndex == 0xFFFF)
|
||||
return 0;
|
||||
|
||||
/* See pseudo code from `Font Variations Overview' */
|
||||
/* in the OpenType specification. */
|
||||
|
@ -959,6 +968,9 @@
|
|||
varData = &itemStore->varData[outerIndex];
|
||||
deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex];
|
||||
|
||||
if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) )
|
||||
return 0;
|
||||
|
||||
/* outer loop steps through master designs to be blended */
|
||||
for ( master = 0; master < varData->regionIdxCount; master++ )
|
||||
{
|
||||
|
@ -1008,18 +1020,33 @@
|
|||
FT_MulDiv( scalar,
|
||||
axis->endCoord - face->blend->normalizedcoords[j],
|
||||
axis->endCoord - axis->peakCoord );
|
||||
|
||||
} /* per-axis loop */
|
||||
|
||||
/* get the scaled delta for this region */
|
||||
delta = FT_intToFixed( deltaSet[master] );
|
||||
scaledDelta = FT_MulFix( scalar, delta );
|
||||
|
||||
/* accumulate the adjustments from each region */
|
||||
netAdjustment = netAdjustment + scaledDelta;
|
||||
scalars[master] = scalar;
|
||||
|
||||
} /* per-region loop */
|
||||
|
||||
return FT_fixedToInt( netAdjustment );
|
||||
|
||||
/* Compute the scaled delta for this region.
|
||||
*
|
||||
* From: https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#item-variation-store-header-and-item-variation-data-subtables:
|
||||
*
|
||||
* `Fixed` is a 32-bit (16.16) type and, in the general case, requires
|
||||
* 32-bit deltas. As described above, the `DeltaSet` record can
|
||||
* accommodate deltas that are, logically, either 16-bit or 32-bit.
|
||||
* When scaled deltas are applied to `Fixed` values, the `Fixed` value
|
||||
* is treated like a 32-bit integer.
|
||||
*
|
||||
* `FT_MulAddFix` internally uses 64-bit precision; it thus can handle
|
||||
* deltas ranging from small 8-bit to large 32-bit values that are
|
||||
* applied to 16.16 `FT_Fixed` / OpenType `Fixed` values.
|
||||
*/
|
||||
returnValue = FT_MulAddFix( scalars, deltaSet, varData->regionIdxCount );
|
||||
|
||||
FT_FREE( scalars );
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1128,19 +1155,22 @@
|
|||
}
|
||||
}
|
||||
|
||||
delta = ft_var_get_item_delta( face,
|
||||
delta = tt_var_get_item_delta( face,
|
||||
&table->itemStore,
|
||||
outerIndex,
|
||||
innerIndex );
|
||||
|
||||
FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
||||
vertical ? "vertical height" : "horizontal width",
|
||||
*avalue,
|
||||
delta,
|
||||
delta == 1 ? "" : "s",
|
||||
vertical ? "VVAR" : "HVAR" ));
|
||||
if ( delta )
|
||||
{
|
||||
FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
||||
vertical ? "vertical height" : "horizontal width",
|
||||
*avalue,
|
||||
delta,
|
||||
delta == 1 ? "" : "s",
|
||||
vertical ? "VVAR" : "HVAR" ));
|
||||
|
||||
*avalue += delta;
|
||||
*avalue += delta;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
|
@ -1307,7 +1337,7 @@
|
|||
|
||||
records_offset = FT_STREAM_POS();
|
||||
|
||||
error = ft_var_load_item_variation_store(
|
||||
error = tt_var_load_item_variation_store(
|
||||
face,
|
||||
table_offset + store_offset,
|
||||
&blend->mvar_table->itemStore );
|
||||
|
@ -1332,6 +1362,13 @@
|
|||
value->outerIndex = 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 ||
|
||||
value->innerIndex >= itemStore->varData[value->outerIndex]
|
||||
.itemCount )
|
||||
|
@ -1422,12 +1459,12 @@
|
|||
FT_Int delta;
|
||||
|
||||
|
||||
delta = ft_var_get_item_delta( face,
|
||||
delta = tt_var_get_item_delta( face,
|
||||
&blend->mvar_table->itemStore,
|
||||
value->outerIndex,
|
||||
value->innerIndex );
|
||||
|
||||
if ( p )
|
||||
if ( p && delta )
|
||||
{
|
||||
FT_TRACE5(( "value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n",
|
||||
(FT_Char)( value->tag >> 24 ),
|
||||
|
@ -3813,20 +3850,12 @@
|
|||
* @Description:
|
||||
* Apply the appropriate deltas to the current glyph.
|
||||
*
|
||||
* @Input:
|
||||
* face ::
|
||||
* A handle to the target face object.
|
||||
*
|
||||
* glyph_index ::
|
||||
* The index of the glyph being modified.
|
||||
*
|
||||
* n_points ::
|
||||
* The number of the points in the glyph, including
|
||||
* phantom points.
|
||||
*
|
||||
* @InOut:
|
||||
* loader ::
|
||||
* A handle to the loader object.
|
||||
*
|
||||
* outline ::
|
||||
* The outline to change.
|
||||
* The outline to change, with appended phantom points.
|
||||
*
|
||||
* @Output:
|
||||
* unrounded ::
|
||||
|
@ -3837,15 +3866,16 @@
|
|||
* FreeType error code. 0 means success.
|
||||
*/
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
TT_Vary_Apply_Glyph_Deltas( TT_Face face,
|
||||
FT_UInt glyph_index,
|
||||
TT_Vary_Apply_Glyph_Deltas( TT_Loader loader,
|
||||
FT_Outline* outline,
|
||||
FT_Vector* unrounded,
|
||||
FT_UInt n_points )
|
||||
FT_Vector* unrounded )
|
||||
{
|
||||
FT_Error error;
|
||||
TT_Face face = loader->face;
|
||||
FT_Stream stream = face->root.stream;
|
||||
FT_Memory memory = stream->memory;
|
||||
FT_UInt glyph_index = loader->glyph_index;
|
||||
FT_UInt n_points = (FT_UInt)outline->n_points + 4;
|
||||
|
||||
FT_Vector* points_org = NULL; /* coordinates in 16.16 format */
|
||||
FT_Vector* points_out = NULL; /* coordinates in 16.16 format */
|
||||
|
@ -4063,36 +4093,8 @@
|
|||
FT_Fixed point_delta_y = FT_MulFix( deltas_y[j], apply );
|
||||
|
||||
|
||||
if ( j < n_points - 4 )
|
||||
{
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( j == ( n_points - 4 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_LSB ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 3 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 2 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_TSB ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
else if ( j == ( n_points - 1 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||
if ( point_delta_x || point_delta_y )
|
||||
|
@ -4165,36 +4167,8 @@
|
|||
FT_Pos point_delta_y = points_out[j].y - points_org[j].y;
|
||||
|
||||
|
||||
if ( j < n_points - 4 )
|
||||
{
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( j == ( n_points - 4 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_LSB ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 3 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 2 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_TSB ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
else if ( j == ( n_points - 1 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||
if ( point_delta_x || point_delta_y )
|
||||
|
@ -4232,6 +4206,24 @@
|
|||
|
||||
FT_TRACE5(( "\n" ));
|
||||
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* do not move phantom points if there is HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )
|
||||
{
|
||||
point_deltas_x[n_points - 4] = 0;
|
||||
point_deltas_y[n_points - 4] = 0;
|
||||
point_deltas_x[n_points - 3] = 0;
|
||||
point_deltas_y[n_points - 3] = 0;
|
||||
}
|
||||
if ( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )
|
||||
{
|
||||
point_deltas_x[n_points - 2] = 0;
|
||||
point_deltas_y[n_points - 2] = 0;
|
||||
point_deltas_x[n_points - 1] = 0;
|
||||
point_deltas_y[n_points - 1] = 0;
|
||||
}
|
||||
|
||||
for ( i = 0; i < n_points; i++ )
|
||||
{
|
||||
unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] );
|
||||
|
@ -4241,6 +4233,24 @@
|
|||
outline->points[i].y += FT_fixedToInt( point_deltas_y[i] );
|
||||
}
|
||||
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
{
|
||||
loader->pp1 = outline->points[n_points - 4];
|
||||
loader->pp2 = outline->points[n_points - 3];
|
||||
loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x -
|
||||
unrounded[n_points - 4].x ) / 64;
|
||||
}
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
{
|
||||
loader->pp3 = outline->points[n_points - 2];
|
||||
loader->pp4 = outline->points[n_points - 1];
|
||||
loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].y -
|
||||
unrounded[n_points - 2].y ) / 64;
|
||||
}
|
||||
|
||||
Fail3:
|
||||
FT_FREE( point_deltas_x );
|
||||
FT_FREE( point_deltas_y );
|
||||
|
@ -4305,8 +4315,8 @@
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
ft_var_done_item_variation_store( TT_Face face,
|
||||
FT_LOCAL_DEF( void )
|
||||
tt_var_done_item_variation_store( TT_Face face,
|
||||
GX_ItemVarStore itemStore )
|
||||
{
|
||||
FT_Memory memory = FT_FACE_MEMORY( face );
|
||||
|
@ -4334,6 +4344,18 @@
|
|||
}
|
||||
|
||||
|
||||
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:
|
||||
|
@ -4371,27 +4393,27 @@
|
|||
|
||||
if ( blend->hvar_table )
|
||||
{
|
||||
ft_var_done_item_variation_store( face,
|
||||
tt_var_done_item_variation_store( face,
|
||||
&blend->hvar_table->itemStore );
|
||||
|
||||
FT_FREE( blend->hvar_table->widthMap.innerIndex );
|
||||
FT_FREE( blend->hvar_table->widthMap.outerIndex );
|
||||
tt_var_done_delta_set_index_map( face,
|
||||
&blend->hvar_table->widthMap );
|
||||
FT_FREE( blend->hvar_table );
|
||||
}
|
||||
|
||||
if ( blend->vvar_table )
|
||||
{
|
||||
ft_var_done_item_variation_store( face,
|
||||
tt_var_done_item_variation_store( face,
|
||||
&blend->vvar_table->itemStore );
|
||||
|
||||
FT_FREE( blend->vvar_table->widthMap.innerIndex );
|
||||
FT_FREE( blend->vvar_table->widthMap.outerIndex );
|
||||
tt_var_done_delta_set_index_map( face,
|
||||
&blend->vvar_table->widthMap );
|
||||
FT_FREE( blend->vvar_table );
|
||||
}
|
||||
|
||||
if ( blend->mvar_table )
|
||||
{
|
||||
ft_var_done_item_variation_store( face,
|
||||
tt_var_done_item_variation_store( face,
|
||||
&blend->mvar_table->itemStore );
|
||||
|
||||
FT_FREE( blend->mvar_table->values );
|
||||
|
|
|
@ -62,57 +62,6 @@ FT_BEGIN_HEADER
|
|||
} 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:
|
||||
|
@ -412,11 +361,9 @@ FT_BEGIN_HEADER
|
|||
|
||||
|
||||
FT_LOCAL( FT_Error )
|
||||
TT_Vary_Apply_Glyph_Deltas( TT_Face face,
|
||||
FT_UInt glyph_index,
|
||||
TT_Vary_Apply_Glyph_Deltas( TT_Loader loader,
|
||||
FT_Outline* outline,
|
||||
FT_Vector* unrounded,
|
||||
FT_UInt n_points );
|
||||
FT_Vector* unrounded );
|
||||
|
||||
FT_LOCAL( FT_Error )
|
||||
tt_hadvance_adjust( TT_Face face,
|
||||
|
@ -431,6 +378,34 @@ FT_BEGIN_HEADER
|
|||
FT_LOCAL( void )
|
||||
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_ItemVarDelta )
|
||||
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 )
|
||||
tt_get_var_blend( TT_Face face,
|
||||
FT_UInt *num_coords,
|
||||
|
|
|
@ -516,14 +516,6 @@
|
|||
exec->GS.round_state = 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 */
|
||||
/* before a new execution. */
|
||||
exec->top = 0;
|
||||
|
@ -7847,6 +7839,15 @@
|
|||
Compute_Funcs( exc );
|
||||
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
|
||||
{
|
||||
exc->opcode = exc->code[exc->IP];
|
||||
|
@ -8569,7 +8570,8 @@
|
|||
|
||||
/* increment instruction counter and check if we didn't */
|
||||
/* run this program for too long (e.g. infinite loops). */
|
||||
if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES ) {
|
||||
if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES )
|
||||
{
|
||||
exc->error = FT_THROW( Execution_Too_Long );
|
||||
goto LErrorLabel_;
|
||||
}
|
||||
|
|
|
@ -337,6 +337,8 @@ FT_BEGIN_HEADER
|
|||
|
||||
FT_UInt interpreter_version;
|
||||
|
||||
FT_Bool enable_variable_colrv1;
|
||||
|
||||
} TT_DriverRec;
|
||||
|
||||
|
||||
|
|
|
@ -203,7 +203,7 @@
|
|||
kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
|
||||
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++;
|
||||
|
|
|
@ -121,19 +121,30 @@
|
|||
#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
|
||||
static const FT_Service_MultiMastersRec t1_service_multi_masters =
|
||||
{
|
||||
(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_Blend_Func) T1_Set_MM_Blend, /* set_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_Set_Var_Design_Func) T1_Set_Var_Design, /* set_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_MM_WeightVector_Func)T1_Set_MM_WeightVector, /* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)T1_Get_MM_WeightVector, /* get_mm_weightvector */
|
||||
|
||||
(FT_Get_Var_Blend_Func) NULL, /* get_var_blend */
|
||||
(FT_Done_Blend_Func) T1_Done_Blend /* done_blend */
|
||||
(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_Blend_Func) T1_Set_MM_Blend, /* set_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_Set_Var_Design_Func)T1_Set_Var_Design, /* set_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_MM_WeightVector_Func)
|
||||
T1_Set_MM_WeightVector, /* set_mm_weightvector */
|
||||
(FT_Get_MM_WeightVector_Func)
|
||||
T1_Get_MM_WeightVector, /* get_mm_weightvector */
|
||||
(FT_Var_Load_Delta_Set_Idx_Map_Func)
|
||||
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
|
||||
|
||||
|
|
|
@ -2057,9 +2057,9 @@
|
|||
name_table->elements[n][len] = '\0';
|
||||
|
||||
/* record index of /.notdef */
|
||||
if ( *cur == '.' &&
|
||||
if ( *cur == '.' &&
|
||||
ft_strcmp( ".notdef",
|
||||
(const char*)(name_table->elements[n]) ) == 0 )
|
||||
(const char*)( name_table->elements[n] ) ) == 0 )
|
||||
{
|
||||
notdef_index = n;
|
||||
notdef_found = 1;
|
||||
|
@ -2331,8 +2331,8 @@
|
|||
/* in valid Type 1 fonts we don't see `RD' or `-|' directly */
|
||||
/* since those tokens are handled by parse_subrs and */
|
||||
/* parse_charstrings */
|
||||
else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
|
||||
have_integer )
|
||||
else if ( *cur == 'R' && cur + 6 < limit && *( cur + 1 ) == 'D' &&
|
||||
have_integer )
|
||||
{
|
||||
FT_ULong s;
|
||||
FT_Byte* b;
|
||||
|
@ -2344,8 +2344,8 @@
|
|||
have_integer = 0;
|
||||
}
|
||||
|
||||
else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
|
||||
have_integer )
|
||||
else if ( *cur == '-' && cur + 6 < limit && *( cur + 1 ) == '|' &&
|
||||
have_integer )
|
||||
{
|
||||
FT_ULong s;
|
||||
FT_Byte* b;
|
||||
|
|
|
@ -330,50 +330,25 @@
|
|||
/* the private dict. Otherwise, simply overwrite into the base */
|
||||
/* dictionary block in the heap. */
|
||||
|
||||
/* first of all, look at the `eexec' keyword */
|
||||
/* First look for the `eexec' keyword. Ensure `eexec' is real -- */
|
||||
/* it could be in a comment or string (as e.g. in u003043t.gsf */
|
||||
/* from ghostscript). */
|
||||
FT_Byte* cur = parser->base_dict;
|
||||
FT_Byte* limit = cur + parser->base_len;
|
||||
FT_Pointer pos_lf;
|
||||
FT_Bool test_cr;
|
||||
|
||||
|
||||
Again:
|
||||
for (;;)
|
||||
{
|
||||
if ( cur[0] == 'e' &&
|
||||
cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */
|
||||
/* whitespace + 4 chars */
|
||||
{
|
||||
if ( cur[1] == 'e' &&
|
||||
cur[2] == 'x' &&
|
||||
cur[3] == 'e' &&
|
||||
cur[4] == 'c' )
|
||||
break;
|
||||
}
|
||||
cur++;
|
||||
if ( cur >= limit )
|
||||
{
|
||||
FT_ERROR(( "T1_Get_Private_Dict:"
|
||||
" could not find `eexec' keyword\n" ));
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* check whether `eexec' was real -- it could be in a comment */
|
||||
/* or string (as e.g. in u003043t.gsf from ghostscript) */
|
||||
|
||||
parser->root.cursor = parser->base_dict;
|
||||
/* set limit to `eexec' + whitespace + 4 characters */
|
||||
parser->root.limit = cur + 10;
|
||||
parser->root.limit = parser->base_dict + parser->base_len;
|
||||
|
||||
cur = parser->root.cursor;
|
||||
limit = parser->root.limit;
|
||||
|
||||
while ( cur < limit )
|
||||
{
|
||||
if ( cur[0] == 'e' &&
|
||||
cur + 5 < limit )
|
||||
/* 9 = 5 letters for `eexec' + whitespace + 4 chars */
|
||||
if ( cur[0] == 'e' && cur + 9 < limit )
|
||||
{
|
||||
if ( cur[1] == 'e' &&
|
||||
cur[2] == 'x' &&
|
||||
|
@ -389,21 +364,9 @@
|
|||
cur = parser->root.cursor;
|
||||
}
|
||||
|
||||
/* we haven't found the correct `eexec'; go back and continue */
|
||||
/* searching */
|
||||
|
||||
cur = limit;
|
||||
limit = parser->base_dict + parser->base_len;
|
||||
|
||||
if ( cur >= limit )
|
||||
{
|
||||
FT_ERROR(( "T1_Get_Private_Dict:"
|
||||
" premature end in private dictionary\n" ));
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
goto Again;
|
||||
FT_ERROR(( "T1_Get_Private_Dict: could not find `eexec' keyword\n" ));
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
goto Exit;
|
||||
|
||||
/* now determine where to write the _encrypted_ binary private */
|
||||
/* dictionary. We overwrite the base dictionary for disk-based */
|
||||
|
|
|
@ -148,7 +148,7 @@
|
|||
t42_loader_done( &loader );
|
||||
if ( error )
|
||||
{
|
||||
FT_FREE(face->ttf_data);
|
||||
FT_FREE( face->ttf_data );
|
||||
face->ttf_size = 0;
|
||||
}
|
||||
return error;
|
||||
|
|
|
@ -92,7 +92,7 @@
|
|||
#undef T1CODE
|
||||
#define T1CODE T1_FIELD_LOCATION_BBOX
|
||||
|
||||
T1_FIELD_BBOX("FontBBox", xMin, 0 )
|
||||
T1_FIELD_BBOX( "FontBBox", xMin, 0 )
|
||||
|
||||
T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 )
|
||||
T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 )
|
||||
|
@ -1008,9 +1008,9 @@
|
|||
name_table->elements[n][len] = '\0';
|
||||
|
||||
/* record index of /.notdef */
|
||||
if ( *cur == '.' &&
|
||||
if ( *cur == '.' &&
|
||||
ft_strcmp( ".notdef",
|
||||
(const char*)(name_table->elements[n]) ) == 0 )
|
||||
(const char*)( name_table->elements[n] ) ) == 0 )
|
||||
{
|
||||
notdef_index = n;
|
||||
notdef_found = 1;
|
||||
|
|
|
@ -489,7 +489,7 @@
|
|||
&dir_entry1 ) )
|
||||
goto Exit;
|
||||
|
||||
if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ )
|
||||
if ( !( dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ )
|
||||
{
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
goto Exit;
|
||||
|
@ -513,7 +513,7 @@
|
|||
&dir_entry2 ) )
|
||||
goto Exit;
|
||||
|
||||
if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ )
|
||||
if ( !( dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ )
|
||||
{
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
goto Exit;
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
[wrap-file]
|
||||
directory = harfbuzz-4.3.0
|
||||
|
||||
source_url = https://github.com/harfbuzz/harfbuzz/releases/download/4.3.0/harfbuzz-4.3.0.tar.xz
|
||||
source_filename = harfbuzz-4.3.0.tar.xz
|
||||
source_hash = a49628f4c4c8e6d8df95ef44935a93446cf2e46366915b0e3ca30df21fffb530
|
||||
|
||||
[provide]
|
||||
harfbuzz = libharfbuzz_dep
|
||||
harfbuzz-subset = libharfbuzz_subset_dep
|
||||
harfbuzz-icu = libharfbuzz_icu_dep
|
||||
harfbuzz-gobject = libharfbuzz_gobject_dep
|
|
@ -1,11 +1,11 @@
|
|||
[wrap-file]
|
||||
directory = zlib-1.2.11
|
||||
source_url = http://zlib.net/fossils/zlib-1.2.11.tar.gz
|
||||
source_filename = zlib-1.2.11.tar.gz
|
||||
source_hash = c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
|
||||
patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.2.11-5/get_patch
|
||||
patch_filename = zlib-1.2.11-5-wrap.zip
|
||||
patch_hash = 728c8e24acbc2e6682fbd950fec39e2fc77528af361adb87259f8a8511434004
|
||||
directory = zlib-1.2.12
|
||||
source_url = http://zlib.net/fossils/zlib-1.2.12.tar.gz
|
||||
source_filename = zlib-1.2.12.tar.gz
|
||||
source_hash = 91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9
|
||||
patch_filename = zlib_1.2.12-1_patch.zip
|
||||
patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.2.12-1/get_patch
|
||||
patch_hash = 8ec8344f3fe7b06ad4be768fd416694bc56cb4545ce78b0f1c18b3e72b3ec936
|
||||
|
||||
[provide]
|
||||
zlib = zlib_dep
|
||||
|
|
Loading…
Reference in New Issue