-Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
+Copyright (C) 1995-2026 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
diff --git a/src/java.base/share/native/libzip/zlib/ChangeLog b/src/java.base/share/native/libzip/zlib/ChangeLog
index b801a1031ec0..312753edadef 100644
--- a/src/java.base/share/native/libzip/zlib/ChangeLog
+++ b/src/java.base/share/native/libzip/zlib/ChangeLog
@@ -1,6 +1,57 @@
ChangeLog file for zlib
+Changes in 1.3.2 (17 Feb 2026)
+- Continued rewrite of CMake build [Vollstrecker]
+- Various portability improvements
+- Various github workflow additions and improvements
+- Check for negative lengths in crc32_combine functions
+- Copy only the initialized window contents in inflateCopy
+- Prevent the use of insecure functions without an explicit request
+- Add compressBound_z and deflateBound_z functions for large values
+- Use atomics to build inflate fixed tables once
+- Add definition of ZLIB_INSECURE to build tests with c89 and c94
+- Add --undefined option to ./configure for UBSan checker
+- Copy only the initialized deflate state in deflateCopy
+- Zero inflate state on allocation
+- Remove untgz from contrib
+- Add _z versions of the compress and uncompress functions
+- Vectorize the CRC-32 calculation on the s390x
+- Set bit 11 of the zip header flags in minizip if UTF-8
+- Update OS/400 support
+- Add a test to configure to check for a working compiler
+- Check for invalid NULL pointer inputs to zlib operations
+- Add --mandir to ./configure to specify manual directory
+- Add LICENSE.Info-Zip to contrib/minizip
+- Remove vstudio projects in lieu of cmake-generated projects
+- Replace strcpy() with memcpy() in contrib/minizip
+
+Changes in 1.3.1.2 (8 Dec 2025)
+- Improve portability to RISC OS
+- Permit compiling contrib/minizip/unzip.c with decryption
+- Enable build of shared library on AIX
+- Make deflateBound() more conservative and handle Z_STREAM_END
+- Add zipAlreadyThere() to minizip zip.c to help avoid duplicates
+- Make z_off_t 64 bits by default
+- Add deflateUsed() function to get the used bits in the last byte
+- Avoid out-of-bounds pointer arithmetic in inflateCopy()
+- Add Haiku to configure for proper LDSHARED settings
+- Add Bazel targets
+- Complete rewrite of CMake build [Vollstrecker]
+- Clarify the use of errnum in gzerror()
+- Note that gzseek() requests are deferred until the next operation
+- Note the use of gzungetc() to run a deferred seek while reading
+- Fix bug in inflatePrime() for 16-bit ints
+- Add a "G" option to force gzip, disabling transparency in gzread()
+- Improve the discrimination between trailing garbage and bad gzip
+- Allow gzflush() to write empty gzip members
+- Remove redundant frees of point list on error in examples/zran.c
+- Clarify the use of inflateGetHeader()
+- Update links to the RFCs
+- Return all available uncompressed data on error in gzread.c
+- Support non-blocking devices in the gz* routines
+- Various other small improvements
+
Changes in 1.3.1 (22 Jan 2024)
- Reject overflows of zip header fields in minizip
- Fix bug in inflateSync() for data held in bit buffer
diff --git a/src/java.base/share/native/libzip/zlib/README b/src/java.base/share/native/libzip/zlib/README
index c5f917540b6f..2b1e6f36fe3e 100644
--- a/src/java.base/share/native/libzip/zlib/README
+++ b/src/java.base/share/native/libzip/zlib/README
@@ -1,10 +1,10 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.3.1 is a general purpose data compression library. All the code is
-thread safe. The data format used by the zlib library is described by RFCs
-(Request for Comments) 1950 to 1952 in the files
-http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
-rfc1952 (gzip format).
+zlib 1.3.2 is a general purpose data compression library. All the code is
+thread safe (though see the FAQ for caveats). The data format used by the zlib
+library is described by RFCs (Request for Comments) 1950 to 1952 at
+https://datatracker.ietf.org/doc/html/rfc1950 (zlib format), rfc1951 (deflate
+format) and rfc1952 (gzip format).
All functions of the compression library are documented in the file zlib.h
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
@@ -21,17 +21,17 @@ make_vms.com.
Questions about zlib should be sent to , or to Gilles Vollant
for the Windows DLL version. The zlib home page is
-http://zlib.net/ . Before reporting a problem, please check this site to
+https://zlib.net/ . Before reporting a problem, please check this site to
verify that you have the latest version of zlib; otherwise get the latest
version and check whether the problem still exists or not.
-PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
+PLEASE read the zlib FAQ https://zlib.net/zlib_faq.html before asking for help.
Mark Nelson wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
-https://marknelson.us/posts/1997/01/01/zlib-engine.html .
+https://zlib.net/nelson/ .
-The changes made in version 1.3.1 are documented in the file ChangeLog.
+The changes made in version 1.3.2 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
@@ -43,9 +43,9 @@ can be found at https://github.com/pmqs/IO-Compress .
A Python interface to zlib written by A.M. Kuchling is
available in Python 1.5 and later versions, see
-http://docs.python.org/library/zlib.html .
+https://docs.python.org/3/library/zlib.html .
-zlib is built into tcl: http://wiki.tcl.tk/4610 .
+zlib is built into tcl: https://wiki.tcl-lang.org/page/zlib .
An experimental package to read and write files in .zip format, written on top
of zlib by Gilles Vollant , is available in the
@@ -69,9 +69,7 @@ Notes for some targets:
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
other compilers. Use "make test" to check your compiler.
-- gzdopen is not supported on RISCOS or BEOS.
-
-- For PalmOs, see http://palmzlib.sourceforge.net/
+- For PalmOs, see https://palmzlib.sourceforge.net/
Acknowledgments:
@@ -83,7 +81,7 @@ Acknowledgments:
Copyright notice:
- (C) 1995-2024 Jean-loup Gailly and Mark Adler
+ (C) 1995-2026 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
diff --git a/src/java.base/share/native/libzip/zlib/compress.c b/src/java.base/share/native/libzip/zlib/compress.c
index d74213796737..54346ad2a2f1 100644
--- a/src/java.base/share/native/libzip/zlib/compress.c
+++ b/src/java.base/share/native/libzip/zlib/compress.c
@@ -23,7 +23,7 @@
*/
/* compress.c -- compress a memory buffer
- * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -42,13 +42,19 @@
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
Z_STREAM_ERROR if the level parameter is invalid.
+
+ The _z versions of the functions take size_t length arguments.
*/
-int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
- uLong sourceLen, int level) {
+int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
+ z_size_t sourceLen, int level) {
z_stream stream;
int err;
const uInt max = (uInt)-1;
- uLong left;
+ z_size_t left;
+
+ if ((sourceLen > 0 && source == NULL) ||
+ destLen == NULL || (*destLen > 0 && dest == NULL))
+ return Z_STREAM_ERROR;
left = *destLen;
*destLen = 0;
@@ -67,23 +73,36 @@ int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
do {
if (stream.avail_out == 0) {
- stream.avail_out = left > (uLong)max ? max : (uInt)left;
+ stream.avail_out = left > (z_size_t)max ? max : (uInt)left;
left -= stream.avail_out;
}
if (stream.avail_in == 0) {
- stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
+ stream.avail_in = sourceLen > (z_size_t)max ? max :
+ (uInt)sourceLen;
sourceLen -= stream.avail_in;
}
err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
} while (err == Z_OK);
- *destLen = stream.total_out;
+ *destLen = (z_size_t)(stream.next_out - dest);
deflateEnd(&stream);
return err == Z_STREAM_END ? Z_OK : err;
}
-
+int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong sourceLen, int level) {
+ int ret;
+ z_size_t got = *destLen;
+ ret = compress2_z(dest, &got, source, sourceLen, level);
+ *destLen = (uLong)got;
+ return ret;
+}
/* ===========================================================================
*/
+int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
+ z_size_t sourceLen) {
+ return compress2_z(dest, destLen, source, sourceLen,
+ Z_DEFAULT_COMPRESSION);
+}
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
uLong sourceLen) {
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
@@ -93,7 +112,12 @@ int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
If the default memLevel or windowBits for deflateInit() is changed, then
this function needs to be updated.
*/
+z_size_t ZEXPORT compressBound_z(z_size_t sourceLen) {
+ z_size_t bound = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13;
+ return bound < sourceLen ? (z_size_t)-1 : bound;
+}
uLong ZEXPORT compressBound(uLong sourceLen) {
- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
- (sourceLen >> 25) + 13;
+ z_size_t bound = compressBound_z(sourceLen);
+ return (uLong)bound != bound ? (uLong)-1 : (uLong)bound;
}
diff --git a/src/java.base/share/native/libzip/zlib/deflate.c b/src/java.base/share/native/libzip/zlib/deflate.c
index 57fc6802bb81..0ec56ec5691f 100644
--- a/src/java.base/share/native/libzip/zlib/deflate.c
+++ b/src/java.base/share/native/libzip/zlib/deflate.c
@@ -23,7 +23,7 @@
*/
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -61,7 +61,7 @@
* REFERENCES
*
* Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- * Available in http://tools.ietf.org/html/rfc1951
+ * Available at https://datatracker.ietf.org/doc/html/rfc1951
*
* A description of the Rabin and Karp algorithm is given in the book
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
@@ -76,7 +76,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.3.2 Copyright 1995-2026 Jean-loup Gailly and 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
@@ -194,8 +194,8 @@ local const config configuration_table[10] = {
#define CLEAR_HASH(s) \
do { \
s->head[s->hash_size - 1] = NIL; \
- zmemzero((Bytef *)s->head, \
- (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
+ zmemzero(s->head, (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
+ s->slid = 0; \
} while (0)
/* ===========================================================================
@@ -219,8 +219,8 @@ local void slide_hash(deflate_state *s) {
m = *--p;
*p = (Pos)(m >= wsize ? m - wsize : NIL);
} while (--n);
- n = wsize;
#ifndef FASTEST
+ n = wsize;
p = &s->prev[n];
do {
m = *--p;
@@ -230,6 +230,7 @@ local void slide_hash(deflate_state *s) {
*/
} while (--n);
#endif
+ s->slid = 1;
}
/* ===========================================================================
@@ -283,7 +284,14 @@ local void fill_window(deflate_state *s) {
more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
/* Deal with !@#$% 64K limit: */
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4127)
+#endif
if (sizeof(int) <= 2) {
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
more = wsize;
@@ -455,6 +463,7 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
if (s == Z_NULL) return Z_MEM_ERROR;
+ zmemzero(s, sizeof(deflate_state));
strm->state = (struct internal_state FAR *)s;
s->strm = strm;
s->status = INIT_STATE; /* to pass state test in deflateReset() */
@@ -736,10 +745,23 @@ int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) {
/* ========================================================================= */
int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) {
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
- if (pending != Z_NULL)
- *pending = strm->state->pending;
if (bits != Z_NULL)
*bits = strm->state->bi_valid;
+ if (pending != Z_NULL) {
+ *pending = (unsigned)strm->state->pending;
+ if (*pending != strm->state->pending) {
+ *pending = (unsigned)-1;
+ return Z_BUF_ERROR;
+ }
+ }
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateUsed(z_streamp strm, int *bits) {
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+ if (bits != Z_NULL)
+ *bits = strm->state->bi_used;
return Z_OK;
}
@@ -855,28 +877,34 @@ int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy,
*
* Shifts are used to approximate divisions, for speed.
*/
-uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
+z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen) {
deflate_state *s;
- uLong fixedlen, storelen, wraplen;
+ z_size_t fixedlen, storelen, wraplen, bound;
/* upper bound for fixed blocks with 9-bit literals and length 255
(memLevel == 2, which is the lowest that may not use stored blocks) --
~13% overhead plus a small constant */
fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
(sourceLen >> 9) + 4;
+ if (fixedlen < sourceLen)
+ fixedlen = (z_size_t)-1;
/* upper bound for stored blocks with length 127 (memLevel == 1) --
~4% overhead plus a small constant */
storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
(sourceLen >> 11) + 7;
+ if (storelen < sourceLen)
+ storelen = (z_size_t)-1;
- /* if can't get parameters, return larger bound plus a zlib wrapper */
- if (deflateStateCheck(strm))
- return (fixedlen > storelen ? fixedlen : storelen) + 6;
+ /* if can't get parameters, return larger bound plus a wrapper */
+ if (deflateStateCheck(strm)) {
+ bound = fixedlen > storelen ? fixedlen : storelen;
+ return bound + 18 < bound ? (z_size_t)-1 : bound + 18;
+ }
/* compute wrapper length */
s = strm->state;
- switch (s->wrap) {
+ switch (s->wrap < 0 ? -s->wrap : s->wrap) {
case 0: /* raw deflate */
wraplen = 0;
break;
@@ -906,18 +934,25 @@ uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
break;
#endif
default: /* for compiler happiness */
- wraplen = 6;
+ wraplen = 18;
}
/* if not default parameters, return one of the conservative bounds */
- if (s->w_bits != 15 || s->hash_bits != 8 + 7)
- return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +
- wraplen;
+ if (s->w_bits != 15 || s->hash_bits != 8 + 7) {
+ bound = s->w_bits <= s->hash_bits && s->level ? fixedlen :
+ storelen;
+ return bound + wraplen < bound ? (z_size_t)-1 : bound + wraplen;
+ }
/* default settings: return tight bound for that case -- ~0.03% overhead
plus a small constant */
- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
- (sourceLen >> 25) + 13 - 6 + wraplen;
+ bound = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13 - 6 + wraplen;
+ return bound < sourceLen ? (z_size_t)-1 : bound;
+}
+uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
+ z_size_t bound = deflateBound_z(strm, sourceLen);
+ return (uLong)bound != bound ? (uLong)-1 : (uLong)bound;
}
/* =========================================================================
@@ -941,8 +976,8 @@ local void flush_pending(z_streamp strm) {
deflate_state *s = strm->state;
_tr_flush_bits(s);
- len = s->pending;
- if (len > strm->avail_out) len = strm->avail_out;
+ len = s->pending > strm->avail_out ? strm->avail_out :
+ (unsigned)s->pending;
if (len == 0) return;
zmemcpy(strm->next_out, s->pending_out, len);
@@ -962,8 +997,8 @@ local void flush_pending(z_streamp strm) {
#define HCRC_UPDATE(beg) \
do { \
if (s->gzhead->hcrc && s->pending > (beg)) \
- strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
- s->pending - (beg)); \
+ strm->adler = crc32_z(strm->adler, s->pending_buf + (beg), \
+ s->pending - (beg)); \
} while (0)
/* ========================================================================= */
@@ -1097,8 +1132,8 @@ int ZEXPORT deflate(z_streamp strm, int flush) {
put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
}
if (s->gzhead->hcrc)
- strm->adler = crc32(strm->adler, s->pending_buf,
- s->pending);
+ strm->adler = crc32_z(strm->adler, s->pending_buf,
+ s->pending);
s->gzindex = 0;
s->status = EXTRA_STATE;
}
@@ -1106,9 +1141,9 @@ int ZEXPORT deflate(z_streamp strm, int flush) {
if (s->status == EXTRA_STATE) {
if (s->gzhead->extra != Z_NULL) {
ulg beg = s->pending; /* start of bytes to update crc */
- uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
+ ulg left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
while (s->pending + left > s->pending_buf_size) {
- uInt copy = s->pending_buf_size - s->pending;
+ ulg copy = s->pending_buf_size - s->pending;
zmemcpy(s->pending_buf + s->pending,
s->gzhead->extra + s->gzindex, copy);
s->pending = s->pending_buf_size;
@@ -1319,12 +1354,13 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
ss = source->state;
- zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+ zmemcpy(dest, source, sizeof(z_stream));
ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
if (ds == Z_NULL) return Z_MEM_ERROR;
+ zmemzero(ds, sizeof(deflate_state));
dest->state = (struct internal_state FAR *) ds;
- zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
+ zmemcpy(ds, ss, sizeof(deflate_state));
ds->strm = dest;
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
@@ -1337,18 +1373,23 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
deflateEnd (dest);
return Z_MEM_ERROR;
}
- /* following zmemcpy do not work for 16-bit MSDOS */
- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
- zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
- zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
- zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS);
+ /* following zmemcpy's do not work for 16-bit MSDOS */
+ zmemcpy(ds->window, ss->window, ss->high_water);
+ zmemcpy(ds->prev, ss->prev,
+ (ss->slid || ss->strstart - ss->insert > ds->w_size ? ds->w_size :
+ ss->strstart - ss->insert) * sizeof(Pos));
+ zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+ zmemcpy(ds->pending_out, ss->pending_out, ss->pending);
#ifdef LIT_MEM
ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1));
ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2);
+ zmemcpy(ds->d_buf, ss->d_buf, ss->sym_next * sizeof(ush));
+ zmemcpy(ds->l_buf, ss->l_buf, ss->sym_next);
#else
ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
+ zmemcpy(ds->sym_buf, ss->sym_buf, ss->sym_next);
#endif
ds->l_desc.dyn_tree = ds->dyn_ltree;
@@ -1371,9 +1412,9 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
*/
local uInt longest_match(deflate_state *s, IPos cur_match) {
unsigned chain_length = s->max_chain_length;/* max hash chain length */
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
+ Bytef *scan = s->window + s->strstart; /* current string */
+ Bytef *match; /* matched string */
+ int len; /* length of current match */
int best_len = (int)s->prev_length; /* best match length so far */
int nice_match = s->nice_match; /* stop if match long enough */
IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
@@ -1388,13 +1429,13 @@ local uInt longest_match(deflate_state *s, IPos cur_match) {
/* Compare two bytes at a time. Note: this is not always beneficial.
* Try with and without -DUNALIGNED_OK to check.
*/
- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
- register ush scan_start = *(ushf*)scan;
- register ush scan_end = *(ushf*)(scan + best_len - 1);
+ Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ ush scan_start = *(ushf*)scan;
+ ush scan_end = *(ushf*)(scan + best_len - 1);
#else
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
- register Byte scan_end1 = scan[best_len - 1];
- register Byte scan_end = scan[best_len];
+ Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ Byte scan_end1 = scan[best_len - 1];
+ Byte scan_end = scan[best_len];
#endif
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
@@ -1518,10 +1559,10 @@ local uInt longest_match(deflate_state *s, IPos cur_match) {
* Optimized version for FASTEST only
*/
local uInt longest_match(deflate_state *s, IPos cur_match) {
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ Bytef *scan = s->window + s->strstart; /* current string */
+ Bytef *match; /* matched string */
+ int len; /* length of current match */
+ Bytef *strend = s->window + s->strstart + MAX_MATCH;
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
* It is easy to get rid of this optimization if necessary.
@@ -1581,7 +1622,7 @@ local uInt longest_match(deflate_state *s, IPos cur_match) {
local void check_match(deflate_state *s, IPos start, IPos match, int length) {
/* check that the match is indeed a match */
Bytef *back = s->window + (int)match, *here = s->window + start;
- IPos len = length;
+ IPos len = (IPos)length;
if (match == (IPos)-1) {
/* match starts one byte before the current window -- just compare the
subsequent length-1 bytes */
@@ -1653,13 +1694,14 @@ local block_state deflate_stored(deflate_state *s, int flush) {
* this is 32K. This can be as small as 507 bytes for memLevel == 1. For
* large input and output buffers, the stored block size will be larger.
*/
- unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);
+ unsigned min_block = (unsigned)(MIN(s->pending_buf_size - 5, s->w_size));
/* Copy as many min_block or larger stored blocks directly to next_out as
* possible. If flushing, copy the remaining available input to next_out as
* stored blocks, if there is enough space.
*/
- unsigned len, left, have, last = 0;
+ int last = 0;
+ unsigned len, left, have;
unsigned used = s->strm->avail_in;
do {
/* Set len to the maximum size block that we can copy directly with the
@@ -1667,12 +1709,12 @@ local block_state deflate_stored(deflate_state *s, int flush) {
* would be copied from what's left in the window.
*/
len = MAX_STORED; /* maximum deflate stored block length */
- have = (s->bi_valid + 42) >> 3; /* number of header bytes */
+ have = ((unsigned)s->bi_valid + 42) >> 3; /* bytes in header */
if (s->strm->avail_out < have) /* need room for header */
break;
/* maximum stored block length that will fit in avail_out: */
have = s->strm->avail_out - have;
- left = s->strstart - s->block_start; /* bytes left in window */
+ left = (unsigned)(s->strstart - s->block_start); /* window bytes */
if (len > (ulg)left + s->strm->avail_in)
len = left + s->strm->avail_in; /* limit len to the input */
if (len > have)
@@ -1695,10 +1737,10 @@ local block_state deflate_stored(deflate_state *s, int flush) {
_tr_stored_block(s, (char *)0, 0L, last);
/* Replace the lengths in the dummy stored block with len. */
- s->pending_buf[s->pending - 4] = len;
- s->pending_buf[s->pending - 3] = len >> 8;
- s->pending_buf[s->pending - 2] = ~len;
- s->pending_buf[s->pending - 1] = ~len >> 8;
+ s->pending_buf[s->pending - 4] = (Bytef)len;
+ s->pending_buf[s->pending - 3] = (Bytef)(len >> 8);
+ s->pending_buf[s->pending - 2] = (Bytef)~len;
+ s->pending_buf[s->pending - 1] = (Bytef)(~len >> 8);
/* Write the stored block header bytes. */
flush_pending(s->strm);
@@ -1769,8 +1811,10 @@ local block_state deflate_stored(deflate_state *s, int flush) {
s->high_water = s->strstart;
/* If the last block was written to next_out, then done. */
- if (last)
+ if (last) {
+ s->bi_used = 8;
return finish_done;
+ }
/* If flushing and all input has been consumed, then done. */
if (flush != Z_NO_FLUSH && flush != Z_FINISH &&
@@ -1778,7 +1822,7 @@ local block_state deflate_stored(deflate_state *s, int flush) {
return block_done;
/* Fill the window with any remaining input. */
- have = s->window_size - s->strstart;
+ have = (unsigned)(s->window_size - s->strstart);
if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
/* Slide the window down. */
s->block_start -= s->w_size;
@@ -1805,11 +1849,11 @@ local block_state deflate_stored(deflate_state *s, int flush) {
* have enough input for a worthy block, or if flushing and there is enough
* room for the remaining input as a stored block in the pending buffer.
*/
- have = (s->bi_valid + 42) >> 3; /* number of header bytes */
+ have = ((unsigned)s->bi_valid + 42) >> 3; /* bytes in header */
/* maximum stored block length that will fit in pending: */
- have = MIN(s->pending_buf_size - have, MAX_STORED);
+ have = (unsigned)MIN(s->pending_buf_size - have, MAX_STORED);
min_block = MIN(have, s->w_size);
- left = s->strstart - s->block_start;
+ left = (unsigned)(s->strstart - s->block_start);
if (left >= min_block ||
((left || flush == Z_FINISH) && flush != Z_NO_FLUSH &&
s->strm->avail_in == 0 && left <= have)) {
@@ -1822,6 +1866,8 @@ local block_state deflate_stored(deflate_state *s, int flush) {
}
/* We've done all we can with the available input and output. */
+ if (last)
+ s->bi_used = 8;
return last ? finish_started : need_more;
}
@@ -1870,7 +1916,7 @@ local block_state deflate_fast(deflate_state *s, int flush) {
/* longest_match() sets match_start */
}
if (s->match_length >= MIN_MATCH) {
- check_match(s, s->strstart, s->match_start, s->match_length);
+ check_match(s, s->strstart, s->match_start, (int)s->match_length);
_tr_tally_dist(s, s->strstart - s->match_start,
s->match_length - MIN_MATCH, bflush);
@@ -1992,7 +2038,7 @@ local block_state deflate_slow(deflate_state *s, int flush) {
uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
/* Do not insert strings in hash table beyond this. */
- check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
+ check_match(s, s->strstart - 1, s->prev_match, (int)s->prev_length);
_tr_tally_dist(s, s->strstart - 1 - s->prev_match,
s->prev_length - MIN_MATCH, bflush);
@@ -2100,7 +2146,7 @@ local block_state deflate_rle(deflate_state *s, int flush) {
/* Emit match if have run of MIN_MATCH or longer, else emit literal */
if (s->match_length >= MIN_MATCH) {
- check_match(s, s->strstart, s->strstart - 1, s->match_length);
+ check_match(s, s->strstart, s->strstart - 1, (int)s->match_length);
_tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
diff --git a/src/java.base/share/native/libzip/zlib/deflate.h b/src/java.base/share/native/libzip/zlib/deflate.h
index 830d46b88947..5b6246ee3c41 100644
--- a/src/java.base/share/native/libzip/zlib/deflate.h
+++ b/src/java.base/share/native/libzip/zlib/deflate.h
@@ -23,7 +23,7 @@
*/
/* deflate.h -- internal compression state
- * Copyright (C) 1995-2024 Jean-loup Gailly
+ * Copyright (C) 1995-2026 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -295,6 +295,9 @@ typedef struct internal_state {
/* Number of valid bits in bi_buf. All bits above the last valid bit
* are always zero.
*/
+ int bi_used;
+ /* Last number of used bits when going to a byte boundary.
+ */
ulg high_water;
/* High water mark offset in window for initialized bytes -- bytes above
@@ -303,6 +306,9 @@ typedef struct internal_state {
* updated to the new high water mark.
*/
+ int slid;
+ /* True if the hash table has been slid since it was cleared. */
+
} FAR deflate_state;
/* Output a byte on the stream.
diff --git a/src/java.base/share/native/libzip/zlib/gzguts.h b/src/java.base/share/native/libzip/zlib/gzguts.h
index 8cce2c69d24b..0be646016ed8 100644
--- a/src/java.base/share/native/libzip/zlib/gzguts.h
+++ b/src/java.base/share/native/libzip/zlib/gzguts.h
@@ -23,7 +23,7 @@
*/
/* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004-2024 Mark Adler
+ * Copyright (C) 2004-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -41,6 +41,18 @@
# define ZLIB_INTERNAL
#endif
+#if defined(_WIN32)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS
+# endif
+# ifndef _CRT_NONSTDC_NO_DEPRECATE
+# define _CRT_NONSTDC_NO_DEPRECATE
+# endif
+#endif
+
#include
#include "zlib.h"
#ifdef STDC
@@ -49,8 +61,8 @@
# include
#endif
-#ifndef _POSIX_SOURCE
-# define _POSIX_SOURCE
+#ifndef _POSIX_C_SOURCE
+# define _POSIX_C_SOURCE 200112L
#endif
#include
@@ -60,19 +72,13 @@
#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
# include
+# include
#endif
-#if defined(_WIN32)
+#if defined(_WIN32) && !defined(WIDECHAR)
# define WIDECHAR
#endif
-#ifdef WINAPI_FAMILY
-# define open _open
-# define read _read
-# define write _write
-# define close _close
-#endif
-
#ifdef NO_DEFLATE /* for compatibility with old definition */
# define NO_GZCOMPRESS
#endif
@@ -96,33 +102,28 @@
#endif
#ifndef HAVE_VSNPRINTF
-# ifdef MSDOS
+# if !defined(NO_vsnprintf) && \
+ (defined(MSDOS) || defined(__TURBOC__) || defined(__SASC) || \
+ defined(VMS) || defined(__OS400) || defined(__MVS__))
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
but for now we just assume it doesn't. */
# define NO_vsnprintf
# endif
-# ifdef __TURBOC__
-# define NO_vsnprintf
-# endif
# ifdef WIN32
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-# if !defined(vsnprintf) && !defined(NO_vsnprintf)
-# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
-# define vsnprintf _vsnprintf
+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+# ifndef vsnprintf
+# define vsnprintf _vsnprintf
# endif
# endif
-# endif
-# ifdef __SASC
-# define NO_vsnprintf
-# endif
-# ifdef VMS
-# define NO_vsnprintf
-# endif
-# ifdef __OS400__
-# define NO_vsnprintf
-# endif
-# ifdef __MVS__
-# define NO_vsnprintf
+# elif !defined(__STDC_VERSION__) || __STDC_VERSION__-0 < 199901L
+/* Otherwise if C89/90, assume no C99 snprintf() or vsnprintf() */
+# ifndef NO_snprintf
+# define NO_snprintf
+# endif
+# ifndef NO_vsnprintf
+# define NO_vsnprintf
+# endif
# endif
#endif
@@ -206,7 +207,9 @@ typedef struct {
unsigned char *out; /* output buffer (double-sized when reading) */
int direct; /* 0 if processing gzip, 1 if transparent */
/* just for reading */
+ int junk; /* -1 = start, 1 = junk candidate, 0 = in gzip */
int how; /* 0: get header, 1: copy, 2: decompress */
+ int again; /* true if EAGAIN or EWOULDBLOCK on last i/o */
z_off64_t start; /* where the gzip data started, for rewinding */
int eof; /* true if end of input file reached */
int past; /* true if read requested past end */
@@ -216,7 +219,6 @@ typedef struct {
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 */
/* error information */
int err; /* error code */
char *msg; /* error message */
diff --git a/src/java.base/share/native/libzip/zlib/gzlib.c b/src/java.base/share/native/libzip/zlib/gzlib.c
index 0f4dfae64a0a..9489bcc1f12e 100644
--- a/src/java.base/share/native/libzip/zlib/gzlib.c
+++ b/src/java.base/share/native/libzip/zlib/gzlib.c
@@ -23,21 +23,21 @@
*/
/* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004-2024 Mark Adler
+ * Copyright (C) 2004-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
-#if defined(_WIN32) && !defined(__BORLANDC__)
+#if defined(__DJGPP__)
+# define LSEEK llseek
+#elif defined(_WIN32) && !defined(__BORLANDC__) && !defined(UNDER_CE)
# define LSEEK _lseeki64
-#else
-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+#elif defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
# define LSEEK lseek
#endif
-#endif
#if defined UNDER_CE
@@ -76,7 +76,7 @@ char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
msgbuf[chars] = 0;
}
- wcstombs(buf, msgbuf, chars + 1);
+ wcstombs(buf, msgbuf, chars + 1); /* assumes buf is big enough */
LocalFree(msgbuf);
}
else {
@@ -96,10 +96,12 @@ local void gz_reset(gz_statep state) {
state->eof = 0; /* not at end of file */
state->past = 0; /* have not read past end yet */
state->how = LOOK; /* look for gzip header */
+ state->junk = -1; /* mark first member */
}
else /* for writing ... */
state->reset = 0; /* no deflateReset pending */
- state->seek = 0; /* no seek request pending */
+ state->again = 0; /* no stalled i/o yet */
+ state->skip = 0; /* no seek request pending */
gz_error(state, Z_OK, NULL); /* clear error */
state->x.pos = 0; /* no uncompressed data yet */
state->strm.avail_in = 0; /* no input data yet */
@@ -109,16 +111,13 @@ local void gz_reset(gz_statep state) {
local gzFile gz_open(const void *path, int fd, const char *mode) {
gz_statep state;
z_size_t len;
- int oflag;
-#ifdef O_CLOEXEC
- int cloexec = 0;
-#endif
+ int oflag = 0;
#ifdef O_EXCL
int exclusive = 0;
#endif
/* check input */
- if (path == NULL)
+ if (path == NULL || mode == NULL)
return NULL;
/* allocate gzFile structure to return */
@@ -127,6 +126,7 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
return NULL;
state->size = 0; /* no buffers allocated yet */
state->want = GZBUFSIZE; /* requested buffer size */
+ state->err = Z_OK; /* no error yet */
state->msg = NULL; /* no error message yet */
/* interpret mode */
@@ -157,7 +157,7 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
break;
#ifdef O_CLOEXEC
case 'e':
- cloexec = 1;
+ oflag |= O_CLOEXEC;
break;
#endif
#ifdef O_EXCL
@@ -177,6 +177,14 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
case 'F':
state->strategy = Z_FIXED;
break;
+ case 'G':
+ state->direct = -1;
+ break;
+#ifdef O_NONBLOCK
+ case 'N':
+ oflag |= O_NONBLOCK;
+ break;
+#endif
case 'T':
state->direct = 1;
break;
@@ -192,22 +200,30 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
return NULL;
}
- /* can't force transparent read */
+ /* direct is 0, 1 if "T", or -1 if "G" (last "G" or "T" wins) */
if (state->mode == GZ_READ) {
- if (state->direct) {
+ if (state->direct == 1) {
+ /* can't force a transparent read */
free(state);
return NULL;
}
- state->direct = 1; /* for empty file */
+ if (state->direct == 0)
+ /* default when reading is auto-detect of gzip vs. transparent --
+ start with a transparent assumption in case of an empty file */
+ state->direct = 1;
}
+ else if (state->direct == -1) {
+ /* "G" has no meaning when writing -- disallow it */
+ free(state);
+ return NULL;
+ }
+ /* if reading, direct == 1 for auto-detect, -1 for gzip only; if writing or
+ appending, direct == 0 for gzip, 1 for transparent (copy in to out) */
/* save the path name for error messages */
#ifdef WIDECHAR
- if (fd == -2) {
+ if (fd == -2)
len = wcstombs(NULL, path, 0);
- if (len == (z_size_t)-1)
- len = 0;
- }
else
#endif
len = strlen((const char *)path);
@@ -217,29 +233,29 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
return NULL;
}
#ifdef WIDECHAR
- if (fd == -2)
+ if (fd == -2) {
if (len)
wcstombs(state->path, path, len + 1);
else
*(state->path) = 0;
+ }
else
#endif
+ {
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
(void)snprintf(state->path, len + 1, "%s", (const char *)path);
#else
strcpy(state->path, path);
#endif
+ }
/* compute the flags for open() */
- oflag =
+ oflag |=
#ifdef O_LARGEFILE
O_LARGEFILE |
#endif
#ifdef O_BINARY
O_BINARY |
-#endif
-#ifdef O_CLOEXEC
- (cloexec ? O_CLOEXEC : 0) |
#endif
(state->mode == GZ_READ ?
O_RDONLY :
@@ -252,11 +268,23 @@ local gzFile gz_open(const void *path, int fd, const char *mode) {
O_APPEND)));
/* open the file with the appropriate flags (or just use fd) */
- state->fd = fd > -1 ? fd : (
+ if (fd == -1)
+ state->fd = open((const char *)path, oflag, 0666);
#ifdef WIDECHAR
- fd == -2 ? _wopen(path, oflag, 0666) :
+ else if (fd == -2)
+ state->fd = _wopen(path, oflag, _S_IREAD | _S_IWRITE);
+#endif
+ else {
+#ifdef O_NONBLOCK
+ if (oflag & O_NONBLOCK)
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
#endif
- open((const char *)path, oflag, 0666));
+#ifdef O_CLOEXEC
+ if (oflag & O_CLOEXEC)
+ fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | O_CLOEXEC);
+#endif
+ state->fd = fd;
+ }
if (state->fd == -1) {
free(state->path);
free(state);
@@ -383,9 +411,10 @@ z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
/* normalize offset to a SEEK_CUR specification */
if (whence == SEEK_SET)
offset -= state->x.pos;
- else if (state->seek)
- offset += state->skip;
- state->seek = 0;
+ else {
+ offset += state->past ? 0 : state->skip;
+ state->skip = 0;
+ }
/* if within raw area while reading, just go there */
if (state->mode == GZ_READ && state->how == COPY &&
@@ -396,7 +425,7 @@ z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
state->x.have = 0;
state->eof = 0;
state->past = 0;
- state->seek = 0;
+ state->skip = 0;
gz_error(state, Z_OK, NULL);
state->strm.avail_in = 0;
state->x.pos += offset;
@@ -425,10 +454,7 @@ z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
}
/* request skip (if not zero) */
- if (offset) {
- state->seek = 1;
- state->skip = offset;
- }
+ state->skip = offset;
return state->x.pos + offset;
}
@@ -452,7 +478,7 @@ z_off64_t ZEXPORT gztell64(gzFile file) {
return -1;
/* return position */
- return state->x.pos + (state->seek ? state->skip : 0);
+ return state->x.pos + (state->past ? 0 : state->skip);
}
/* -- see zlib.h -- */
@@ -559,7 +585,7 @@ void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
}
/* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
- if (err != Z_OK && err != Z_BUF_ERROR)
+ if (err != Z_OK && err != Z_BUF_ERROR && !state->again)
state->x.have = 0;
/* set error code, and if no message, then done */
@@ -596,6 +622,7 @@ unsigned ZLIB_INTERNAL gz_intmax(void) {
return INT_MAX;
#else
unsigned p = 1, q;
+
do {
q = p;
p <<= 1;
diff --git a/src/java.base/share/native/libzip/zlib/gzread.c b/src/java.base/share/native/libzip/zlib/gzread.c
index 7b9c9df5fa1d..89144d2e56fe 100644
--- a/src/java.base/share/native/libzip/zlib/gzread.c
+++ b/src/java.base/share/native/libzip/zlib/gzread.c
@@ -23,7 +23,7 @@
*/
/* gzread.c -- zlib functions for reading gzip files
- * Copyright (C) 2004-2017 Mark Adler
+ * Copyright (C) 2004-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -32,23 +32,36 @@
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
state->fd, and update state->eof, state->err, and state->msg as appropriate.
This function needs to loop on read(), since read() is not guaranteed to
- read the number of bytes requested, depending on the type of descriptor. */
+ read the number of bytes requested, depending on the type of descriptor. It
+ also needs to loop to manage the fact that read() returns an int. If the
+ descriptor is non-blocking and read() returns with no data in order to avoid
+ blocking, then gz_load() will return 0 if some data has been read, or -1 if
+ no data has been read. Either way, state->again is set true to indicate a
+ non-blocking event. If errno is non-zero on return, then there was an error
+ signaled from read(). *have is set to the number of bytes read. */
local int gz_load(gz_statep state, unsigned char *buf, unsigned len,
unsigned *have) {
int ret;
unsigned get, max = ((unsigned)-1 >> 2) + 1;
+ state->again = 0;
+ errno = 0;
*have = 0;
do {
get = len - *have;
if (get > max)
get = max;
- ret = read(state->fd, buf + *have, get);
+ ret = (int)read(state->fd, buf + *have, get);
if (ret <= 0)
break;
*have += (unsigned)ret;
} while (*have < len);
if (ret < 0) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ state->again = 1;
+ if (*have != 0)
+ return 0;
+ }
gz_error(state, Z_ERRNO, zstrerror());
return -1;
}
@@ -74,10 +87,14 @@ local int gz_avail(gz_statep state) {
if (strm->avail_in) { /* copy what's there to the start */
unsigned char *p = state->in;
unsigned const char *q = strm->next_in;
- unsigned n = strm->avail_in;
- do {
- *p++ = *q++;
- } while (--n);
+
+ if (q != p) {
+ unsigned n = strm->avail_in;
+
+ do {
+ *p++ = *q++;
+ } while (--n);
+ }
}
if (gz_load(state, state->in + strm->avail_in,
state->size - strm->avail_in, &got) == -1)
@@ -128,39 +145,44 @@ local int gz_look(gz_statep state) {
}
}
- /* get at least the magic bytes in the input buffer */
- if (strm->avail_in < 2) {
- if (gz_avail(state) == -1)
- return -1;
- if (strm->avail_in == 0)
- return 0;
- }
-
- /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
- a logical dilemma here when considering the case of a partially written
- gzip file, to wit, if a single 31 byte is written, then we cannot tell
- whether this is a single-byte file, or just a partially written gzip
- file -- for here we assume that if a gzip file is being written, then
- the header will be written in a single operation, so that reading a
- single byte is sufficient indication that it is not a gzip file) */
- if (strm->avail_in > 1 &&
- strm->next_in[0] == 31 && strm->next_in[1] == 139) {
+ /* if transparent reading is disabled, which would only be at the start, or
+ if we're looking for a gzip member after the first one, which is not at
+ the start, then proceed directly to look for a gzip member next */
+ if (state->direct == -1 || state->junk == 0) {
inflateReset(strm);
state->how = GZIP;
+ state->junk = state->junk != -1;
state->direct = 0;
return 0;
}
- /* no gzip header -- if we were decoding gzip before, then this is trailing
- garbage. Ignore the trailing garbage and finish. */
- if (state->direct == 0) {
- strm->avail_in = 0;
- state->eof = 1;
- state->x.have = 0;
+ /* otherwise we're at the start with auto-detect -- we check to see if the
+ first four bytes could be gzip header in order to decide whether or not
+ this will be a transparent read */
+
+ /* load any header bytes into the input buffer -- if the input is empty,
+ then it's not an error as this is a transparent read of zero bytes */
+ if (gz_avail(state) == -1)
+ return -1;
+ if (strm->avail_in == 0 || (state->again && strm->avail_in < 4))
+ /* if non-blocking input stalled before getting four bytes, then
+ return and wait until a later call has accumulated enough */
+ return 0;
+
+ /* see if this is (likely) gzip input -- if the first four bytes are
+ consistent with a gzip header, then go look for the first gzip member,
+ otherwise proceed to copy the input transparently */
+ if (strm->avail_in > 3 &&
+ strm->next_in[0] == 31 && strm->next_in[1] == 139 &&
+ strm->next_in[2] == 8 && strm->next_in[3] < 32) {
+ inflateReset(strm);
+ state->how = GZIP;
+ state->junk = 1;
+ state->direct = 0;
return 0;
}
- /* doing raw i/o, copy any leftover input to output -- this assumes that
+ /* doing raw i/o: copy any leftover input to output -- this assumes that
the output buffer is larger than the input buffer, which also assures
space for gzungetc() */
state->x.next = state->out;
@@ -168,15 +190,17 @@ local int gz_look(gz_statep state) {
state->x.have = strm->avail_in;
strm->avail_in = 0;
state->how = COPY;
- state->direct = 1;
return 0;
}
/* Decompress from input to the provided next_out and avail_out in the state.
On return, state->x.have and state->x.next point to the just decompressed
- data. If the gzip stream completes, state->how is reset to LOOK to look for
- the next gzip stream or raw data, once state->x.have is depleted. Returns 0
- on success, -1 on failure. */
+ data. If the gzip stream completes, state->how is reset to LOOK to look for
+ the next gzip stream or raw data, once state->x.have is depleted. Returns 0
+ on success, -1 on failure. If EOF is reached when looking for more input to
+ complete the gzip member, then an unexpected end of file error is raised.
+ If there is no more input, but state->again is true, then EOF has not been
+ reached, and no error is raised. */
local int gz_decomp(gz_statep state) {
int ret = Z_OK;
unsigned had;
@@ -186,28 +210,41 @@ local int gz_decomp(gz_statep state) {
had = strm->avail_out;
do {
/* get more input for inflate() */
- if (strm->avail_in == 0 && gz_avail(state) == -1)
- return -1;
+ if (strm->avail_in == 0 && gz_avail(state) == -1) {
+ ret = state->err;
+ break;
+ }
if (strm->avail_in == 0) {
- gz_error(state, Z_BUF_ERROR, "unexpected end of file");
+ if (!state->again)
+ gz_error(state, Z_BUF_ERROR, "unexpected end of file");
break;
}
/* decompress and handle errors */
ret = inflate(strm, Z_NO_FLUSH);
+ if (strm->avail_out < had)
+ /* any decompressed data marks this as a real gzip stream */
+ state->junk = 0;
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
gz_error(state, Z_STREAM_ERROR,
"internal error: inflate stream corrupt");
- return -1;
+ break;
}
if (ret == Z_MEM_ERROR) {
gz_error(state, Z_MEM_ERROR, "out of memory");
- return -1;
+ break;
}
if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
+ if (state->junk == 1) { /* trailing garbage is ok */
+ strm->avail_in = 0;
+ state->eof = 1;
+ state->how = LOOK;
+ ret = Z_OK;
+ break;
+ }
gz_error(state, Z_DATA_ERROR,
strm->msg == NULL ? "compressed data error" : strm->msg);
- return -1;
+ break;
}
} while (strm->avail_out && ret != Z_STREAM_END);
@@ -216,11 +253,14 @@ local int gz_decomp(gz_statep state) {
state->x.next = strm->next_out - state->x.have;
/* if the gzip stream completed successfully, look for another */
- if (ret == Z_STREAM_END)
+ if (ret == Z_STREAM_END) {
+ state->junk = 0;
state->how = LOOK;
+ return 0;
+ }
- /* good decompression */
- return 0;
+ /* return decompression status */
+ return ret != Z_OK ? -1 : 0;
}
/* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
@@ -251,25 +291,31 @@ local int gz_fetch(gz_statep state) {
strm->next_out = state->out;
if (gz_decomp(state) == -1)
return -1;
+ break;
+ default:
+ gz_error(state, Z_STREAM_ERROR, "state corrupt");
+ return -1;
}
} while (state->x.have == 0 && (!state->eof || strm->avail_in));
return 0;
}
-/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
-local int gz_skip(gz_statep state, z_off64_t len) {
+/* Skip state->skip (> 0) uncompressed bytes of output. Return -1 on error, 0
+ on success. */
+local int gz_skip(gz_statep state) {
unsigned n;
/* skip over len bytes or reach end-of-file, whichever comes first */
- while (len)
+ do {
/* skip over whatever is in output buffer */
if (state->x.have) {
- n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
- (unsigned)len : state->x.have;
+ n = GT_OFF(state->x.have) ||
+ (z_off64_t)state->x.have > state->skip ?
+ (unsigned)state->skip : state->x.have;
state->x.have -= n;
state->x.next += n;
state->x.pos += n;
- len -= n;
+ state->skip -= n;
}
/* output buffer empty -- return if we're at the end of the input */
@@ -282,30 +328,32 @@ local int gz_skip(gz_statep state, z_off64_t len) {
if (gz_fetch(state) == -1)
return -1;
}
+ } while (state->skip);
return 0;
}
/* Read len bytes into buf from file, or less than len up to the end of the
- input. Return the number of bytes read. If zero is returned, either the
- end of file was reached, or there was an error. state->err must be
- consulted in that case to determine which. */
+ input. Return the number of bytes read. If zero is returned, either the end
+ of file was reached, or there was an error. state->err must be consulted in
+ that case to determine which. If there was an error, but some uncompressed
+ bytes were read before the error, then that count is returned. The error is
+ still recorded, and so is deferred until the next call. */
local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
z_size_t got;
unsigned n;
+ int err;
/* if len is zero, avoid unnecessary operations */
if (len == 0)
return 0;
/* process a skip request */
- if (state->seek) {
- state->seek = 0;
- if (gz_skip(state, state->skip) == -1)
- return 0;
- }
+ if (state->skip && gz_skip(state) == -1)
+ return 0;
/* get len bytes to buf, or less than len if at the end */
got = 0;
+ err = 0;
do {
/* set n to the maximum amount of len that fits in an unsigned int */
n = (unsigned)-1;
@@ -319,37 +367,36 @@ local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
memcpy(buf, state->x.next, n);
state->x.next += n;
state->x.have -= n;
+ if (state->err != Z_OK)
+ /* caught deferred error from gz_fetch() */
+ err = -1;
}
/* output buffer empty -- return if we're at the end of the input */
- else if (state->eof && state->strm.avail_in == 0) {
- state->past = 1; /* tried to read past end */
+ else if (state->eof && state->strm.avail_in == 0)
break;
- }
/* need output data -- for small len or new stream load up our output
- buffer */
+ buffer, so that gzgetc() can be fast */
else if (state->how == LOOK || n < (state->size << 1)) {
/* get more output, looking for header if required */
- if (gz_fetch(state) == -1)
- return 0;
+ if (gz_fetch(state) == -1 && state->x.have == 0)
+ /* if state->x.have != 0, error will be caught after copy */
+ err = -1;
continue; /* no progress yet -- go back to copy above */
/* the copy above assures that we will leave with space in the
output buffer, allowing at least one gzungetc() to succeed */
}
/* large len -- read directly into user buffer */
- else if (state->how == COPY) { /* read directly */
- if (gz_load(state, (unsigned char *)buf, n, &n) == -1)
- return 0;
- }
+ else if (state->how == COPY) /* read directly */
+ err = gz_load(state, (unsigned char *)buf, n, &n);
/* large len -- decompress directly into user buffer */
else { /* state->how == GZIP */
state->strm.avail_out = n;
state->strm.next_out = (unsigned char *)buf;
- if (gz_decomp(state) == -1)
- return 0;
+ err = gz_decomp(state);
n = state->x.have;
state->x.have = 0;
}
@@ -359,7 +406,11 @@ local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
buf = (char *)buf + n;
got += n;
state->x.pos += n;
- } while (len);
+ } while (len && !err);
+
+ /* note read past eof */
+ if (len && state->eof)
+ state->past = 1;
/* return number of bytes read into user buffer */
return got;
@@ -369,15 +420,17 @@ local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
gz_statep state;
- /* get internal structure */
+ /* get internal structure and check that it's for reading */
if (file == NULL)
return -1;
state = (gz_statep)file;
+ if (state->mode != GZ_READ)
+ return -1;
- /* check that we're reading and that there's no (serious) error */
- if (state->mode != GZ_READ ||
- (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ /* check that there was no (serious) error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR && !state->again)
return -1;
+ gz_error(state, Z_OK, NULL);
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids a flaw in the interface) */
@@ -390,27 +443,39 @@ int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
len = (unsigned)gz_read(state, buf, len);
/* check for an error */
- if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
- return -1;
+ if (len == 0) {
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+ if (state->again) {
+ /* non-blocking input stalled after some input was read, but no
+ uncompressed bytes were produced -- let the application know
+ this isn't EOF */
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ }
- /* return the number of bytes read (this is assured to fit in an int) */
+ /* return the number of bytes read */
return (int)len;
}
/* -- see zlib.h -- */
-z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) {
+z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
+ gzFile file) {
z_size_t len;
gz_statep state;
- /* get internal structure */
+ /* get internal structure and check that it's for reading */
if (file == NULL)
return 0;
state = (gz_statep)file;
+ if (state->mode != GZ_READ)
+ return 0;
- /* check that we're reading and that there's no (serious) error */
- if (state->mode != GZ_READ ||
- (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ /* check that there was no (serious) error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR && !state->again)
return 0;
+ gz_error(state, Z_OK, NULL);
/* compute bytes to read -- error on overflow */
len = nitems * size;
@@ -433,15 +498,17 @@ int ZEXPORT gzgetc(gzFile file) {
unsigned char buf[1];
gz_statep state;
- /* get internal structure */
+ /* get internal structure and check that it's for reading */
if (file == NULL)
return -1;
state = (gz_statep)file;
+ if (state->mode != GZ_READ)
+ return -1;
- /* check that we're reading and that there's no (serious) error */
- if (state->mode != GZ_READ ||
- (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ /* check that there was no (serious) error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR && !state->again)
return -1;
+ gz_error(state, Z_OK, NULL);
/* try output buffer (no need to check for skip request) */
if (state->x.have) {
@@ -462,26 +529,25 @@ int ZEXPORT gzgetc_(gzFile file) {
int ZEXPORT gzungetc(int c, gzFile file) {
gz_statep state;
- /* get internal structure */
+ /* get internal structure and check that it's for reading */
if (file == NULL)
return -1;
state = (gz_statep)file;
+ if (state->mode != GZ_READ)
+ return -1;
/* in case this was just opened, set up the input buffer */
- if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+ if (state->how == LOOK && state->x.have == 0)
(void)gz_look(state);
- /* check that we're reading and that there's no (serious) error */
- if (state->mode != GZ_READ ||
- (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ /* check that there was no (serious) error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR && !state->again)
return -1;
+ gz_error(state, Z_OK, NULL);
/* process a skip request */
- if (state->seek) {
- state->seek = 0;
- if (gz_skip(state, state->skip) == -1)
- return -1;
- }
+ if (state->skip && gz_skip(state) == -1)
+ return -1;
/* can't push EOF */
if (c < 0)
@@ -507,6 +573,7 @@ int ZEXPORT gzungetc(int c, gzFile file) {
if (state->x.next == state->out) {
unsigned char *src = state->out + state->x.have;
unsigned char *dest = state->out + (state->size << 1);
+
while (src > state->out)
*--dest = *--src;
state->x.next = dest;
@@ -526,32 +593,31 @@ char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
unsigned char *eol;
gz_statep state;
- /* check parameters and get internal structure */
+ /* check parameters, get internal structure, and check that it's for
+ reading */
if (file == NULL || buf == NULL || len < 1)
return NULL;
state = (gz_statep)file;
+ if (state->mode != GZ_READ)
+ return NULL;
- /* check that we're reading and that there's no (serious) error */
- if (state->mode != GZ_READ ||
- (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ /* check that there was no (serious) error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR && !state->again)
return NULL;
+ gz_error(state, Z_OK, NULL);
/* process a skip request */
- if (state->seek) {
- state->seek = 0;
- if (gz_skip(state, state->skip) == -1)
- return NULL;
- }
+ if (state->skip && gz_skip(state) == -1)
+ return NULL;
- /* copy output bytes up to new line or len - 1, whichever comes first --
- append a terminating zero to the string (we don't check for a zero in
- the contents, let the user worry about that) */
+ /* copy output up to a new line, len-1 bytes, or there is no more output,
+ whichever comes first */
str = buf;
left = (unsigned)len - 1;
if (left) do {
/* assure that something is in the output buffer */
if (state->x.have == 0 && gz_fetch(state) == -1)
- return NULL; /* error */
+ break; /* error */
if (state->x.have == 0) { /* end of file */
state->past = 1; /* read past end */
break; /* return what we have */
@@ -572,7 +638,9 @@ char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
buf += n;
} while (left && eol == NULL);
- /* return terminated string, or if nothing, end of file */
+ /* append a terminating zero to the string (we don't check for a zero in
+ the contents, let the user worry about that) -- return the terminated
+ string, or if nothing was read, NULL */
if (buf == str)
return NULL;
buf[0] = 0;
@@ -594,7 +662,7 @@ int ZEXPORT gzdirect(gzFile file) {
(void)gz_look(state);
/* return 1 if transparent, 0 if processing a gzip stream */
- return state->direct;
+ return state->direct == 1;
}
/* -- see zlib.h -- */
@@ -602,12 +670,10 @@ int ZEXPORT gzclose_r(gzFile file) {
int ret, err;
gz_statep state;
- /* get internal structure */
+ /* get internal structure and check that it's for reading */
if (file == NULL)
return Z_STREAM_ERROR;
state = (gz_statep)file;
-
- /* check that we're reading */
if (state->mode != GZ_READ)
return Z_STREAM_ERROR;
diff --git a/src/java.base/share/native/libzip/zlib/gzwrite.c b/src/java.base/share/native/libzip/zlib/gzwrite.c
index 008b03e70213..b11c318d5432 100644
--- a/src/java.base/share/native/libzip/zlib/gzwrite.c
+++ b/src/java.base/share/native/libzip/zlib/gzwrite.c
@@ -23,7 +23,7 @@
*/
/* gzwrite.c -- zlib functions for writing gzip files
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -98,9 +98,13 @@ local int gz_comp(gz_statep state, int flush) {
/* write directly if requested */
if (state->direct) {
while (strm->avail_in) {
+ errno = 0;
+ state->again = 0;
put = strm->avail_in > max ? max : strm->avail_in;
- writ = write(state->fd, strm->next_in, put);
+ writ = (int)write(state->fd, strm->next_in, put);
if (writ < 0) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ state->again = 1;
gz_error(state, Z_ERRNO, zstrerror());
return -1;
}
@@ -112,8 +116,9 @@ local int gz_comp(gz_statep state, int flush) {
/* check for a pending reset */
if (state->reset) {
- /* don't start a new gzip member unless there is data to write */
- if (strm->avail_in == 0)
+ /* don't start a new gzip member unless there is data to write and
+ we're not flushing */
+ if (strm->avail_in == 0 && flush == Z_NO_FLUSH)
return 0;
deflateReset(strm);
state->reset = 0;
@@ -127,10 +132,14 @@ local int gz_comp(gz_statep state, int flush) {
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
(flush != Z_FINISH || ret == Z_STREAM_END))) {
while (strm->next_out > state->x.next) {
+ errno = 0;
+ state->again = 0;
put = strm->next_out - state->x.next > (int)max ? max :
(unsigned)(strm->next_out - state->x.next);
- writ = write(state->fd, state->x.next, put);
+ writ = (int)write(state->fd, state->x.next, put);
if (writ < 0) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ state->again = 1;
gz_error(state, Z_ERRNO, zstrerror());
return -1;
}
@@ -162,10 +171,12 @@ local int gz_comp(gz_statep state, int flush) {
return 0;
}
-/* Compress len zeros to output. Return -1 on a write error or memory
- allocation failure by gz_comp(), or 0 on success. */
-local int gz_zero(gz_statep state, z_off64_t len) {
- int first;
+/* Compress state->skip (> 0) zeros to output. Return -1 on a write error or
+ memory allocation failure by gz_comp(), or 0 on success. state->skip is
+ updated with the number of successfully written zeros, in case there is a
+ stall on a non-blocking write destination. */
+local int gz_zero(gz_statep state) {
+ int first, ret;
unsigned n;
z_streamp strm = &(state->strm);
@@ -173,29 +184,34 @@ local int gz_zero(gz_statep state, z_off64_t len) {
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
return -1;
- /* compress len zeros (len guaranteed > 0) */
+ /* compress state->skip zeros */
first = 1;
- while (len) {
- n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
- (unsigned)len : state->size;
+ do {
+ n = GT_OFF(state->size) || (z_off64_t)state->size > state->skip ?
+ (unsigned)state->skip : state->size;
if (first) {
memset(state->in, 0, n);
first = 0;
}
strm->avail_in = n;
strm->next_in = state->in;
+ ret = gz_comp(state, Z_NO_FLUSH);
+ n -= strm->avail_in;
state->x.pos += n;
- if (gz_comp(state, Z_NO_FLUSH) == -1)
+ state->skip -= n;
+ if (ret == -1)
return -1;
- len -= n;
- }
+ } while (state->skip);
return 0;
}
/* Write len bytes from buf to file. Return the number of bytes written. If
- the returned value is less than len, then there was an error. */
+ the returned value is less than len, then there was an error. If the error
+ was a non-blocking stall, then the number of bytes consumed is returned.
+ For any other error, 0 is returned. */
local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
z_size_t put = len;
+ int ret;
/* if len is zero, avoid unnecessary operations */
if (len == 0)
@@ -206,16 +222,13 @@ local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
return 0;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return 0;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return 0;
/* for small len, copy to input buffer, otherwise compress directly */
if (len < state->size) {
/* copy to input buffer, compress when full */
- do {
+ for (;;) {
unsigned have, copy;
if (state->strm.avail_in == 0)
@@ -230,9 +243,11 @@ local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
state->x.pos += copy;
buf = (const char *)buf + copy;
len -= copy;
- if (len && gz_comp(state, Z_NO_FLUSH) == -1)
- return 0;
- } while (len);
+ if (len == 0)
+ break;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return state->again ? put - len : 0;
+ }
}
else {
/* consume whatever's left in the input buffer */
@@ -243,13 +258,16 @@ local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
state->strm.next_in = (z_const Bytef *)buf;
do {
unsigned n = (unsigned)-1;
+
if (n > len)
n = (unsigned)len;
state->strm.avail_in = n;
+ ret = gz_comp(state, Z_NO_FLUSH);
+ n -= state->strm.avail_in;
state->x.pos += n;
- if (gz_comp(state, Z_NO_FLUSH) == -1)
- return 0;
len -= n;
+ if (ret == -1)
+ return state->again ? put - len : 0;
} while (len);
}
@@ -266,9 +284,10 @@ int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) {
return 0;
state = (gz_statep)file;
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return 0;
+ gz_error(state, Z_OK, NULL);
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids a flaw in the interface) */
@@ -292,9 +311,10 @@ z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
return 0;
state = (gz_statep)file;
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return 0;
+ gz_error(state, Z_OK, NULL);
/* compute bytes to read -- error on overflow */
len = nitems * size;
@@ -320,16 +340,14 @@ int ZEXPORT gzputc(gzFile file, int c) {
state = (gz_statep)file;
strm = &(state->strm);
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return -1;
+ gz_error(state, Z_OK, NULL);
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return -1;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return -1;
/* try writing to input buffer for speed (state->size == 0 if buffer not
initialized) */
@@ -362,9 +380,10 @@ int ZEXPORT gzputs(gzFile file, const char *s) {
return -1;
state = (gz_statep)file;
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return -1;
+ gz_error(state, Z_OK, NULL);
/* write string */
len = strlen(s);
@@ -373,16 +392,47 @@ int ZEXPORT gzputs(gzFile file, const char *s) {
return -1;
}
put = gz_write(state, s, len);
- return put < len ? -1 : (int)len;
+ return len && put == 0 ? -1 : (int)put;
+}
+
+#if (((!defined(STDC) && !defined(Z_HAVE_STDARG_H)) || !defined(NO_vsnprintf)) && \
+ (defined(STDC) || defined(Z_HAVE_STDARG_H) || !defined(NO_snprintf))) || \
+ defined(ZLIB_INSECURE)
+/* If the second half of the input buffer is occupied, write out the contents.
+ If there is any input remaining due to a non-blocking stall on write, move
+ it to the start of the buffer. Return true if this did not open up the
+ second half of the buffer. state->err should be checked after this to
+ handle a gz_comp() error. */
+local int gz_vacate(gz_statep state) {
+ z_streamp strm;
+
+ strm = &(state->strm);
+ if (strm->next_in + strm->avail_in <= state->in + state->size)
+ return 0;
+ (void)gz_comp(state, Z_NO_FLUSH);
+ if (strm->avail_in == 0) {
+ strm->next_in = state->in;
+ return 0;
+ }
+ memmove(state->in, strm->next_in, strm->avail_in);
+ strm->next_in = state->in;
+ return strm->avail_in > state->size;
}
+#endif
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
#include
/* -- see zlib.h -- */
int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
- int len;
- unsigned left;
+#if defined(NO_vsnprintf) && !defined(ZLIB_INSECURE)
+#warning "vsnprintf() not available -- gzprintf() stub returns Z_STREAM_ERROR"
+#warning "you can recompile with ZLIB_INSECURE defined to use vsprintf()"
+ /* prevent use of insecure vsprintf(), unless purposefully requested */
+ (void)file, (void)format, (void)va;
+ return Z_STREAM_ERROR;
+#else
+ int len, ret;
char *next;
gz_statep state;
z_streamp strm;
@@ -393,24 +443,34 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
state = (gz_statep)file;
strm = &(state->strm);
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return Z_STREAM_ERROR;
+ gz_error(state, Z_OK, NULL);
/* make sure we have some buffer space */
if (state->size == 0 && gz_init(state) == -1)
return state->err;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return state->err;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return state->err;
/* do the printf() into the input buffer, put length in len -- the input
- buffer is double-sized just for this function, so there is guaranteed to
- be state->size bytes available after the current contents */
+ buffer is double-sized just for this function, so there should be
+ state->size bytes available after the current contents */
+ ret = gz_vacate(state);
+ if (state->err) {
+ if (ret && state->again) {
+ /* There was a non-blocking stall on write, resulting in the part
+ of the second half of the output buffer being occupied. Return
+ a Z_BUF_ERROR to let the application know that this gzprintf()
+ needs to be retried. */
+ gz_error(state, Z_BUF_ERROR, "stalled write on gzprintf");
+ }
+ if (!state->again)
+ return state->err;
+ }
if (strm->avail_in == 0)
strm->next_in = state->in;
next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in);
@@ -436,19 +496,16 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0)
return 0;
- /* update buffer and position, compress first half if past that */
+ /* update buffer and position */
strm->avail_in += (unsigned)len;
state->x.pos += len;
- if (strm->avail_in >= state->size) {
- left = strm->avail_in - state->size;
- strm->avail_in = state->size;
- if (gz_comp(state, Z_NO_FLUSH) == -1)
- return state->err;
- memmove(state->in, state->in + state->size, left);
- strm->next_in = state->in;
- strm->avail_in = left;
- }
+
+ /* write out buffer if more than half is occupied */
+ ret = gz_vacate(state);
+ if (state->err && !state->again)
+ return state->err;
return len;
+#endif
}
int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) {
@@ -468,6 +525,17 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
int a4, int a5, int a6, int a7, int a8, int a9, int a10,
int a11, int a12, int a13, int a14, int a15, int a16,
int a17, int a18, int a19, int a20) {
+#if defined(NO_snprintf) && !defined(ZLIB_INSECURE)
+#warning "snprintf() not available -- gzprintf() stub returns Z_STREAM_ERROR"
+#warning "you can recompile with ZLIB_INSECURE defined to use sprintf()"
+ /* prevent use of insecure sprintf(), unless purposefully requested */
+ (void)file, (void)format, (void)a1, (void)a2, (void)a3, (void)a4, (void)a5,
+ (void)a6, (void)a7, (void)a8, (void)a9, (void)a10, (void)a11, (void)a12,
+ (void)a13, (void)a14, (void)a15, (void)a16, (void)a17, (void)a18,
+ (void)a19, (void)a20;
+ return Z_STREAM_ERROR;
+#else
+ int ret;
unsigned len, left;
char *next;
gz_statep state;
@@ -483,24 +551,34 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
if (sizeof(int) != sizeof(void *))
return Z_STREAM_ERROR;
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return Z_STREAM_ERROR;
+ gz_error(state, Z_OK, NULL);
/* make sure we have some buffer space */
if (state->size == 0 && gz_init(state) == -1)
- return state->error;
+ return state->err;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return state->error;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return state->err;
/* do the printf() into the input buffer, put length in len -- the input
buffer is double-sized just for this function, so there is guaranteed to
be state->size bytes available after the current contents */
+ ret = gz_vacate(state);
+ if (state->err) {
+ if (ret && state->again) {
+ /* There was a non-blocking stall on write, resulting in the part
+ of the second half of the output buffer being occupied. Return
+ a Z_BUF_ERROR to let the application know that this gzprintf()
+ needs to be retried. */
+ gz_error(state, Z_BUF_ERROR, "stalled write on gzprintf");
+ }
+ if (!state->again)
+ return state->err;
+ }
if (strm->avail_in == 0)
strm->next_in = state->in;
next = (char *)(strm->next_in + strm->avail_in);
@@ -534,16 +612,13 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
/* update buffer and position, compress first half if past that */
strm->avail_in += len;
state->x.pos += len;
- if (strm->avail_in >= state->size) {
- left = strm->avail_in - state->size;
- strm->avail_in = state->size;
- if (gz_comp(state, Z_NO_FLUSH) == -1)
- return state->err;
- memmove(state->in, state->in + state->size, left);
- strm->next_in = state->in;
- strm->avail_in = left;
- }
+
+ /* write out buffer if more than half is occupied */
+ ret = gz_vacate(state);
+ if (state->err && !state->again)
+ return state->err;
return (int)len;
+#endif
}
#endif
@@ -557,20 +632,18 @@ int ZEXPORT gzflush(gzFile file, int flush) {
return Z_STREAM_ERROR;
state = (gz_statep)file;
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ /* check that we're writing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again))
return Z_STREAM_ERROR;
+ gz_error(state, Z_OK, NULL);
/* check flush parameter */
if (flush < 0 || flush > Z_FINISH)
return Z_STREAM_ERROR;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return state->err;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return state->err;
/* compress remaining data with requested flush */
(void)gz_comp(state, flush);
@@ -588,20 +661,19 @@ int ZEXPORT gzsetparams(gzFile file, int level, int strategy) {
state = (gz_statep)file;
strm = &(state->strm);
- /* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
+ /* check that we're compressing and that there's no (serious) error */
+ if (state->mode != GZ_WRITE || (state->err != Z_OK && !state->again) ||
+ state->direct)
return Z_STREAM_ERROR;
+ gz_error(state, Z_OK, NULL);
/* if no change is requested, then do nothing */
if (level == state->level && strategy == state->strategy)
return Z_OK;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- return state->err;
- }
+ if (state->skip && gz_zero(state) == -1)
+ return state->err;
/* change compression parameters for subsequent input */
if (state->size) {
@@ -630,11 +702,8 @@ int ZEXPORT gzclose_w(gzFile file) {
return Z_STREAM_ERROR;
/* check for seek request */
- if (state->seek) {
- state->seek = 0;
- if (gz_zero(state, state->skip) == -1)
- ret = state->err;
- }
+ if (state->skip && gz_zero(state) == -1)
+ ret = state->err;
/* flush, free memory, and close file */
if (gz_comp(state, Z_FINISH) == -1)
diff --git a/src/java.base/share/native/libzip/zlib/infback.c b/src/java.base/share/native/libzip/zlib/infback.c
index f680e2cdbdc3..0becbb9eb4f6 100644
--- a/src/java.base/share/native/libzip/zlib/infback.c
+++ b/src/java.base/share/native/libzip/zlib/infback.c
@@ -23,7 +23,7 @@
*/
/* infback.c -- inflate using a call-back interface
- * Copyright (C) 1995-2022 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -70,7 +70,7 @@ int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
#ifdef Z_SOLO
return Z_STREAM_ERROR;
#else
- strm->zfree = zcfree;
+ strm->zfree = zcfree;
#endif
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
sizeof(struct inflate_state));
@@ -87,57 +87,6 @@ int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
return Z_OK;
}
-/*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding. Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter. This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time. However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
-local void fixedtables(struct inflate_state FAR *state) {
-#ifdef BUILDFIXED
- static int virgin = 1;
- static code *lenfix, *distfix;
- static code fixed[544];
-
- /* build fixed huffman tables if first call (may not be thread safe) */
- if (virgin) {
- unsigned sym, bits;
- static code *next;
-
- /* literal/length table */
- sym = 0;
- while (sym < 144) state->lens[sym++] = 8;
- while (sym < 256) state->lens[sym++] = 9;
- while (sym < 280) state->lens[sym++] = 7;
- while (sym < 288) state->lens[sym++] = 8;
- next = fixed;
- lenfix = next;
- bits = 9;
- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
-
- /* distance table */
- sym = 0;
- while (sym < 32) state->lens[sym++] = 5;
- distfix = next;
- bits = 5;
- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
-
- /* do this just once */
- virgin = 0;
- }
-#else /* !BUILDFIXED */
-# include "inffixed.h"
-#endif /* BUILDFIXED */
- state->lencode = lenfix;
- state->lenbits = 9;
- state->distcode = distfix;
- state->distbits = 5;
-}
-
/* Macros for inflateBack(): */
/* Load returned state from inflate_fast() */
@@ -317,7 +266,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
state->mode = STORED;
break;
case 1: /* fixed block */
- fixedtables(state);
+ inflate_fixed(state);
Tracev((stderr, "inflate: fixed codes block%s\n",
state->last ? " (last)" : ""));
state->mode = LEN; /* decode codes */
@@ -327,8 +276,8 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
state->last ? " (last)" : ""));
state->mode = TABLE;
break;
- case 3:
- strm->msg = (char *)"invalid block type";
+ default:
+ strm->msg = (z_const char *)"invalid block type";
state->mode = BAD;
}
DROPBITS(2);
@@ -339,7 +288,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
BYTEBITS(); /* go to byte boundary */
NEEDBITS(32);
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
- strm->msg = (char *)"invalid stored block lengths";
+ strm->msg = (z_const char *)"invalid stored block lengths";
state->mode = BAD;
break;
}
@@ -377,7 +326,8 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
DROPBITS(4);
#ifndef PKZIP_BUG_WORKAROUND
if (state->nlen > 286 || state->ndist > 30) {
- strm->msg = (char *)"too many length or distance symbols";
+ strm->msg = (z_const char *)
+ "too many length or distance symbols";
state->mode = BAD;
break;
}
@@ -399,7 +349,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
ret = inflate_table(CODES, state->lens, 19, &(state->next),
&(state->lenbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid code lengths set";
+ strm->msg = (z_const char *)"invalid code lengths set";
state->mode = BAD;
break;
}
@@ -422,7 +372,8 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
NEEDBITS(here.bits + 2);
DROPBITS(here.bits);
if (state->have == 0) {
- strm->msg = (char *)"invalid bit length repeat";
+ strm->msg = (z_const char *)
+ "invalid bit length repeat";
state->mode = BAD;
break;
}
@@ -445,7 +396,8 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
DROPBITS(7);
}
if (state->have + copy > state->nlen + state->ndist) {
- strm->msg = (char *)"invalid bit length repeat";
+ strm->msg = (z_const char *)
+ "invalid bit length repeat";
state->mode = BAD;
break;
}
@@ -459,7 +411,8 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
/* check for end-of-block code (better have one) */
if (state->lens[256] == 0) {
- strm->msg = (char *)"invalid code -- missing end-of-block";
+ strm->msg = (z_const char *)
+ "invalid code -- missing end-of-block";
state->mode = BAD;
break;
}
@@ -473,7 +426,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
&(state->lenbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid literal/lengths set";
+ strm->msg = (z_const char *)"invalid literal/lengths set";
state->mode = BAD;
break;
}
@@ -482,7 +435,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
&(state->next), &(state->distbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid distances set";
+ strm->msg = (z_const char *)"invalid distances set";
state->mode = BAD;
break;
}
@@ -541,7 +494,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
/* invalid code */
if (here.op & 64) {
- strm->msg = (char *)"invalid literal/length code";
+ strm->msg = (z_const char *)"invalid literal/length code";
state->mode = BAD;
break;
}
@@ -573,7 +526,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
}
DROPBITS(here.bits);
if (here.op & 64) {
- strm->msg = (char *)"invalid distance code";
+ strm->msg = (z_const char *)"invalid distance code";
state->mode = BAD;
break;
}
@@ -588,7 +541,7 @@ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
}
if (state->offset > state->wsize - (state->whave < state->wsize ?
left : 0)) {
- strm->msg = (char *)"invalid distance too far back";
+ strm->msg = (z_const char *)"invalid distance too far back";
state->mode = BAD;
break;
}
diff --git a/src/java.base/share/native/libzip/zlib/inffast.c b/src/java.base/share/native/libzip/zlib/inffast.c
index e86dd78d8011..1ce89512ec4f 100644
--- a/src/java.base/share/native/libzip/zlib/inffast.c
+++ b/src/java.base/share/native/libzip/zlib/inffast.c
@@ -23,7 +23,7 @@
*/
/* inffast.c -- fast decoding
- * Copyright (C) 1995-2017 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -179,7 +179,8 @@ void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
dist += (unsigned)hold & ((1U << op) - 1);
#ifdef INFLATE_STRICT
if (dist > dmax) {
- strm->msg = (char *)"invalid distance too far back";
+ strm->msg = (z_const char *)
+ "invalid distance too far back";
state->mode = BAD;
break;
}
@@ -192,8 +193,8 @@ void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
op = dist - op; /* distance back in window */
if (op > whave) {
if (state->sane) {
- strm->msg =
- (char *)"invalid distance too far back";
+ strm->msg = (z_const char *)
+ "invalid distance too far back";
state->mode = BAD;
break;
}
@@ -289,7 +290,7 @@ void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
goto dodist;
}
else {
- strm->msg = (char *)"invalid distance code";
+ strm->msg = (z_const char *)"invalid distance code";
state->mode = BAD;
break;
}
@@ -304,7 +305,7 @@ void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
break;
}
else {
- strm->msg = (char *)"invalid literal/length code";
+ strm->msg = (z_const char *)"invalid literal/length code";
state->mode = BAD;
break;
}
diff --git a/src/java.base/share/native/libzip/zlib/inffixed.h b/src/java.base/share/native/libzip/zlib/inffixed.h
index f0a4ef1c4e80..d234b018c87c 100644
--- a/src/java.base/share/native/libzip/zlib/inffixed.h
+++ b/src/java.base/share/native/libzip/zlib/inffixed.h
@@ -22,97 +22,97 @@
* questions.
*/
- /* inffixed.h -- table for decoding fixed codes
- * Generated automatically by makefixed().
- */
+/* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by makefixed().
+ */
- /* WARNING: this file should *not* be used by applications.
- It is part of the implementation of this library and is
- subject to change. Applications should only use zlib.h.
- */
+/* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
+ */
- static const code lenfix[512] = {
- {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
- {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
- {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
- {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
- {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
- {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
- {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
- {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
- {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
- {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
- {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
- {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
- {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
- {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
- {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
- {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
- {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
- {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
- {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
- {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
- {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
- {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
- {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
- {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
- {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
- {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
- {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
- {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
- {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
- {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
- {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
- {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
- {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
- {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
- {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
- {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
- {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
- {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
- {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
- {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
- {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
- {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
- {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
- {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
- {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
- {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
- {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
- {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
- {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
- {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
- {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
- {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
- {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
- {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
- {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
- {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
- {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
- {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
- {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
- {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
- {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
- {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
- {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
- {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
- {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
- {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
- {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
- {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
- {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
- {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
- {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
- {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
- {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
- {0,9,255}
- };
+static const code lenfix[512] = {
+ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
+ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
+ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
+ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+ {0,9,255}
+};
- static const code distfix[32] = {
- {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
- {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
- {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
- {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
- {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
- {22,5,193},{64,5,0}
- };
+static const code distfix[32] = {
+ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
+ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+ {22,5,193},{64,5,0}
+};
diff --git a/src/java.base/share/native/libzip/zlib/inflate.c b/src/java.base/share/native/libzip/zlib/inflate.c
index 3370cfe95659..c548f98f6de3 100644
--- a/src/java.base/share/native/libzip/zlib/inflate.c
+++ b/src/java.base/share/native/libzip/zlib/inflate.c
@@ -23,7 +23,7 @@
*/
/* inflate.c -- zlib decompression
- * Copyright (C) 1995-2022 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -109,12 +109,6 @@
#include "inflate.h"
#include "inffast.h"
-#ifdef MAKEFIXED
-# ifndef BUILDFIXED
-# define BUILDFIXED
-# endif
-#endif
-
local int inflateStateCheck(z_streamp strm) {
struct inflate_state FAR *state;
if (strm == Z_NULL ||
@@ -134,6 +128,7 @@ int ZEXPORT inflateResetKeep(z_streamp strm) {
state = (struct inflate_state FAR *)strm->state;
strm->total_in = strm->total_out = state->total = 0;
strm->msg = Z_NULL;
+ strm->data_type = 0;
if (state->wrap) /* to support ill-conceived Java test suite */
strm->adler = state->wrap & 1;
state->mode = HEAD;
@@ -226,6 +221,7 @@ int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
state = (struct inflate_state FAR *)
ZALLOC(strm, 1, sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
+ zmemzero(state, sizeof(struct inflate_state));
Tracev((stderr, "inflate: allocated\n"));
strm->state = (struct internal_state FAR *)state;
state->strm = strm;
@@ -258,123 +254,11 @@ int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) {
}
if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
value &= (1L << bits) - 1;
- state->hold += (unsigned)value << state->bits;
+ state->hold += (unsigned long)value << state->bits;
state->bits += (uInt)bits;
return Z_OK;
}
-/*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding. Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter. This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time. However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
-local void fixedtables(struct inflate_state FAR *state) {
-#ifdef BUILDFIXED
- static int virgin = 1;
- static code *lenfix, *distfix;
- static code fixed[544];
-
- /* build fixed huffman tables if first call (may not be thread safe) */
- if (virgin) {
- unsigned sym, bits;
- static code *next;
-
- /* literal/length table */
- sym = 0;
- while (sym < 144) state->lens[sym++] = 8;
- while (sym < 256) state->lens[sym++] = 9;
- while (sym < 280) state->lens[sym++] = 7;
- while (sym < 288) state->lens[sym++] = 8;
- next = fixed;
- lenfix = next;
- bits = 9;
- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
-
- /* distance table */
- sym = 0;
- while (sym < 32) state->lens[sym++] = 5;
- distfix = next;
- bits = 5;
- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
-
- /* do this just once */
- virgin = 0;
- }
-#else /* !BUILDFIXED */
-# include "inffixed.h"
-#endif /* BUILDFIXED */
- state->lencode = lenfix;
- state->lenbits = 9;
- state->distcode = distfix;
- state->distbits = 5;
-}
-
-#ifdef MAKEFIXED
-#include
-
-/*
- Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
- defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
- those tables to stdout, which would be piped to inffixed.h. A small program
- can simply call makefixed to do this:
-
- void makefixed(void);
-
- int main(void)
- {
- makefixed();
- return 0;
- }
-
- Then that can be linked with zlib built with MAKEFIXED defined and run:
-
- a.out > inffixed.h
- */
-void makefixed(void)
-{
- unsigned low, size;
- struct inflate_state state;
-
- fixedtables(&state);
- puts(" /* inffixed.h -- table for decoding fixed codes");
- puts(" * Generated automatically by makefixed().");
- puts(" */");
- puts("");
- puts(" /* WARNING: this file should *not* be used by applications.");
- puts(" It is part of the implementation of this library and is");
- puts(" subject to change. Applications should only use zlib.h.");
- puts(" */");
- puts("");
- size = 1U << 9;
- printf(" static const code lenfix[%u] = {", size);
- low = 0;
- for (;;) {
- if ((low % 7) == 0) printf("\n ");
- printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
- state.lencode[low].bits, state.lencode[low].val);
- if (++low == size) break;
- putchar(',');
- }
- puts("\n };");
- size = 1U << 5;
- printf("\n static const code distfix[%u] = {", size);
- low = 0;
- for (;;) {
- if ((low % 6) == 0) printf("\n ");
- printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
- state.distcode[low].val);
- if (++low == size) break;
- putchar(',');
- }
- puts("\n };");
-}
-#endif /* MAKEFIXED */
-
/*
Update the window with the last wsize (normally 32K) bytes written before
returning. If window does not exist yet, create it. This is only called
@@ -666,12 +550,12 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
if (
#endif
((BITS(8) << 8) + (hold >> 8)) % 31) {
- strm->msg = (char *)"incorrect header check";
+ strm->msg = (z_const char *)"incorrect header check";
state->mode = BAD;
break;
}
if (BITS(4) != Z_DEFLATED) {
- strm->msg = (char *)"unknown compression method";
+ strm->msg = (z_const char *)"unknown compression method";
state->mode = BAD;
break;
}
@@ -680,7 +564,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
if (state->wbits == 0)
state->wbits = len;
if (len > 15 || len > state->wbits) {
- strm->msg = (char *)"invalid window size";
+ strm->msg = (z_const char *)"invalid window size";
state->mode = BAD;
break;
}
@@ -696,12 +580,12 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
NEEDBITS(16);
state->flags = (int)(hold);
if ((state->flags & 0xff) != Z_DEFLATED) {
- strm->msg = (char *)"unknown compression method";
+ strm->msg = (z_const char *)"unknown compression method";
state->mode = BAD;
break;
}
if (state->flags & 0xe000) {
- strm->msg = (char *)"unknown header flags set";
+ strm->msg = (z_const char *)"unknown header flags set";
state->mode = BAD;
break;
}
@@ -817,7 +701,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
if (state->flags & 0x0200) {
NEEDBITS(16);
if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
- strm->msg = (char *)"header crc mismatch";
+ strm->msg = (z_const char *)"header crc mismatch";
state->mode = BAD;
break;
}
@@ -864,7 +748,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
state->mode = STORED;
break;
case 1: /* fixed block */
- fixedtables(state);
+ inflate_fixed(state);
Tracev((stderr, "inflate: fixed codes block%s\n",
state->last ? " (last)" : ""));
state->mode = LEN_; /* decode codes */
@@ -878,8 +762,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
state->last ? " (last)" : ""));
state->mode = TABLE;
break;
- case 3:
- strm->msg = (char *)"invalid block type";
+ default:
+ strm->msg = (z_const char *)"invalid block type";
state->mode = BAD;
}
DROPBITS(2);
@@ -888,7 +772,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
BYTEBITS(); /* go to byte boundary */
NEEDBITS(32);
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
- strm->msg = (char *)"invalid stored block lengths";
+ strm->msg = (z_const char *)"invalid stored block lengths";
state->mode = BAD;
break;
}
@@ -929,7 +813,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
DROPBITS(4);
#ifndef PKZIP_BUG_WORKAROUND
if (state->nlen > 286 || state->ndist > 30) {
- strm->msg = (char *)"too many length or distance symbols";
+ strm->msg = (z_const char *)
+ "too many length or distance symbols";
state->mode = BAD;
break;
}
@@ -947,12 +832,12 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
while (state->have < 19)
state->lens[order[state->have++]] = 0;
state->next = state->codes;
- state->lencode = (const code FAR *)(state->next);
+ state->lencode = state->distcode = (const code FAR *)(state->next);
state->lenbits = 7;
ret = inflate_table(CODES, state->lens, 19, &(state->next),
&(state->lenbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid code lengths set";
+ strm->msg = (z_const char *)"invalid code lengths set";
state->mode = BAD;
break;
}
@@ -976,7 +861,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
NEEDBITS(here.bits + 2);
DROPBITS(here.bits);
if (state->have == 0) {
- strm->msg = (char *)"invalid bit length repeat";
+ strm->msg = (z_const char *)
+ "invalid bit length repeat";
state->mode = BAD;
break;
}
@@ -999,7 +885,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
DROPBITS(7);
}
if (state->have + copy > state->nlen + state->ndist) {
- strm->msg = (char *)"invalid bit length repeat";
+ strm->msg = (z_const char *)
+ "invalid bit length repeat";
state->mode = BAD;
break;
}
@@ -1013,7 +900,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
/* check for end-of-block code (better have one) */
if (state->lens[256] == 0) {
- strm->msg = (char *)"invalid code -- missing end-of-block";
+ strm->msg = (z_const char *)
+ "invalid code -- missing end-of-block";
state->mode = BAD;
break;
}
@@ -1027,7 +915,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
&(state->lenbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid literal/lengths set";
+ strm->msg = (z_const char *)"invalid literal/lengths set";
state->mode = BAD;
break;
}
@@ -1036,7 +924,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
&(state->next), &(state->distbits), state->work);
if (ret) {
- strm->msg = (char *)"invalid distances set";
+ strm->msg = (z_const char *)"invalid distances set";
state->mode = BAD;
break;
}
@@ -1090,7 +978,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
break;
}
if (here.op & 64) {
- strm->msg = (char *)"invalid literal/length code";
+ strm->msg = (z_const char *)"invalid literal/length code";
state->mode = BAD;
break;
}
@@ -1128,7 +1016,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
DROPBITS(here.bits);
state->back += here.bits;
if (here.op & 64) {
- strm->msg = (char *)"invalid distance code";
+ strm->msg = (z_const char *)"invalid distance code";
state->mode = BAD;
break;
}
@@ -1145,7 +1033,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
}
#ifdef INFLATE_STRICT
if (state->offset > state->dmax) {
- strm->msg = (char *)"invalid distance too far back";
+ strm->msg = (z_const char *)"invalid distance too far back";
state->mode = BAD;
break;
}
@@ -1160,7 +1048,8 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
copy = state->offset - copy;
if (copy > state->whave) {
if (state->sane) {
- strm->msg = (char *)"invalid distance too far back";
+ strm->msg = (z_const char *)
+ "invalid distance too far back";
state->mode = BAD;
break;
}
@@ -1219,7 +1108,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
state->flags ? hold :
#endif
ZSWAP32(hold)) != state->check) {
- strm->msg = (char *)"incorrect data check";
+ strm->msg = (z_const char *)"incorrect data check";
state->mode = BAD;
break;
}
@@ -1233,7 +1122,7 @@ int ZEXPORT inflate(z_streamp strm, int flush) {
if (state->wrap && state->flags) {
NEEDBITS(32);
if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
- strm->msg = (char *)"incorrect length check";
+ strm->msg = (z_const char *)"incorrect length check";
state->mode = BAD;
break;
}
@@ -1464,7 +1353,6 @@ int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
struct inflate_state FAR *state;
struct inflate_state FAR *copy;
unsigned char FAR *window;
- unsigned wsize;
/* check input */
if (inflateStateCheck(source) || dest == Z_NULL)
@@ -1475,6 +1363,7 @@ int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
copy = (struct inflate_state FAR *)
ZALLOC(source, 1, sizeof(struct inflate_state));
if (copy == Z_NULL) return Z_MEM_ERROR;
+ zmemzero(copy, sizeof(struct inflate_state));
window = Z_NULL;
if (state->window != Z_NULL) {
window = (unsigned char FAR *)
@@ -1486,8 +1375,8 @@ int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
}
/* copy state */
- zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
- zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
+ zmemcpy(dest, source, sizeof(z_stream));
+ zmemcpy(copy, state, sizeof(struct inflate_state));
copy->strm = dest;
if (state->lencode >= state->codes &&
state->lencode <= state->codes + ENOUGH - 1) {
@@ -1495,10 +1384,8 @@ int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
copy->distcode = copy->codes + (state->distcode - state->codes);
}
copy->next = copy->codes + (state->next - state->codes);
- if (window != Z_NULL) {
- wsize = 1U << state->wbits;
- zmemcpy(window, state->window, wsize);
- }
+ if (window != Z_NULL)
+ zmemcpy(window, state->window, state->whave);
copy->window = window;
dest->state = (struct internal_state FAR *)copy;
return Z_OK;
diff --git a/src/java.base/share/native/libzip/zlib/inflate.h b/src/java.base/share/native/libzip/zlib/inflate.h
index 2cc56dd7fd4d..7828fb5db38e 100644
--- a/src/java.base/share/native/libzip/zlib/inflate.h
+++ b/src/java.base/share/native/libzip/zlib/inflate.h
@@ -124,7 +124,7 @@ struct inflate_state {
unsigned char FAR *window; /* allocated sliding window, if needed */
/* bit accumulator */
unsigned long hold; /* input bit accumulator */
- unsigned bits; /* number of bits in "in" */
+ unsigned bits; /* number of bits in hold */
/* for string and stored block copying */
unsigned length; /* literal or length of data to copy */
unsigned offset; /* distance back to copy string from */
diff --git a/src/java.base/share/native/libzip/zlib/inftrees.c b/src/java.base/share/native/libzip/zlib/inftrees.c
index c4913bc43595..5f5d6b4baef2 100644
--- a/src/java.base/share/native/libzip/zlib/inftrees.c
+++ b/src/java.base/share/native/libzip/zlib/inftrees.c
@@ -23,17 +23,31 @@
*/
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2024 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
+#ifdef MAKEFIXED
+# ifndef BUILDFIXED
+# define BUILDFIXED
+# endif
+#endif
+#ifdef BUILDFIXED
+# define Z_ONCE
+#endif
+
#include "zutil.h"
#include "inftrees.h"
+#include "inflate.h"
+
+#ifndef NULL
+# define NULL 0
+#endif
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.3.1 Copyright 1995-2024 Mark Adler ";
+ " inflate 1.3.2 Copyright 1995-2026 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
@@ -71,9 +85,9 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
unsigned mask; /* mask for low root bits */
code here; /* table entry for duplication */
code FAR *next; /* next available space in table */
- const unsigned short FAR *base; /* base value table to use */
- const unsigned short FAR *extra; /* extra bits table to use */
- unsigned match; /* use base and extra for symbol >= match */
+ const unsigned short FAR *base = NULL; /* base value table to use */
+ const unsigned short FAR *extra = NULL; /* extra bits table to use */
+ unsigned match = 0; /* use base and extra for symbol >= match */
unsigned short count[MAXBITS+1]; /* number of codes of each length */
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
@@ -81,7 +95,7 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
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, 203, 77};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75};
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,
@@ -199,7 +213,6 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
/* set up for code type */
switch (type) {
case CODES:
- base = extra = work; /* dummy value--not used */
match = 20;
break;
case LENS:
@@ -207,10 +220,9 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
extra = lext;
match = 257;
break;
- default: /* DISTS */
+ case DISTS:
base = dbase;
extra = dext;
- match = 0;
}
/* initialize state for loop */
@@ -321,3 +333,116 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
*bits = root;
return 0;
}
+
+#ifdef BUILDFIXED
+/*
+ If this is compiled with BUILDFIXED defined, and if inflate will be used in
+ multiple threads, and if atomics are not available, then inflate() must be
+ called with a fixed block (e.g. 0x03 0x00) to initialize the tables and must
+ return before any other threads are allowed to call inflate.
+ */
+
+static code *lenfix, *distfix;
+static code fixed[544];
+
+/* State for z_once(). */
+local z_once_t built = Z_ONCE_INIT;
+
+local void buildtables(void) {
+ unsigned sym, bits;
+ static code *next;
+ unsigned short lens[288], work[288];
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) lens[sym++] = 8;
+ while (sym < 256) lens[sym++] = 9;
+ while (sym < 280) lens[sym++] = 7;
+ while (sym < 288) lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, lens, 288, &(next), &(bits), work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, lens, 32, &(next), &(bits), work);
+}
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications if atomics are not available, as it will
+ not be thread-safe.
+ */
+void inflate_fixed(struct inflate_state FAR *state) {
+#ifdef BUILDFIXED
+ z_once(&built, buildtables);
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+#ifdef MAKEFIXED
+#include
+
+/*
+ Write out the inffixed.h that will be #include'd above. Defining MAKEFIXED
+ also defines BUILDFIXED, so the tables are built on the fly. main() writes
+ those tables to stdout, which would directed to inffixed.h. Compile this
+ along with zutil.c:
+
+ cc -DMAKEFIXED -o fix inftrees.c zutil.c
+ ./fix > inffixed.h
+ */
+int main(void) {
+ unsigned low, size;
+ struct inflate_state state;
+
+ inflate_fixed(&state);
+ puts("/* inffixed.h -- table for decoding fixed codes");
+ puts(" * Generated automatically by makefixed().");
+ puts(" */");
+ puts("");
+ puts("/* WARNING: this file should *not* be used by applications.");
+ puts(" It is part of the implementation of this library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ size = 1U << 9;
+ printf("static const code lenfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 7) == 0) printf("\n ");
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+ state.lencode[low].bits, state.lencode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n};");
+ size = 1U << 5;
+ printf("\nstatic const code distfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 6) == 0) printf("\n ");
+ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
+ state.distcode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n};");
+ return 0;
+}
+#endif /* MAKEFIXED */
diff --git a/src/java.base/share/native/libzip/zlib/inftrees.h b/src/java.base/share/native/libzip/zlib/inftrees.h
index 3e2e889301d0..b9b4fc2fb2bc 100644
--- a/src/java.base/share/native/libzip/zlib/inftrees.h
+++ b/src/java.base/share/native/libzip/zlib/inftrees.h
@@ -23,7 +23,7 @@
*/
/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995-2005, 2010 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -84,3 +84,5 @@ typedef enum {
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
unsigned codes, code FAR * FAR *table,
unsigned FAR *bits, unsigned short FAR *work);
+struct inflate_state;
+void ZLIB_INTERNAL inflate_fixed(struct inflate_state FAR *state);
diff --git a/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java b/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java
index 3296c5f2fad0..dfde58f0122d 100644
--- a/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java
+++ b/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java
@@ -1,4 +1,4 @@
-Changes from zlib 1.3.1
+Changes in JDK's in-tree zlib compared to upstream zlib 1.3.2
(1) renamed adler32.c -> zadler32.c, crc32c -> zcrc32.c
diff --git a/src/java.base/share/native/libzip/zlib/trees.c b/src/java.base/share/native/libzip/zlib/trees.c
index bbfa9deee5b4..cc7b136bcf68 100644
--- a/src/java.base/share/native/libzip/zlib/trees.c
+++ b/src/java.base/share/native/libzip/zlib/trees.c
@@ -23,7 +23,7 @@
*/
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2024 Jean-loup Gailly
+ * Copyright (C) 1995-2026 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -136,7 +136,7 @@ local int base_dist[D_CODES];
#else
# include "trees.h"
-#endif /* GEN_TREES_H */
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
struct static_tree_desc_s {
const ct_data *static_tree; /* static tree or NULL */
@@ -176,7 +176,7 @@ local TCONST static_tree_desc static_bl_desc =
* IN assertion: 1 <= len <= 15
*/
local unsigned bi_reverse(unsigned code, int len) {
- register unsigned res = 0;
+ unsigned res = 0;
do {
res |= code & 1;
code >>= 1, res <<= 1;
@@ -208,10 +208,11 @@ local void bi_windup(deflate_state *s) {
} else if (s->bi_valid > 0) {
put_byte(s, (Byte)s->bi_buf);
}
+ s->bi_used = ((s->bi_valid - 1) & 7) + 1;
s->bi_buf = 0;
s->bi_valid = 0;
#ifdef ZLIB_DEBUG
- s->bits_sent = (s->bits_sent + 7) & ~7;
+ s->bits_sent = (s->bits_sent + 7) & ~(ulg)7;
#endif
}
@@ -490,6 +491,7 @@ void ZLIB_INTERNAL _tr_init(deflate_state *s) {
s->bi_buf = 0;
s->bi_valid = 0;
+ s->bi_used = 0;
#ifdef ZLIB_DEBUG
s->compressed_len = 0L;
s->bits_sent = 0L;
@@ -748,7 +750,7 @@ local void scan_tree(deflate_state *s, ct_data *tree, int max_code) {
if (++count < max_count && curlen == nextlen) {
continue;
} else if (count < min_count) {
- s->bl_tree[curlen].Freq += count;
+ s->bl_tree[curlen].Freq += (ush)count;
} else if (curlen != 0) {
if (curlen != prevlen) s->bl_tree[curlen].Freq++;
s->bl_tree[REP_3_6].Freq++;
@@ -841,7 +843,7 @@ local int build_bl_tree(deflate_state *s) {
}
/* Update opt_len to include the bit length tree and counts */
s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4;
- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+ Tracev((stderr, "\ndyn trees: dyn %lu, stat %lu",
s->opt_len, s->static_len));
return max_blindex;
@@ -867,13 +869,13 @@ local void send_all_trees(deflate_state *s, int lcodes, int dcodes,
Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
}
- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+ Tracev((stderr, "\nbl tree: sent %lu", s->bits_sent));
send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */
- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+ Tracev((stderr, "\nlit tree: sent %lu", s->bits_sent));
send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */
- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+ Tracev((stderr, "\ndist tree: sent %lu", s->bits_sent));
}
/* ===========================================================================
@@ -956,7 +958,7 @@ local void compress_block(deflate_state *s, const ct_data *ltree,
extra = extra_dbits[code];
if (extra != 0) {
dist -= (unsigned)base_dist[code];
- send_bits(s, dist, extra); /* send the extra distance bits */
+ send_bits(s, (int)dist, extra); /* send the extra bits */
}
} /* literal or match pair ? */
@@ -1030,11 +1032,11 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
/* Construct the literal and distance trees */
build_tree(s, (tree_desc *)(&(s->l_desc)));
- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+ Tracev((stderr, "\nlit data: dyn %lu, stat %lu", s->opt_len,
s->static_len));
build_tree(s, (tree_desc *)(&(s->d_desc)));
- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+ Tracev((stderr, "\ndist data: dyn %lu, stat %lu", s->opt_len,
s->static_len));
/* At this point, opt_len and static_len are the total bit lengths of
* the compressed block data, excluding the tree representations.
@@ -1107,7 +1109,7 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
#endif
}
Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3,
- s->compressed_len - 7*last));
+ s->compressed_len - 7*(ulg)last));
}
/* ===========================================================================
diff --git a/src/java.base/share/native/libzip/zlib/uncompr.c b/src/java.base/share/native/libzip/zlib/uncompr.c
index 219c1d264d5f..25da59461c37 100644
--- a/src/java.base/share/native/libzip/zlib/uncompr.c
+++ b/src/java.base/share/native/libzip/zlib/uncompr.c
@@ -23,7 +23,7 @@
*/
/* uncompr.c -- decompress a memory buffer
- * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -47,24 +47,24 @@
memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
Z_DATA_ERROR if the input data was corrupted, including if the input data is
an incomplete zlib stream.
+
+ The _z versions of the functions take size_t length arguments.
*/
-int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
- uLong *sourceLen) {
+int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
+ z_size_t *sourceLen) {
z_stream stream;
int err;
const uInt max = (uInt)-1;
- uLong len, left;
- Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
+ z_size_t len, left;
+
+ if (sourceLen == NULL || (*sourceLen > 0 && source == NULL) ||
+ destLen == NULL || (*destLen > 0 && dest == NULL))
+ return Z_STREAM_ERROR;
len = *sourceLen;
- if (*destLen) {
- left = *destLen;
- *destLen = 0;
- }
- else {
- left = 1;
- dest = buf;
- }
+ left = *destLen;
+ if (left == 0 && dest == Z_NULL)
+ dest = (Bytef *)&stream.reserved; /* next_out cannot be NULL */
stream.next_in = (z_const Bytef *)source;
stream.avail_in = 0;
@@ -80,30 +80,46 @@ int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
do {
if (stream.avail_out == 0) {
- stream.avail_out = left > (uLong)max ? max : (uInt)left;
+ stream.avail_out = left > (z_size_t)max ? max : (uInt)left;
left -= stream.avail_out;
}
if (stream.avail_in == 0) {
- stream.avail_in = len > (uLong)max ? max : (uInt)len;
+ stream.avail_in = len > (z_size_t)max ? max : (uInt)len;
len -= stream.avail_in;
}
err = inflate(&stream, Z_NO_FLUSH);
} while (err == Z_OK);
- *sourceLen -= len + stream.avail_in;
- if (dest != buf)
- *destLen = stream.total_out;
- else if (stream.total_out && err == Z_BUF_ERROR)
- left = 1;
+ /* Set len and left to the unused input data and unused output space. Set
+ *sourceLen to the amount of input consumed. Set *destLen to the amount
+ of data produced. */
+ len += stream.avail_in;
+ left += stream.avail_out;
+ *sourceLen -= len;
+ *destLen -= left;
inflateEnd(&stream);
return err == Z_STREAM_END ? Z_OK :
err == Z_NEED_DICT ? Z_DATA_ERROR :
- err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
+ err == Z_BUF_ERROR && len == 0 ? Z_DATA_ERROR :
err;
}
-
+int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong *sourceLen) {
+ int ret;
+ z_size_t got = *destLen, used = *sourceLen;
+ ret = uncompress2_z(dest, &got, source, &used);
+ *sourceLen = (uLong)used;
+ *destLen = (uLong)got;
+ return ret;
+}
+int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
+ z_size_t sourceLen) {
+ z_size_t used = sourceLen;
+ return uncompress2_z(dest, destLen, source, &used);
+}
int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
uLong sourceLen) {
- return uncompress2(dest, destLen, source, &sourceLen);
+ uLong used = sourceLen;
+ return uncompress2(dest, destLen, source, &used);
}
diff --git a/src/java.base/share/native/libzip/zlib/zconf.h b/src/java.base/share/native/libzip/zlib/zconf.h
index 46204222f5d6..d4589739a0ae 100644
--- a/src/java.base/share/native/libzip/zlib/zconf.h
+++ b/src/java.base/share/native/libzip/zlib/zconf.h
@@ -23,7 +23,7 @@
*/
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -57,7 +57,10 @@
# ifndef Z_SOLO
# define compress z_compress
# define compress2 z_compress2
+# define compress_z z_compress_z
+# define compress2_z z_compress2_z
# define compressBound z_compressBound
+# define compressBound_z z_compressBound_z
# endif
# define crc32 z_crc32
# define crc32_combine z_crc32_combine
@@ -68,6 +71,7 @@
# define crc32_z z_crc32_z
# define deflate z_deflate
# define deflateBound z_deflateBound
+# define deflateBound_z z_deflateBound_z
# define deflateCopy z_deflateCopy
# define deflateEnd z_deflateEnd
# define deflateGetDictionary z_deflateGetDictionary
@@ -83,6 +87,7 @@
# define deflateSetDictionary z_deflateSetDictionary
# define deflateSetHeader z_deflateSetHeader
# define deflateTune z_deflateTune
+# define deflateUsed z_deflateUsed
# define deflate_copyright z_deflate_copyright
# define get_crc_table z_get_crc_table
# ifndef Z_SOLO
@@ -152,9 +157,12 @@
# define inflate_copyright z_inflate_copyright
# define inflate_fast z_inflate_fast
# define inflate_table z_inflate_table
+# define inflate_fixed z_inflate_fixed
# ifndef Z_SOLO
# define uncompress z_uncompress
# define uncompress2 z_uncompress2
+# define uncompress_z z_uncompress_z
+# define uncompress2_z z_uncompress2_z
# endif
# define zError z_zError
# ifndef Z_SOLO
@@ -258,10 +266,12 @@
# endif
#endif
-#if defined(ZLIB_CONST) && !defined(z_const)
-# define z_const const
-#else
-# define z_const
+#ifndef z_const
+# ifdef ZLIB_CONST
+# define z_const const
+# else
+# define z_const
+# endif
#endif
#ifdef Z_SOLO
@@ -457,11 +467,11 @@ typedef uLong FAR uLongf;
typedef unsigned long z_crc_t;
#endif
-#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+#if HAVE_UNISTD_H-0 /* may be set to #if 1 by ./configure */
# define Z_HAVE_UNISTD_H
#endif
-#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+#if HAVE_STDARG_H-0 /* may be set to #if 1 by ./configure */
# define Z_HAVE_STDARG_H
#endif
@@ -494,12 +504,8 @@ typedef uLong FAR uLongf;
#endif
#ifndef Z_HAVE_UNISTD_H
-# ifdef __WATCOMC__
-# define Z_HAVE_UNISTD_H
-# endif
-#endif
-#ifndef Z_HAVE_UNISTD_H
-# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
+# if defined(__WATCOMC__) || defined(__GO32__) || \
+ (defined(_LARGEFILE64_SOURCE) && !defined(_WIN32))
# define Z_HAVE_UNISTD_H
# endif
#endif
@@ -534,17 +540,19 @@ typedef uLong FAR uLongf;
#endif
#ifndef z_off_t
-# define z_off_t long
+# define z_off_t long long
#endif
#if !defined(_WIN32) && defined(Z_LARGE64)
# define z_off64_t off64_t
+#elif defined(__MINGW32__)
+# define z_off64_t long long
+#elif defined(_WIN32) && !defined(__GNUC__)
+# define z_off64_t __int64
+#elif defined(__GO32__)
+# define z_off64_t offset_t
#else
-# if defined(_WIN32) && !defined(__GNUC__)
-# define z_off64_t __int64
-# else
-# define z_off64_t z_off_t
-# endif
+# define z_off64_t z_off_t
#endif
/* MVS linker does not support external names larger than 8 bytes */
diff --git a/src/java.base/share/native/libzip/zlib/zcrc32.c b/src/java.base/share/native/libzip/zlib/zcrc32.c
index 3f918f76b7c4..133cbe158aa4 100644
--- a/src/java.base/share/native/libzip/zlib/zcrc32.c
+++ b/src/java.base/share/native/libzip/zlib/zcrc32.c
@@ -23,7 +23,7 @@
*/
/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2022 Mark Adler
+ * Copyright (C) 1995-2026 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* This interleaved implementation of a CRC makes use of pipelined multiple
@@ -48,11 +48,18 @@
# include
# ifndef DYNAMIC_CRC_TABLE
# define DYNAMIC_CRC_TABLE
-# endif /* !DYNAMIC_CRC_TABLE */
-#endif /* MAKECRCH */
+# endif
+#endif
+#ifdef DYNAMIC_CRC_TABLE
+# define Z_ONCE
+#endif
#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */
+#ifdef HAVE_S390X_VX
+# include "contrib/crc32vx/crc32_vx_hooks.h"
+#endif
+
/*
A CRC of a message is computed on N braids of words in the message, where
each word consists of W bytes (4 or 8). If N is 3, for example, then three
@@ -123,7 +130,8 @@
#endif
/* If available, use the ARM processor CRC32 instruction. */
-#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
+#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && \
+ defined(W) && W == 8
# define ARMCRC32
#endif
@@ -176,10 +184,10 @@ local z_word_t byte_swap(z_word_t word) {
Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
reflected. For speed, this requires that a not be zero.
*/
-local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
- z_crc_t m, p;
+local uLong multmodp(uLong a, uLong b) {
+ uLong m, p;
- m = (z_crc_t)1 << 31;
+ m = (uLong)1 << 31;
p = 0;
for (;;) {
if (a & m) {
@@ -195,12 +203,12 @@ local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
/*
Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
- initialized.
+ initialized. n must not be negative.
*/
-local z_crc_t x2nmodp(z_off64_t n, unsigned k) {
- z_crc_t p;
+local uLong x2nmodp(z_off64_t n, unsigned k) {
+ uLong p;
- p = (z_crc_t)1 << 31; /* x^0 == 1 */
+ p = (uLong)1 << 31; /* x^0 == 1 */
while (n) {
if (n & 1)
p = multmodp(x2n_table[k & 31], p);
@@ -228,83 +236,8 @@ local z_crc_t FAR crc_table[256];
local void write_table64(FILE *, const z_word_t FAR *, int);
#endif /* MAKECRCH */
-/*
- Define a once() function depending on the availability of atomics. If this is
- compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in
- multiple threads, and if atomics are not available, then get_crc_table() must
- be called to initialize the tables and must return before any threads are
- allowed to compute or combine CRCs.
- */
-
-/* Definition of once functionality. */
-typedef struct once_s once_t;
-
-/* Check for the availability of atomics. */
-#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
- !defined(__STDC_NO_ATOMICS__)
-
-#include
-
-/* Structure for once(), which must be initialized with ONCE_INIT. */
-struct once_s {
- atomic_flag begun;
- atomic_int done;
-};
-#define ONCE_INIT {ATOMIC_FLAG_INIT, 0}
-
-/*
- Run the provided init() function exactly once, even if multiple threads
- invoke once() at the same time. The state must be a once_t initialized with
- ONCE_INIT.
- */
-local void once(once_t *state, void (*init)(void)) {
- if (!atomic_load(&state->done)) {
- if (atomic_flag_test_and_set(&state->begun))
- while (!atomic_load(&state->done))
- ;
- else {
- init();
- atomic_store(&state->done, 1);
- }
- }
-}
-
-#else /* no atomics */
-
-/* Structure for once(), which must be initialized with ONCE_INIT. */
-struct once_s {
- volatile int begun;
- volatile int done;
-};
-#define ONCE_INIT {0, 0}
-
-/* Test and set. Alas, not atomic, but tries to minimize the period of
- vulnerability. */
-local int test_and_set(int volatile *flag) {
- int was;
-
- was = *flag;
- *flag = 1;
- return was;
-}
-
-/* Run the provided init() function once. This is not thread-safe. */
-local void once(once_t *state, void (*init)(void)) {
- if (!state->done) {
- if (test_and_set(&state->begun))
- while (!state->done)
- ;
- else {
- init();
- state->done = 1;
- }
- }
-}
-
-#endif
-
/* State for once(). */
-local once_t made = ONCE_INIT;
+local z_once_t made = Z_ONCE_INIT;
/*
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
@@ -350,7 +283,7 @@ local void make_crc_table(void) {
p = (z_crc_t)1 << 30; /* x^1 */
x2n_table[0] = p;
for (n = 1; n < 32; n++)
- x2n_table[n] = p = multmodp(p, p);
+ x2n_table[n] = p = (z_crc_t)multmodp(p, p);
#ifdef W
/* initialize the braiding tables -- needs x2n_table[] */
@@ -553,11 +486,11 @@ local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
int k;
z_crc_t i, p, q;
for (k = 0; k < w; k++) {
- p = x2nmodp((n * w + 3 - k) << 3, 0);
+ p = (z_crc_t)x2nmodp((n * w + 3 - k) << 3, 0);
ltl[k][0] = 0;
big[w - 1 - k][0] = 0;
for (i = 1; i < 256; i++) {
- ltl[k][i] = q = multmodp(i << 24, p);
+ ltl[k][i] = q = (z_crc_t)multmodp(i << 24, p);
big[w - 1 - k][i] = byte_swap(q);
}
}
@@ -572,7 +505,7 @@ local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
*/
const z_crc_t FAR * ZEXPORT get_crc_table(void) {
#ifdef DYNAMIC_CRC_TABLE
- once(&made, make_crc_table);
+ z_once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
return (const z_crc_t FAR *)crc_table;
}
@@ -596,9 +529,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table(void) {
#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */
#define Z_BATCH_MIN 800 /* fewest words in a final batch */
-unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
- z_size_t len) {
- z_crc_t val;
+uLong ZEXPORT crc32_z(uLong crc, const unsigned char FAR *buf, z_size_t len) {
+ uLong val;
z_word_t crc1, crc2;
const z_word_t *word;
z_word_t val0, val1, val2;
@@ -609,7 +541,7 @@ unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
if (buf == Z_NULL) return 0;
#ifdef DYNAMIC_CRC_TABLE
- once(&made, make_crc_table);
+ z_once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
@@ -664,7 +596,7 @@ unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
}
word += 3 * last;
num -= 3 * last;
- val = x2nmodp(last, 6);
+ val = x2nmodp((int)last, 6);
crc = multmodp(val, crc) ^ crc1;
crc = multmodp(val, crc) ^ crc2;
}
@@ -715,13 +647,12 @@ local z_word_t crc_word_big(z_word_t data) {
#endif
/* ========================================================================= */
-unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
- z_size_t len) {
+uLong ZEXPORT crc32_z(uLong crc, const unsigned char FAR *buf, z_size_t len) {
/* Return initial CRC, if requested. */
if (buf == Z_NULL) return 0;
#ifdef DYNAMIC_CRC_TABLE
- once(&made, make_crc_table);
+ z_once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
@@ -1036,38 +967,41 @@ unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
#endif
/* ========================================================================= */
-unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
- uInt len) {
+uLong ZEXPORT crc32(uLong crc, const unsigned char FAR *buf, uInt len) {
+ #ifdef HAVE_S390X_VX
+ return crc32_z_hook(crc, buf, len);
+ #endif
return crc32_z(crc, buf, len);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
+uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
+ if (len2 < 0)
+ return 0;
#ifdef DYNAMIC_CRC_TABLE
- once(&made, make_crc_table);
+ z_once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
- return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
+ return x2nmodp(len2, 3);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
- return crc32_combine64(crc1, crc2, (z_off64_t)len2);
+uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
+ return crc32_combine_gen64((z_off64_t)len2);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
-#ifdef DYNAMIC_CRC_TABLE
- once(&made, make_crc_table);
-#endif /* DYNAMIC_CRC_TABLE */
- return x2nmodp(len2, 3);
+uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
+ if (op == 0)
+ return 0;
+ return multmodp(op, crc1 & 0xffffffff) ^ (crc2 & 0xffffffff);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
- return crc32_combine_gen64((z_off64_t)len2);
+uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
+ return crc32_combine_op(crc1, crc2, crc32_combine_gen64(len2));
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
- return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
+uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
+ return crc32_combine64(crc1, crc2, (z_off64_t)len2);
}
diff --git a/src/java.base/share/native/libzip/zlib/zlib.h b/src/java.base/share/native/libzip/zlib/zlib.h
index 07496b5f981f..90230f4f23fb 100644
--- a/src/java.base/share/native/libzip/zlib/zlib.h
+++ b/src/java.base/share/native/libzip/zlib/zlib.h
@@ -23,9 +23,9 @@
*/
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.3.1, January 22nd, 2024
+ version 1.3.2, February 17th, 2026
- Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2026 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
@@ -48,24 +48,28 @@
The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ Comments) 1950 to 1952 at https://datatracker.ietf.org/doc/html/rfc1950
(zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
*/
#ifndef ZLIB_H
#define ZLIB_H
-#include "zconf.h"
+#ifdef ZLIB_BUILD
+# include
+#else
+# include "zconf.h"
+#endif
#ifdef __cplusplus
extern "C" {
#endif
-#define ZLIB_VERSION "1.3.1"
-#define ZLIB_VERNUM 0x1310
+#define ZLIB_VERSION "1.3.2"
+#define ZLIB_VERNUM 0x1320
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 3
-#define ZLIB_VER_REVISION 1
+#define ZLIB_VER_REVISION 2
#define ZLIB_VER_SUBREVISION 0
/*
@@ -465,7 +469,7 @@ ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush);
The Z_BLOCK option assists in appending to or combining deflate streams.
To assist in this, on return inflate() always sets strm->data_type to the
- number of unused bits in the last byte taken from strm->next_in, plus 64 if
+ number of unused bits in the input taken from strm->next_in, plus 64 if
inflate() is currently decoding the last block in the deflate stream, plus
128 if inflate() returned immediately after decoding an end-of-block code or
decoding the complete header up to just before the first byte of the deflate
@@ -611,18 +615,21 @@ ZEXTERN int ZEXPORT deflateInit2(z_streamp strm,
The strategy parameter is used to tune the compression algorithm. Use the
value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
- string match), or Z_RLE to limit match distances to one (run-length
- encoding). Filtered data consists mostly of small values with a somewhat
- random distribution. In this case, the compression algorithm is tuned to
- compress them better. The effect of Z_FILTERED is to force more Huffman
- coding and less string matching; it is somewhat intermediate between
- Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as
- fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The
- strategy parameter only affects the compression ratio but not the
- correctness of the compressed output even if it is not set appropriately.
- Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
- decoder for special applications.
+ filter (or predictor), Z_RLE to limit match distances to one (run-length
+ encoding), or Z_HUFFMAN_ONLY to force Huffman encoding only (no string
+ matching). Filtered data consists mostly of small values with a somewhat
+ random distribution, as produced by the PNG filters. In this case, the
+ compression algorithm is tuned to compress them better. The effect of
+ Z_FILTERED is to force more Huffman coding and less string matching than the
+ default; it is intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.
+ Z_RLE is almost as fast as Z_HUFFMAN_ONLY, but should give better
+ compression for PNG image data than Huffman only. The degree of string
+ matching from most to none is: Z_DEFAULT_STRATEGY, Z_FILTERED, Z_RLE, then
+ Z_HUFFMAN_ONLY. The strategy parameter affects the compression ratio but
+ never the correctness of the compressed output, even if it is not set
+ optimally for the given data. Z_FIXED uses the default string matching, but
+ prevents the use of dynamic Huffman codes, allowing for a simpler decoder
+ for special applications.
deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
@@ -782,8 +789,8 @@ ZEXTERN int ZEXPORT deflateTune(z_streamp strm,
returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
*/
-ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,
- uLong sourceLen);
+ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen);
+ZEXTERN z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen);
/*
deflateBound() returns an upper bound on the compressed size after
deflation of sourceLen bytes. It must be called after deflateInit() or
@@ -795,6 +802,9 @@ ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,
to return Z_STREAM_END. Note that it is possible for the compressed size to
be larger than the value returned by deflateBound() if flush options other
than Z_FINISH or Z_NO_FLUSH are used.
+
+ delfateBound_z() is the same, but takes and returns a size_t length. Note
+ that a long is 32 bits on Windows.
*/
ZEXTERN int ZEXPORT deflatePending(z_streamp strm,
@@ -809,6 +819,21 @@ ZEXTERN int ZEXPORT deflatePending(z_streamp strm,
or bits are Z_NULL, then those values are not set.
deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent. If an int is 16 bits and memLevel is 9, then
+ it is possible for the number of pending bytes to not fit in an unsigned. In
+ that case Z_BUF_ERROR is returned and *pending is set to the maximum value
+ of an unsigned.
+ */
+
+ZEXTERN int ZEXPORT deflateUsed(z_streamp strm,
+ int *bits);
+/*
+ deflateUsed() returns in *bits the most recent number of deflate bits used
+ in the last byte when flushing to a byte boundary. The result is in 1..8, or
+ 0 if there has not yet been a flush. This helps determine the location of
+ the last bit of a deflate stream.
+
+ deflateUsed returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
@@ -1011,13 +1036,15 @@ ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
int bits,
int value);
/*
- This function inserts bits in the inflate input stream. The intent is
- that this function is used to start inflating at a bit position in the
- middle of a byte. The provided bits will be used before any bytes are used
- from next_in. This function should only be used with raw inflate, and
- should be used before the first inflate() call after inflateInit2() or
- inflateReset(). bits must be less than or equal to 16, and that many of the
- least significant bits of value will be inserted in the input.
+ This function inserts bits in the inflate input stream. The intent is to
+ use inflatePrime() to start inflating at a bit position in the middle of a
+ byte. The provided bits will be used before any bytes are used from
+ next_in. This function should be used with raw inflate, before the first
+ inflate() call, after inflateInit2() or inflateReset(). It can also be used
+ after an inflate() return indicates the end of a deflate block or header
+ when using Z_BLOCK. bits must be less than or equal to 16, and that many of
+ the least significant bits of value will be inserted in the input. The
+ other bits in value can be non-zero, and will be ignored.
If bits is negative, then the input stream bit buffer is emptied. Then
inflatePrime() can be called again to put bits in the buffer. This is used
@@ -1025,7 +1052,15 @@ ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
to feeding inflate codes.
inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
+ stream state was inconsistent, or if bits is out of range. If inflate was
+ in the middle of processing a header, trailer, or stored block lengths, then
+ it is possible for there to be only eight bits available in the bit buffer.
+ In that case, bits > 8 is considered out of range. However, when used as
+ outlined above, there will always be 16 bits available in the buffer for
+ insertion. As noted in its documentation above, inflate records the number
+ of bits in the bit buffer on return in data_type. 32 minus that is the
+ number of bits available for insertion. inflatePrime does not update
+ data_type with the new number of bits in buffer.
*/
ZEXTERN long ZEXPORT inflateMark(z_streamp strm);
@@ -1071,20 +1106,22 @@ ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm,
The text, time, xflags, and os fields are filled in with the gzip header
contents. hcrc is set to true if there is a header CRC. (The header CRC
- was valid if done is set to one.) If extra is not Z_NULL, then extra_max
- contains the maximum number of bytes to write to extra. Once done is true,
- extra_len contains the actual extra field length, and extra contains the
- extra field, or that field truncated if extra_max is less than extra_len.
- If name is not Z_NULL, then up to name_max characters are written there,
- terminated with a zero unless the length is greater than name_max. If
- comment is not Z_NULL, then up to comm_max characters are written there,
- terminated with a zero unless the length is greater than comm_max. When any
- of extra, name, or comment are not Z_NULL and the respective field is not
- present in the header, then that field is set to Z_NULL to signal its
- absence. This allows the use of deflateSetHeader() with the returned
- structure to duplicate the header. However if those fields are set to
- allocated memory, then the application will need to save those pointers
- elsewhere so that they can be eventually freed.
+ was valid if done is set to one.) The extra, name, and comment pointers
+ much each be either Z_NULL or point to space to store that information from
+ the header. If extra is not Z_NULL, then extra_max contains the maximum
+ number of bytes that can be written to extra. Once done is true, extra_len
+ contains the actual extra field length, and extra contains the extra field,
+ or that field truncated if extra_max is less than extra_len. If name is not
+ Z_NULL, then up to name_max characters, including the terminating zero, are
+ written there. If comment is not Z_NULL, then up to comm_max characters,
+ including the terminating zero, are written there. The application can tell
+ that the name or comment did not fit in the provided space by the absence of
+ a terminating zero. If any of extra, name, or comment are not present in
+ the header, then that field's pointer is set to Z_NULL. This allows the use
+ of deflateSetHeader() with the returned structure to duplicate the header.
+ Note that if those fields initially pointed to allocated memory, then the
+ application will need to save them elsewhere so that they can be eventually
+ freed.
If inflateGetHeader is not used, then the header information is simply
discarded. The header is always checked for validity, including the header
@@ -1232,13 +1269,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags(void);
21: FASTEST -- deflate algorithm with only one, lowest compression level
22,23: 0 (reserved)
- The sprintf variant used by gzprintf (zero is best):
+ The sprintf variant used by gzprintf (all zeros is best):
24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() is not secure!
26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+ 27: 0 = gzprintf() present, 1 = not -- 1 means gzprintf() returns an error
Remainder:
- 27-31: 0 (reserved)
+ 28-31: 0 (reserved)
*/
#ifndef Z_SOLO
@@ -1250,11 +1288,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags(void);
stream-oriented functions. To simplify the interface, some default options
are assumed (compression level and memory usage, standard memory allocation
functions). The source code of these utility functions can be modified if
- you need special options.
+ you need special options. The _z versions of the functions use the size_t
+ type for lengths. Note that a long is 32 bits on Windows.
*/
-ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,
+ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen);
+ZEXTERN int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen,
+ const Bytef *source, z_size_t sourceLen);
/*
Compresses the source buffer into the destination buffer. sourceLen is
the byte length of the source buffer. Upon entry, destLen is the total size
@@ -1268,9 +1309,12 @@ ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,
buffer.
*/
-ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,
+ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen,
int level);
+ZEXTERN int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen,
+ const Bytef *source, z_size_t sourceLen,
+ int level);
/*
Compresses the source buffer into the destination buffer. The level
parameter has the same meaning as in deflateInit. sourceLen is the byte
@@ -1285,21 +1329,24 @@ ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,
*/
ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen);
+ZEXTERN z_size_t ZEXPORT compressBound_z(z_size_t sourceLen);
/*
compressBound() returns an upper bound on the compressed size after
compress() or compress2() on sourceLen bytes. It would be used before a
compress() or compress2() call to allocate the destination buffer.
*/
-ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,
+ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen);
+ZEXTERN int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen,
+ const Bytef *source, z_size_t sourceLen);
/*
Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total size
+ the byte length of the source buffer. On entry, *destLen is the total size
of the destination buffer, which must be large enough to hold the entire
uncompressed data. (The size of the uncompressed data must have been saved
previously by the compressor and transmitted to the decompressor by some
- mechanism outside the scope of this compression library.) Upon exit, destLen
+ mechanism outside the scope of this compression library.) On exit, *destLen
is the actual size of the uncompressed data.
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
@@ -1309,8 +1356,10 @@ ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,
buffer with the uncompressed data up to that point.
*/
-ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen,
+ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong *sourceLen);
+ZEXTERN int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen,
+ const Bytef *source, z_size_t *sourceLen);
/*
Same as uncompress, except that sourceLen is a pointer, where the
length of the source is *sourceLen. On return, *sourceLen is the number of
@@ -1338,13 +1387,17 @@ ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode);
'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
+ appending with no compression and not using the gzip format. 'T' cannot be
+ used to force transparent reading. Transparent reading is automatically
+ performed if there is no gzip header at the start. Transparent reading can
+ be disabled with the 'G' option, which will instead return an error if there
+ is no gzip header. 'N' will open the file in non-blocking mode.
+
+ '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
reading and writing to the same gzip file is not supported. The addition of
- "x" when writing will create the file exclusively, which fails if the file
- already exists. On systems that support it, the addition of "e" when
+ 'x' when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of 'e' when
reading or writing will set the flag to close the file on an execve() call.
These functions, as well as gzip, will read and decode a sequence of gzip
@@ -1363,14 +1416,22 @@ ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode);
insufficient memory to allocate the gzFile state, or if an invalid mode was
specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
errno can be checked to determine if the reason gzopen failed was that the
- file could not be opened.
+ file could not be opened. Note that if 'N' is in mode for non-blocking, the
+ open() itself can fail in order to not block. In that case gzopen() will
+ return NULL and errno will be EAGAIN or ENONBLOCK. The call to gzopen() can
+ then be re-tried. If the application would like to block on opening the
+ file, then it can use open() without O_NONBLOCK, and then gzdopen() with the
+ resulting file descriptor and 'N' in the mode, which will set it to non-
+ blocking.
*/
ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode);
/*
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.
+ been previously opened with fopen). The mode parameter is as in gzopen. An
+ 'e' in mode will set fd's flag to close the file on an execve() call. An 'N'
+ in mode will set fd's non-blocking flag.
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
@@ -1440,10 +1501,16 @@ ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len);
stream. Alternatively, gzerror can be used before gzclose to detect this
case.
+ gzread can be used to read a gzip file on a non-blocking device. If the
+ input stalls and there is no uncompressed data to return, then gzread() will
+ return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be
+ called again.
+
gzread returns the number of uncompressed bytes actually read, less than
len for end of file, or -1 for error. If len is too large to fit in an int,
then nothing is read, -1 is returned, and the error state is set to
- Z_STREAM_ERROR.
+ Z_STREAM_ERROR. If some data was read before an error, then that data is
+ returned until exhausted, after which the next call will signal the error.
*/
ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
@@ -1467,15 +1534,20 @@ ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
multiple of size, then the final partial item is nevertheless read into buf
and the end-of-file flag is set. The length of the partial item read is not
provided, but could be inferred from the result of gztell(). This behavior
- is the same as the behavior of fread() implementations in common libraries,
- but it prevents the direct use of gzfread() to read a concurrently written
- file, resetting and retrying on end-of-file, when size is not 1.
+ is the same as that of fread() implementations in common libraries. This
+ could result in data loss if used with size != 1 when reading a concurrently
+ written file or a non-blocking file. In that case, use size == 1 or gzread()
+ instead.
*/
ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len);
/*
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.
+ returns the number of uncompressed bytes written, or 0 in case of error or
+ if len is 0. If the write destination is non-blocking, then gzwrite() may
+ return a number of bytes written that is not 0 and less than len.
+
+ If len does not fit in an int, then 0 is returned and nothing is written.
*/
ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
@@ -1490,9 +1562,18 @@ ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
if there was an error. If the multiplication of size and nitems overflows,
i.e. the product does not fit in a z_size_t, then nothing is written, zero
is returned, and the error state is set to Z_STREAM_ERROR.
+
+ If writing a concurrently read file or a non-blocking file with size != 1,
+ a partial item could be written, with no way of knowing how much of it was
+ not written, resulting in data loss. In that case, use size == 1 or
+ gzwrite() instead.
*/
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);
+#else
+ZEXTERN int ZEXPORTVA gzprintf();
+#endif
/*
Convert, format, compress, and write the arguments (...) to file under
control of the string format, as in fprintf. gzprintf returns the number of
@@ -1500,11 +1581,19 @@ ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);
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(),
- because the secure snprintf() or vsnprintf() functions were not available.
- This can be determined using zlibCompileFlags().
+ return an error (0) with nothing written.
+
+ In that last 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(), because the secure snprintf() and
+ vsnprintf() functions were not available. That would only be the case for
+ a non-ANSI C compiler. zlib may have been built without gzprintf() because
+ secure functions were not available and having gzprintf() be insecure was
+ not an option, in which case, gzprintf() returns Z_STREAM_ERROR. All of
+ these possibilities can be determined using zlibCompileFlags().
+
+ If a Z_BUF_ERROR is returned, then nothing was written due to a stall on
+ the non-blocking write destination.
*/
ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);
@@ -1513,6 +1602,11 @@ ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);
the terminating null character.
gzputs returns the number of characters written, or -1 in case of error.
+ The number of characters written may be less than the length of the string
+ if the write destination is non-blocking.
+
+ If the length of the string does not fit in an int, then -1 is returned
+ and nothing is written.
*/
ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);
@@ -1525,8 +1619,13 @@ ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);
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
- buf are indeterminate.
+ for end-of-file or in case of error. If some data was read before an error,
+ then that data is returned until exhausted, after which the next call will
+ return NULL to signal the error.
+
+ gzgets can be used on a file being concurrently written, and on a non-
+ blocking device, both as for gzread(). However lines may be broken in the
+ middle, leaving it up to the application to reassemble them as needed.
*/
ZEXTERN int ZEXPORT gzputc(gzFile file, int c);
@@ -1537,11 +1636,19 @@ ZEXTERN int ZEXPORT gzputc(gzFile file, int c);
ZEXTERN int ZEXPORT gzgetc(gzFile file);
/*
- 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
- points to has been clobbered or not.
+ Read and decompress one byte from file. gzgetc returns this byte or -1 in
+ case of end of file or error. If some data was read before an error, then
+ that data is returned until exhausted, after which the next call will return
+ -1 to signal the 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 points to has been clobbered or not.
+
+ gzgetc can be used to read a gzip file on a non-blocking device. If the
+ input stalls and there is no uncompressed data to return, then gzgetc() will
+ return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be
+ called again.
*/
ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);
@@ -1554,6 +1661,11 @@ ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);
output buffer size of pushed characters is allowed. (See gzbuffer above.)
The pushed character will be discarded if the stream is repositioned with
gzseek() or gzrewind().
+
+ gzungetc(-1, file) will force any pending seek to execute. Then gztell()
+ will report the position, even if the requested seek reached end of file.
+ This can be used to determine the number of uncompressed bytes in a gzip
+ file without having to read it into a buffer.
*/
ZEXTERN int ZEXPORT gzflush(gzFile file, int flush);
@@ -1583,7 +1695,8 @@ ZEXTERN z_off_t ZEXPORT gzseek(gzFile file,
If the file is opened for reading, this function is emulated but can be
extremely slow. If the file is opened for writing, only forward seeks are
supported; gzseek then compresses a sequence of zeroes up to the new
- starting position.
+ starting position. For reading or writing, any actual seeking is deferred
+ until the next read or write operation, or close operation when writing.
gzseek returns the resulting offset location as measured in bytes from
the beginning of the uncompressed stream, or -1 in case of error, in
@@ -1591,7 +1704,7 @@ ZEXTERN z_off_t ZEXPORT gzseek(gzFile file,
would be before the current position.
*/
-ZEXTERN int ZEXPORT gzrewind(gzFile file);
+ZEXTERN int ZEXPORT gzrewind(gzFile file);
/*
Rewind file. This function is supported only for reading.
@@ -1599,7 +1712,7 @@ ZEXTERN int ZEXPORT gzrewind(gzFile file);
*/
/*
-ZEXTERN z_off_t ZEXPORT gztell(gzFile file);
+ZEXTERN z_off_t ZEXPORT gztell(gzFile file);
Return the starting position for the next gzread or gzwrite on file.
This position represents a number of bytes in the uncompressed data stream,
@@ -1644,8 +1757,11 @@ ZEXTERN int ZEXPORT gzdirect(gzFile file);
If gzdirect() is used immediately after gzopen() or gzdopen() it will
cause buffers to be allocated to allow reading the file to determine if it
- is a gzip file. Therefore if gzbuffer() is used, it should be called before
- gzdirect().
+ is a gzip file. Therefore if gzbuffer() is used, it should be called before
+ gzdirect(). If the input is being written concurrently or the device is non-
+ blocking, then gzdirect() may give a different answer once four bytes of
+ input have been accumulated, which is what is needed to confirm or deny a
+ gzip header. Before this, gzdirect() will return true (1).
When writing, gzdirect() returns true (1) if transparent writing was
requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
@@ -1655,7 +1771,7 @@ ZEXTERN int ZEXPORT gzdirect(gzFile file);
gzip file reading and decompression, which may not be desired.)
*/
-ZEXTERN int ZEXPORT gzclose(gzFile file);
+ZEXTERN int ZEXPORT gzclose(gzFile file);
/*
Flush all pending output for file, if necessary, close file and
deallocate the (de)compression state. Note that once file is closed, you
@@ -1683,9 +1799,10 @@ ZEXTERN int ZEXPORT gzclose_w(gzFile file);
ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum);
/*
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.
+ If errnum is not NULL, *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
@@ -1736,7 +1853,8 @@ ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len);
ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf,
z_size_t len);
/*
- Same as adler32(), but with a size_t length.
+ Same as adler32(), but with a size_t length. Note that a long is 32 bits
+ on Windows.
*/
/*
@@ -1772,7 +1890,8 @@ ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len);
ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf,
z_size_t len);
/*
- Same as crc32(), but with a size_t length.
+ Same as crc32(), but with a size_t length. Note that a long is 32 bits on
+ Windows.
*/
/*
@@ -1782,14 +1901,14 @@ ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
- len2. len2 must be non-negative.
+ len2. len2 must be non-negative, otherwise zero is returned.
*/
/*
ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2);
Return the operator corresponding to length len2, to be used with
- crc32_combine_op(). len2 must be non-negative.
+ crc32_combine_op(). len2 must be non-negative, otherwise zero is returned.
*/
ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);
@@ -1912,9 +2031,9 @@ ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */
ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int);
ZEXTERN z_off_t ZEXPORT gztell64(gzFile);
ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile);
- ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
- ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
- ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t);
# endif
#else
ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *);
diff --git a/src/java.base/share/native/libzip/zlib/zutil.c b/src/java.base/share/native/libzip/zlib/zutil.c
index 92dda78497ba..c57c162ffde8 100644
--- a/src/java.base/share/native/libzip/zlib/zutil.c
+++ b/src/java.base/share/native/libzip/zlib/zutil.c
@@ -23,7 +23,7 @@
*/
/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2017 Jean-loup Gailly
+ * Copyright (C) 1995-2026 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -110,28 +110,36 @@ uLong ZEXPORT zlibCompileFlags(void) {
flags += 1L << 21;
#endif
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
-# ifdef NO_vsnprintf
- flags += 1L << 25;
-# ifdef HAS_vsprintf_void
- flags += 1L << 26;
-# endif
-# else
-# ifdef HAS_vsnprintf_void
- flags += 1L << 26;
-# endif
-# endif
+# ifdef NO_vsnprintf
+# ifdef ZLIB_INSECURE
+ flags += 1L << 25;
+# else
+ flags += 1L << 27;
+# endif
+# ifdef HAS_vsprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_vsnprintf_void
+ flags += 1L << 26;
+# endif
+# endif
#else
flags += 1L << 24;
-# ifdef NO_snprintf
- flags += 1L << 25;
-# ifdef HAS_sprintf_void
- flags += 1L << 26;
-# endif
-# else
-# ifdef HAS_snprintf_void
- flags += 1L << 26;
-# endif
-# endif
+# ifdef NO_snprintf
+# ifdef ZLIB_INSECURE
+ flags += 1L << 25;
+# else
+ flags += 1L << 27;
+# endif
+# ifdef HAS_sprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_snprintf_void
+ flags += 1L << 26;
+# endif
+# endif
#endif
return flags;
}
@@ -166,28 +174,34 @@ const char * ZEXPORT zError(int err) {
#ifndef HAVE_MEMCPY
-void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
- if (len == 0) return;
- do {
- *dest++ = *source++; /* ??? to be unrolled */
- } while (--len != 0);
+void ZLIB_INTERNAL zmemcpy(void FAR *dst, const void FAR *src, z_size_t n) {
+ uchf *p = dst;
+ const uchf *q = src;
+ while (n) {
+ *p++ = *q++;
+ n--;
+ }
}
-int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
- uInt j;
-
- for (j = 0; j < len; j++) {
- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+int ZLIB_INTERNAL zmemcmp(const void FAR *s1, const void FAR *s2, z_size_t n) {
+ const uchf *p = s1, *q = s2;
+ while (n) {
+ if (*p++ != *q++)
+ return (int)p[-1] - (int)q[-1];
+ n--;
}
return 0;
}
-void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
+void ZLIB_INTERNAL zmemzero(void FAR *b, z_size_t len) {
+ uchf *p = b;
if (len == 0) return;
- do {
- *dest++ = 0; /* ??? to be unrolled */
- } while (--len != 0);
+ while (len) {
+ *p++ = 0;
+ len--;
+ }
}
+
#endif
#ifndef Z_SOLO
diff --git a/src/java.base/share/native/libzip/zlib/zutil.h b/src/java.base/share/native/libzip/zlib/zutil.h
index 2b7e697bef9b..b337065875d6 100644
--- a/src/java.base/share/native/libzip/zlib/zutil.h
+++ b/src/java.base/share/native/libzip/zlib/zutil.h
@@ -23,7 +23,7 @@
*/
/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -60,6 +60,10 @@
define "local" for the non-static meaning of "static", for readability
(compile with -Dlocal if your debugger can't find static symbols) */
+extern const char deflate_copyright[];
+extern const char inflate_copyright[];
+extern const char inflate9_copyright[];
+
typedef unsigned char uch;
typedef uch FAR uchf;
typedef unsigned short ush;
@@ -72,6 +76,8 @@ typedef unsigned long ulg;
# define Z_U8 unsigned long
# elif (ULLONG_MAX == 0xffffffffffffffff)
# define Z_U8 unsigned long long
+# elif (ULONG_LONG_MAX == 0xffffffffffffffff)
+# define Z_U8 unsigned long long
# elif (UINT_MAX == 0xffffffffffffffff)
# define Z_U8 unsigned
# endif
@@ -87,7 +93,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* To be used only when the state is known to be valid */
/* common constants */
-
+#if MAX_WBITS < 9 || MAX_WBITS > 15
+# error MAX_WBITS must be in 9..15
+#endif
#ifndef DEF_WBITS
# define DEF_WBITS MAX_WBITS
#endif
@@ -165,7 +173,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define OS_CODE 7
#endif
-#ifdef __acorn
+#if defined(__acorn) || defined(__riscos)
# define OS_CODE 13
#endif
@@ -192,11 +200,10 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#endif
/* provide prototypes for these when building zlib without LFS */
-#if !defined(_WIN32) && \
- (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
- ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
- ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
- ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
+#ifndef Z_LARGE64
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t);
#endif
/* common defaults */
@@ -235,9 +242,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define zmemzero(dest, len) memset(dest, 0, len)
# endif
#else
- void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
- int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
- void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
+ void ZLIB_INTERNAL zmemcpy(void FAR *, const void FAR *, z_size_t);
+ int ZLIB_INTERNAL zmemcmp(const void FAR *, const void FAR *, z_size_t);
+ void ZLIB_INTERNAL zmemzero(void FAR *, z_size_t);
#endif
/* Diagnostic functions */
@@ -275,4 +282,74 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
(((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+#ifdef Z_ONCE
+/*
+ Create a local z_once() function depending on the availability of atomics.
+ */
+
+/* Check for the availability of atomics. */
+#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
+ !defined(__STDC_NO_ATOMICS__)
+
+#include
+typedef struct {
+ atomic_flag begun;
+ atomic_int done;
+} z_once_t;
+#define Z_ONCE_INIT {ATOMIC_FLAG_INIT, 0}
+
+/*
+ Run the provided init() function exactly once, even if multiple threads
+ invoke once() at the same time. The state must be a once_t initialized with
+ Z_ONCE_INIT.
+ */
+local void z_once(z_once_t *state, void (*init)(void)) {
+ if (!atomic_load(&state->done)) {
+ if (atomic_flag_test_and_set(&state->begun))
+ while (!atomic_load(&state->done))
+ ;
+ else {
+ init();
+ atomic_store(&state->done, 1);
+ }
+ }
+}
+
+#else /* no atomics */
+
+#warning zlib not thread-safe
+
+typedef struct z_once_s {
+ volatile int begun;
+ volatile int done;
+} z_once_t;
+#define Z_ONCE_INIT {0, 0}
+
+/* Test and set. Alas, not atomic, but tries to limit the period of
+ vulnerability. */
+local int test_and_set(int volatile *flag) {
+ int was;
+
+ was = *flag;
+ *flag = 1;
+ return was;
+}
+
+/* Run the provided init() function once. This is not thread-safe. */
+local void z_once(z_once_t *state, void (*init)(void)) {
+ if (!state->done) {
+ if (test_and_set(&state->begun))
+ while (!state->done)
+ ;
+ else {
+ init();
+ state->done = 1;
+ }
+ }
+}
+
+#endif /* ?atomics */
+
+#endif /* Z_ONCE */
+
#endif /* ZUTIL_H */
diff --git a/src/java.desktop/share/legal/freetype.md b/src/java.desktop/share/legal/freetype.md
index 5df525e2f674..7259c27183f6 100644
--- a/src/java.desktop/share/legal/freetype.md
+++ b/src/java.desktop/share/legal/freetype.md
@@ -1,4 +1,4 @@
-## The FreeType Project: Freetype v2.13.3
+## The FreeType Project: Freetype v2.14.2
### FreeType Notice
@@ -21,25 +21,24 @@ which fits your needs best.
### FreeType License
```
-Copyright (C) 1996-2024 by David Turner, Robert Wilhelm, and Werner Lemberg.
-Copyright (C) 2007-2024 by Dereg Clegg and Michael Toftdal.
-Copyright (C) 1996-2024 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
-Copyright (C) 2022-2024 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
-Copyright (C) 2004-2024 by Masatake YAMATO and Redhat K.K.
-Copyright (C) 2007-2024 by Derek Clegg and Michael Toftdal.
-Copyright (C) 2003-2024 by Masatake YAMATO, Red Hat K.K.,
-Copyright (C) 1996-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
-Copyright (C) 2007-2024 by David Turner.
-Copyright (C) 2022-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
-Copyright (C) 2007-2024 by Rahul Bhalerao , .
-Copyright (C) 2008-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
-Copyright (C) 2013-2024 by Google, Inc.
-Copyright (C) 2019-2024 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
-Copyright (C) 2009-2024 by Oran Agra and Mickey Gabel.
-Copyright (C) 2018-2024 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
-Copyright (C) 2004-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
-
-
+Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2007-2025 by Dereg Clegg and Michael Toftdal.
+Copyright (C) 1996-2025 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
+Copyright (C) 2004-2025 by Masatake YAMATO and Redhat K.K.
+Copyright (C) 2007-2025 by Derek Clegg and Michael Toftdal.
+Copyright (C) 2003-2025 by Masatake YAMATO, Red Hat K.K.,
+Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
+Copyright (C) 2007-2025 by David Turner.
+Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
+Copyright (C) 2007-2025 by Rahul Bhalerao , .
+Copyright (C) 2025 by Behdad Esfahbod.
+Copyright (C) 2008-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
+Copyright (C) 2013-2025 by Google, Inc.
+Copyright (C) 2019-2025 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2009-2025 by Oran Agra and Mickey Gabel.
+Copyright (C) 2018-2025 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
+Copyright (C) 2004-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
The FreeType Project LICENSE
----------------------------
@@ -207,6 +206,7 @@ Legal Terms
https://www.freetype.org
+
```
### GPL v2
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h
index 0667493fec64..d66c5df9976f 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h
@@ -4,7 +4,7 @@
*
* ANSI-specific configuration file (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h
index f6ef2618dede..16eab9048fce 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h
@@ -4,7 +4,7 @@
*
* Build macros of the FreeType 2 library.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h
index d29a0a7cefbd..a0a1a410b681 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h
@@ -4,7 +4,7 @@
*
* User-selectable configuration macros (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -158,12 +158,12 @@ FT_BEGIN_HEADER
/**************************************************************************
*
- * If this macro is defined, try to use an inlined assembler version of the
- * @FT_MulFix function, which is a 'hotspot' when loading and hinting
- * glyphs, and which should be executed as fast as possible.
+ * If this macro is defined, try to use an inlined 64-bit or assembler
+ * version of the @FT_MulFix function, which is a 'hotspot' when loading
+ * and hinting glyphs, and which should be executed as fast as possible.
*
- * Note that if your compiler or CPU is not supported, this will default to
- * the standard and portable implementation found in `ftcalc.c`.
+ * If your compiler is not C99-compliant or CPU assembly is not supported,
+ * you can disable this option.
*/
#define FT_CONFIG_OPTION_INLINE_MULFIX
@@ -293,6 +293,31 @@ FT_BEGIN_HEADER
/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */
+ /**************************************************************************
+ *
+ * HarfBuzz dynamic support.
+ *
+ * Define this macro if you want the HarfBuzz library to be loaded at
+ * runtime instead of being linked to FreeType.
+ *
+ * This option has no effect if `FT_CONFIG_OPTION_USE_HARFBUZZ` is not
+ * defined.
+ *
+ * When this option is enabled, FreeType will try to load the HarfBuzz
+ * library at runtime, using `dlopen` or `LoadLibrary`, depending on the
+ * platform. On Microsoft platforms, the library name looked up is
+ * `libharfbuzz-0.dll`. On Apple platforms, the library name looked up
+ * is `libharfbuzz.0.dylib`. On all other platforms, the library name
+ * looked up is `libharfbuzz.so.0`. This name can be overridden by
+ * defining the macro `FT_LIBHARFBUZZ` at FreeType compilation time.
+ *
+ * If you use a build system like cmake or the `configure` script,
+ * options set by those programs have precedence, overwriting the value
+ * here with the configured one.
+ */
+/* #define FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+
/**************************************************************************
*
* Brotli support.
@@ -679,7 +704,7 @@ FT_BEGIN_HEADER
* defined.
*
* [1]
- * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+ * https://learn.microsoft.com/typography/cleartype/truetypecleartype
*/
#define TT_CONFIG_OPTION_SUBPIXEL_HINTING
@@ -697,7 +722,7 @@ FT_BEGIN_HEADER
* flags array which can be used to disambiguate, but old fonts will not
* have them.
*
- * https://www.microsoft.com/typography/otspec/glyf.htm
+ * https://learn.microsoft.com/typography/opentype/spec/glyf
* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html
*/
#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -734,7 +759,13 @@ FT_BEGIN_HEADER
/**************************************************************************
*
* Define `TT_CONFIG_OPTION_BDF` if you want to include support for an
- * embedded 'BDF~' table within SFNT-based bitmap formats.
+ * embedded 'BDF~' table within an SFNT-based `.otb` font file. This table
+ * is an extension used by X11 to preserve BDF properties after conversion
+ * to SFNT containers. See
+ *
+ * https://fontforge.org/docs/techref/non-standard.html#non-standard-bdf
+ *
+ * for more details.
*/
/* #define TT_CONFIG_OPTION_BDF */
@@ -760,10 +791,10 @@ FT_BEGIN_HEADER
/**************************************************************************
*
* Option `TT_CONFIG_OPTION_GPOS_KERNING` enables a basic GPOS kerning
- * implementation (for TrueType fonts only). With this defined, FreeType
- * is able to get kerning pair data from the GPOS 'kern' feature as well as
- * legacy 'kern' tables; without this defined, FreeType will only be able
- * to use legacy 'kern' tables.
+ * implementation (for TrueType and OpenType fonts only). With this
+ * defined, FreeType is able to get kerning pair data from the GPOS 'kern'
+ * feature as well as legacy 'kern' tables; without this defined, FreeType
+ * will only be able to use legacy 'kern' tables.
*
* Note that FreeType does not support more advanced GPOS layout features;
* even the 'kern' feature implemented here doesn't handle more
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h
index e17aa7b89d57..f846b4456c11 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h
@@ -5,7 +5,7 @@
* ANSI-specific library and header configuration file (specification
* only).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h
index c27505ffc4b6..a0b892ece4bc 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h
@@ -4,7 +4,7 @@
*
* FreeType integer types definitions.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -17,6 +17,8 @@
#ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_
#define FREETYPE_CONFIG_INTEGER_TYPES_H_
+FT_BEGIN_HEADER
+
/* There are systems (like the Texas Instruments 'C54x) where a `char` */
/* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */
/* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */
@@ -242,9 +244,34 @@
#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
#ifdef FT_INT64
+
typedef FT_INT64 FT_Int64;
typedef FT_UINT64 FT_UInt64;
-#endif
+# define FT_INT64_ZERO 0
+
+#else /* !FT_INT64 */
+
+ /* we need to emulate 64-bit data types if none are available */
+
+ typedef struct FT_Int64_
+ {
+ FT_UInt32 lo;
+ FT_UInt32 hi;
+
+ } FT_Int64;
+
+ typedef struct FT_UInt64_
+ {
+ FT_UInt32 lo;
+ FT_UInt32 hi;
+
+ } FT_UInt64;
+
+# define FT_INT64_ZERO { 0, 0 }
+
+#endif /* !FT_INT64 */
+
+FT_END_HEADER
#endif /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h
index 07b6f915bd83..bd350851d560 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h
@@ -4,7 +4,7 @@
*
* Mac/OS X support configuration header.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -24,6 +24,7 @@
* This is the only necessary change, so it is defined here instead
* providing a new configuration file.
*/
+#ifdef FT_MACINTOSH
#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
/* No Carbon frameworks for 64bit 10.4.x. */
/* `AvailabilityMacros.h` is available since Mac OS X 10.2, */
@@ -36,6 +37,7 @@
( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
#undef FT_MACINTOSH
#endif
+#endif /* __APPLE__ ... */
#elif defined( __SC__ ) || defined( __MRC__ )
/* Classic MacOS compilers */
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h b/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h
index f56581a6ee79..9f28b3947374 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h
@@ -4,7 +4,7 @@
*
* Define a set of compiler macros used in public FreeType headers.
*
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -62,8 +62,8 @@ FT_BEGIN_HEADER
* because it is needed by `FT_EXPORT`.
*/
- /* Visual C, mingw */
-#if defined( _WIN32 )
+ /* Visual C, MinGW, Cygwin */
+#if defined( _WIN32 ) || defined( __CYGWIN__ )
#if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT )
#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllexport )
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h b/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h
index 58fc33dfe60a..e8a1b1e2f3ea 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h
@@ -4,7 +4,7 @@
*
* FreeType high-level API and common types (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -811,7 +811,7 @@ FT_BEGIN_HEADER
* FT_ENCODING_MS_SYMBOL ::
* Microsoft Symbol encoding, used to encode mathematical symbols and
* wingdings. For more information, see
- * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts',
+ * 'https://learn.microsoft.com/typography/opentype/spec/recom#non-standard-symbol-fonts',
* 'http://www.kostis.net/charsets/symbol.htm', and
* 'http://www.kostis.net/charsets/wingding.htm'.
*
@@ -1068,12 +1068,12 @@ FT_BEGIN_HEADER
* the face in the font file (starting with value~0). They are set
* to~0 if there is only one face in the font file.
*
- * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation
- * fonts only, holding the named instance index for the current face
- * index (starting with value~1; value~0 indicates font access without
- * a named instance). For non-variation fonts, bits 16-30 are ignored.
- * If we have the third named instance of face~4, say, `face_index` is
- * set to 0x00030004.
+ * [Since 2.6.1] Bits 16-30 are relevant to TrueType GX and OpenType
+ * Font Variations only, holding the named instance index for the
+ * current face index (starting with value~1; value~0 indicates font
+ * access without a named instance). For non-variation fonts, bits
+ * 16-30 are ignored. If we have the third named instance of face~4,
+ * say, `face_index` is set to 0x00030004.
*
* Bit 31 is always zero (that is, `face_index` is always a positive
* value).
@@ -1092,10 +1092,10 @@ FT_BEGIN_HEADER
* the face; see @FT_STYLE_FLAG_XXX for the details.
*
* [Since 2.6.1] Bits 16-30 hold the number of named instances
- * available for the current face if we have a GX or OpenType variation
- * (sub)font. Bit 31 is always zero (that is, `style_flags` is always
- * a positive value). Note that a variation font has always at least
- * one named instance, namely the default instance.
+ * available for the current face if we have a TrueType GX or OpenType
+ * Font Variation. Bit 31 is always zero (that is, `style_flags` is
+ * always a positive value). Note that a variation font has always at
+ * least one named instance, namely the default instance.
*
* num_glyphs ::
* The number of glyphs in the face. If the face is scalable and has
@@ -1159,7 +1159,7 @@ FT_BEGIN_HEADER
* Note that the bounding box might be off by (at least) one pixel for
* hinted fonts. See @FT_Size_Metrics for further discussion.
*
- * Note that the bounding box does not vary in OpenType variation fonts
+ * Note that the bounding box does not vary in OpenType Font Variations
* and should only be used in relation to the default instance.
*
* units_per_EM ::
@@ -1218,7 +1218,7 @@ FT_BEGIN_HEADER
* Fields may be changed after a call to @FT_Attach_File or
* @FT_Attach_Stream.
*
- * For an OpenType variation font, the values of the following fields can
+ * For OpenType Font Variations, the values of the following fields can
* change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
* the font contains an 'MVAR' table: `ascender`, `descender`, `height`,
* `underline_position`, and `underline_thickness`.
@@ -1336,7 +1336,7 @@ FT_BEGIN_HEADER
* FT_FACE_FLAG_MULTIPLE_MASTERS ::
* The face contains multiple masters and is capable of interpolating
* between them. Supported formats are Adobe MM, TrueType GX, and
- * OpenType variation fonts.
+ * OpenType Font Variations.
*
* See section @multiple_masters for API details.
*
@@ -1609,7 +1609,7 @@ FT_BEGIN_HEADER
*
* @description:
* A macro that returns true whenever a face object is a named instance
- * of a GX or OpenType variation font.
+ * of a TrueType GX or OpenType Font Variations.
*
* [Since 2.9] Changing the design coordinates with
* @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does
@@ -2147,7 +2147,7 @@ FT_BEGIN_HEADER
* freed.
*
* [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of
- * OpenType variation fonts for a selected instance are internally
+ * OpenType Font Variations for a selected instance are internally
* handled as 26.6 fractional font units but returned as (rounded)
* integers, as expected. To get unrounded font units, don't use
* @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and
@@ -2640,14 +2640,14 @@ FT_BEGIN_HEADER
* the face in the font file (starting with value~0). Set it to~0 if
* there is only one face in the font file.
*
- * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation
- * fonts only, specifying the named instance index for the current face
- * index (starting with value~1; value~0 makes FreeType ignore named
- * instances). For non-variation fonts, bits 16-30 are ignored.
- * Assuming that you want to access the third named instance in face~4,
- * `face_index` should be set to 0x00030004. If you want to access
- * face~4 without variation handling, simply set `face_index` to
- * value~4.
+ * [Since 2.6.1] Bits 16-30 are relevant to TrueType GX and OpenType
+ * Font Variations only, specifying the named instance index for the
+ * current face index (starting with value~1; value~0 makes FreeType
+ * ignore named instances). For non-variation fonts, bits 16-30 are
+ * ignored. Assuming that you want to access the third named instance
+ * in face~4, `face_index` should be set to 0x00030004. If you want
+ * to access face~4 without variation handling, simply set
+ * `face_index` to value~4.
*
* `FT_Open_Face` and its siblings can be used to quickly check whether
* the font format of a given font resource is supported by FreeType.
@@ -2914,11 +2914,11 @@ FT_BEGIN_HEADER
* of the available glyphs at a given ppem value is available. FreeType
* silently uses outlines if there is no bitmap for a given glyph index.
*
- * For GX and OpenType variation fonts, a bitmap strike makes sense only
- * if the default instance is active (that is, no glyph variation takes
- * place); otherwise, FreeType simply ignores bitmap strikes. The same
- * is true for all named instances that are different from the default
- * instance.
+ * For TrueType GX and OpenType Font Variations, a bitmap strike makes
+ * sense only if the default instance is active (that is, no glyph
+ * variation takes place); otherwise, FreeType simply ignores bitmap
+ * strikes. The same is true for all named instances that are different
+ * from the default instance.
*
* Don't use this function if you are using the FreeType cache API.
*/
@@ -3078,7 +3078,7 @@ FT_BEGIN_HEADER
* is dependent entirely on how the size is defined in the source face.
* The font designer chooses the final size of each glyph relative to
* this size. For more information refer to
- * 'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'.
+ * 'https://freetype.org/freetype2/docs/glyphs/glyphs-2.html'.
*
* Contrary to @FT_Set_Char_Size, this function doesn't have special code
* to normalize zero-valued widths, heights, or resolutions, which are
@@ -3441,8 +3441,10 @@ FT_BEGIN_HEADER
* blending of the color glyph layers associated with the glyph index,
* using the same bitmap format as embedded color bitmap images. This
* is mainly for convenience and works only for glyphs in 'COLR' v0
- * tables (or glyphs in 'COLR' v1 tables that exclusively use v0
- * features). For full control of color layers use
+ * tables. **There is no rendering support for 'COLR' v1** (with the
+ * exception of v1 tables that exclusively use v0 features)! You need
+ * a graphics library like Skia or Cairo to interpret the graphics
+ * commands stored in v1 tables. For full control of color layers use
* @FT_Get_Color_Glyph_Layer and FreeType's color functions like
* @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering
* so that the client application can handle blending by itself.
@@ -3895,8 +3897,10 @@ FT_BEGIN_HEADER
*
* This process can cost performance. There is an approximation that
* does not need to know about the background color; see
- * https://bel.fi/alankila/lcd/ and
- * https://bel.fi/alankila/lcd/alpcor.html for details.
+ * https://web.archive.org/web/20211019204945/https://bel.fi/alankila/lcd/
+ * and
+ * https://web.archive.org/web/20210211002939/https://bel.fi/alankila/lcd/alpcor.html
+ * for details.
*
* **ATTENTION**: Linear blending is even more important when dealing
* with subpixel-rendered glyphs to prevent color-fringing! A
@@ -3993,13 +3997,13 @@ FT_BEGIN_HEADER
* out of the scope of this API function -- they can be implemented
* through format-specific interfaces.
*
- * Note that, for TrueType fonts only, this can extract data from both
- * the 'kern' table and the basic, pair-wise kerning feature from the
- * GPOS table (with `TT_CONFIG_OPTION_GPOS_KERNING` enabled), though
- * FreeType does not support the more advanced GPOS layout features; use
- * a library like HarfBuzz for those instead. If a font has both a
- * 'kern' table and kern features of a GPOS table, the 'kern' table will
- * be used.
+ * Note that, for TrueType and OpenType fonts only, this can extract data
+ * from both the 'kern' table and the basic, pair-wise kerning feature
+ * from the GPOS table (with `TT_CONFIG_OPTION_GPOS_KERNING` enabled),
+ * though FreeType does not support the more advanced GPOS layout
+ * features; use a library like HarfBuzz for those instead. If a font
+ * has both a 'kern' table and kern features of a GPOS table, the 'kern'
+ * table will be used.
*
* Also note for right-to-left scripts, the functionality may differ for
* fonts with GPOS tables vs. 'kern' tables. For GPOS, right-to-left
@@ -4314,14 +4318,13 @@ FT_BEGIN_HEADER
* property `no-stem-darkening` provided by the 'autofit', 'cff',
* 'type1', and 't1cid' modules; see @no-stem-darkening).
*
- * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding
- * to function @FT_Library_SetLcdFilterWeights).
- *
* * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID
* 'random' operator, corresponding to the `random-seed` property
* provided by the 'cff', 'type1', and 't1cid' modules; see
* @random-seed).
*
+ * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (no longer supported).
+ *
* Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the
* option and use the library or module default again.
*
@@ -4348,25 +4351,17 @@ FT_BEGIN_HEADER
* FT_Bool darken_stems = 1;
*
* FT_Parameter property2;
- * FT_LcdFiveTapFilter custom_weight =
- * { 0x11, 0x44, 0x56, 0x44, 0x11 };
- *
- * FT_Parameter property3;
* FT_Int32 random_seed = 314159265;
*
- * FT_Parameter properties[3] = { property1,
- * property2,
- * property3 };
+ * FT_Parameter properties[2] = { property1,
+ * property2 };
*
*
* property1.tag = FT_PARAM_TAG_STEM_DARKENING;
* property1.data = &darken_stems;
*
- * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
- * property2.data = custom_weight;
- *
- * property3.tag = FT_PARAM_TAG_RANDOM_SEED;
- * property3.data = &random_seed;
+ * property2.tag = FT_PARAM_TAG_RANDOM_SEED;
+ * property2.data = &random_seed;
*
* FT_Face_Properties( face, 3, properties );
* ```
@@ -4377,7 +4372,7 @@ FT_BEGIN_HEADER
* FT_Parameter property;
*
*
- * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
+ * property.tag = FT_PARAM_TAG_STEM_DARKENING;
* property.data = NULL;
*
* FT_Face_Properties( face, 1, &property );
@@ -4530,7 +4525,7 @@ FT_BEGIN_HEADER
* table description in the OpenType specification for the meaning of the
* various flags (which get synthesized for non-OpenType subglyphs).
*
- * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description
+ * https://learn.microsoft.com/typography/opentype/spec/glyf#composite-glyph-description
*
* @values:
* FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
@@ -4593,7 +4588,7 @@ FT_BEGIN_HEADER
* interpreted depending on the flags returned in `*p_flags`. See the
* OpenType specification for details.
*
- * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description
+ * https://learn.microsoft.com/typography/opentype/spec/glyf#composite-glyph-description
*
*/
FT_EXPORT( FT_Error )
@@ -4619,7 +4614,7 @@ FT_BEGIN_HEADER
* associated with a font.
*
* See
- * https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf
+ * https://adobe-type-tools.github.io/font-tech-notes/pdfs/AcrobatDC_FontPolicies.pdf
* for more details.
*
* @values:
@@ -5173,8 +5168,8 @@ FT_BEGIN_HEADER
*
*/
#define FREETYPE_MAJOR 2
-#define FREETYPE_MINOR 13
-#define FREETYPE_PATCH 3
+#define FREETYPE_MINOR 14
+#define FREETYPE_PATCH 2
/**************************************************************************
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h
index 85b8ba2554be..62a856ccbd71 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h
@@ -4,7 +4,7 @@
*
* Quick computation of advance widths (specification only).
*
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h
index 12bbfa63a628..348b4b3a268d 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h
@@ -4,7 +4,7 @@
*
* FreeType exact bbox computation (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h
index 6f63b0b1e781..ab142249217c 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h
@@ -4,7 +4,7 @@
*
* FreeType API for accessing BDF-specific strings (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -44,7 +44,8 @@ FT_BEGIN_HEADER
*
* @description:
* This section contains the declaration of functions specific to BDF and
- * PCF fonts.
+ * PCF fonts. They also work for SFNT bitmap fonts that contain a 'BDF~'
+ * table like X11's `.otb` fonts.
*
*/
@@ -151,7 +152,9 @@ FT_BEGIN_HEADER
* FreeType error code. 0~means success.
*
* @note:
- * This function only works with BDF faces, returning an error otherwise.
+ * This function only works with BDF faces and SFNT fonts that have a
+ * 'BDF~' table, returning an error otherwise. For the latter, a bitmap
+ * strike size must be selected first.
*/
FT_EXPORT( FT_Error )
FT_Get_BDF_Charset_ID( FT_Face face,
@@ -165,7 +168,7 @@ FT_BEGIN_HEADER
* FT_Get_BDF_Property
*
* @description:
- * Retrieve a BDF property from a BDF or PCF font file.
+ * Retrieve a BDF property from a BDF or PCF font.
*
* @input:
* face ::
@@ -196,6 +199,9 @@ FT_BEGIN_HEADER
*
* In case of error, `aproperty->type` is always set to
* @BDF_PROPERTY_TYPE_NONE.
+ *
+ * This also works with SFNT fonts that have a 'BDF~' table, after a
+ * bitmap strike size has been selected.
*/
FT_EXPORT( FT_Error )
FT_Get_BDF_Property( FT_Face face,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h
index df9d462652e7..a22d43adf14b 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h
@@ -4,7 +4,7 @@
*
* FreeType utility functions for bitmaps (specification).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h
index 96b2a90fc59f..7cda8ff3f39a 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h
@@ -4,7 +4,7 @@
*
* FreeType API for accessing CID font information (specification).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* Dereg Clegg and Michael Toftdal.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h
index 420720ddf225..129b1a23fb03 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h
@@ -4,7 +4,7 @@
*
* FreeType's glyph color management (specification).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -317,6 +317,15 @@ FT_BEGIN_HEADER
* @description:
* The functions described here allow access of colored glyph layer data
* in OpenType's 'COLR' tables.
+ *
+ * Note that FreeType does *not* provide rendering in general of glyphs
+ * that use a 'COLR' table! While FreeType has very limited rendering
+ * support for 'COLR' v0 tables (without a possibility to change the
+ * color palette) via @FT_Render_Glyph, there is no such convenience
+ * code for 'COLR' v1 tables -- while it appears that v1 is simply an
+ * 'improved' version of v0, this is not the case: it is a completely
+ * different color font format, and you need a dedicated graphics
+ * library like Skia or Cairo to handle a v1 table's drawing commands.
*/
@@ -359,7 +368,7 @@ FT_BEGIN_HEADER
* iteratively retrieve the colored glyph layers associated with the
* current glyph slot.
*
- * https://docs.microsoft.com/en-us/typography/opentype/spec/colr
+ * https://learn.microsoft.com/typography/opentype/spec/colr
*
* The glyph layer data for a given glyph index, if present, provides an
* alternative, multi-color glyph representation: Instead of rendering
@@ -1518,7 +1527,7 @@ FT_BEGIN_HEADER
*
* @return:
* Value~1 if a clip box is found. If no clip box is found or an error
- * occured, value~0 is returned.
+ * occurred, value~0 is returned.
*
* @note:
* To retrieve the clip box in font units, reset scale to units-per-em
@@ -1646,7 +1655,7 @@ FT_BEGIN_HEADER
*
* @return:
* Value~1 if everything is OK. Value~0 if no details can be found for
- * this paint or any other error occured.
+ * this paint or any other error occurred.
*
* @since:
* 2.13
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h
index 1b7f539f5e22..b65a06ab69b0 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h
@@ -4,7 +4,7 @@
*
* FreeType API for controlling driver modules (specification only).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -282,7 +282,7 @@ FT_BEGIN_HEADER
* minimize hinting techniques that were problematic with the extra
* resolution of ClearType; see
* http://rastertragedy.com/RTRCh4.htm#Sec1 and
- * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
+ * https://learn.microsoft.com/typography/cleartype/truetypecleartype.
* This technique is not to be confused with ClearType compatible widths.
* ClearType backward compatibility has no direct impact on changing
* advance widths, but there might be an indirect impact on disabling
@@ -784,7 +784,7 @@ FT_BEGIN_HEADER
*
* Details on subpixel hinting and some of the necessary tweaks can be
* found in Greg Hitchcock's whitepaper at
- * 'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+ * 'https://learn.microsoft.com/typography/cleartype/truetypecleartype'.
* Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2,
* or 6x5 supersampling) like discussed in the paper. Depending on the
* chosen interpreter, it simply ignores instructions on vertical stems
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h b/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h
index 710ca91bbddb..3e591bede8d8 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h
@@ -4,7 +4,7 @@
*
* FreeType error codes (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h b/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h
index 27c0ece5c1ca..eca494f90c08 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h
@@ -4,7 +4,7 @@
*
* FreeType error code handling (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h
index 7c8b0874a818..5df82447d0ee 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h
@@ -4,7 +4,7 @@
*
* Support functions for font formats.
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h
index 30e5a9bf82b0..77e5a7e7bfd3 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h
@@ -4,7 +4,7 @@
*
* Access of TrueType's 'gasp' table (specification).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h
index dc1eb8873ae8..3691781cf523 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h
@@ -4,7 +4,7 @@
*
* FreeType convenience functions to handle glyphs (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h
index 9516dc030ac5..e26c334c11a1 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h
@@ -4,7 +4,7 @@
*
* Gzip-compressed stream support.
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h
index 2b4b4ac60ae2..a4dc724f3499 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h
@@ -5,7 +5,7 @@
* FreeType glyph image formats and default raster interface
* (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -267,6 +267,10 @@ FT_BEGIN_HEADER
* *logical* one. For example, if @FT_Pixel_Mode is set to
* `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the
* physical one.
+ *
+ * An empty bitmap with a NULL `buffer` is valid, with `rows` and/or
+ * `pitch` also set to 0. Such bitmaps might be produced while rendering
+ * empty or degenerate outlines.
*/
typedef struct FT_Bitmap_
{
@@ -439,7 +443,7 @@ FT_BEGIN_HEADER
* rasterizer; see the `tags` field in @FT_Outline.
*
* Please refer to the description of the 'SCANTYPE' instruction in the
- * [OpenType specification](https://learn.microsoft.com/en-us/typography/opentype/spec/tt_instructions#scantype)
+ * [OpenType specification](https://learn.microsoft.com/typography/opentype/spec/tt_instructions#scantype)
* how simple drop-outs, smart drop-outs, and stubs are defined.
*/
#define FT_OUTLINE_NONE 0x0
@@ -871,7 +875,7 @@ FT_BEGIN_HEADER
*/
typedef struct FT_Span_
{
- short x;
+ unsigned short x;
unsigned short len;
unsigned char coverage;
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h
index 816581b78ebd..2233044754e6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h
@@ -4,7 +4,7 @@
*
* FreeType incremental loading (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h
index 25274dc4ac22..37bb5e1b8fb1 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h
@@ -5,7 +5,7 @@
* FreeType API for color filtering of subpixel bitmap glyphs
* (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -145,16 +145,10 @@ FT_BEGIN_HEADER
*
* FT_LCD_FILTER_LEGACY ::
* FT_LCD_FILTER_LEGACY1 ::
- * This filter corresponds to the original libXft color filter. It
- * provides high contrast output but can exhibit really bad color
- * fringes if glyphs are not extremely well hinted to the pixel grid.
- * This filter is only provided for comparison purposes, and might be
- * disabled or stay unsupported in the future. The second value is
- * provided for compatibility with FontConfig, which historically used
- * different enumeration, sometimes incorrectly forwarded to FreeType.
+ * The legacy libXft color filter is no longer supported and ignored.
*
* @since:
- * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2)
+ * 2.3.0
*/
typedef enum FT_LcdFilter_
{
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h
index 972fbfa2fe4e..14958b0ff371 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h
@@ -4,7 +4,7 @@
*
* Generic list support for FreeType (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h
index 1813cfc2c27a..d155171136c2 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h
@@ -4,7 +4,7 @@
*
* Additional debugging APIs.
*
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h
index e4efde33dd83..c5ac49101a47 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h
@@ -4,7 +4,7 @@
*
* Additional Mac-specific API.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h
index 35ed039c89b8..ff0bbab59f95 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h
@@ -2,9 +2,9 @@
*
* ftmm.h
*
- * FreeType Multiple Master font interface (specification).
+ * FreeType variation font interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -37,24 +37,79 @@ FT_BEGIN_HEADER
* multiple_masters
*
* @title:
- * Multiple Masters
+ * OpenType Font Variations, TrueType GX, and Adobe MM Fonts
*
* @abstract:
- * How to manage Multiple Masters fonts.
+ * How to manage variable fonts with multiple design axes.
*
* @description:
- * The following types and functions are used to manage Multiple Master
- * fonts, i.e., the selection of specific design instances by setting
- * design axis coordinates.
- *
- * Besides Adobe MM fonts, the interface supports Apple's TrueType GX and
- * OpenType variation fonts. Some of the routines only work with Adobe
- * MM fonts, others will work with all three types. They are similar
- * enough that a consistent interface makes sense.
- *
- * For Adobe MM fonts, macro @FT_IS_SFNT returns false. For GX and
- * OpenType variation fonts, it returns true.
- *
+ * The following types and functions manage OpenType Font Variations,
+ * Adobe Multiple Master (MM) fonts, and Apple TrueType GX fonts. These
+ * formats have in common that they allow the selection of specific
+ * design instances by setting design coordinates for one or more axes
+ * like font weight or width.
+ *
+ * For historical reasons there are two interfaces. The first, older one
+ * can be used with Adobe MM fonts only, and the second, newer one is a
+ * unified interface that handles all three font formats. However, some
+ * differences remain and are documented accordingly; in particular,
+ * Adobe MM fonts don't have named instances (see below).
+ *
+ * For Adobe MM fonts, macro @FT_IS_SFNT returns false. For TrueType GX
+ * and OpenType Font Variations, it returns true.
+ *
+ * We use mostly the terminology of the OpenType standard. Here are some
+ * important technical terms.
+ *
+ * * A 'named instance' is a tuple of design coordinates that has a
+ * string ID (i.e., an index into the font's 'name' table) associated
+ * with it. The font can tell the user that, for example,
+ * [Weight=700,Width=110] is 'Bold'. Another name for 'named instance'
+ * is 'named style'.
+ *
+ * Adobe MM fonts don't have named instances.
+ *
+ * * The 'default instance' of a variation font is that instance for
+ * which the nth axis coordinate is equal to the nth default axis
+ * coordinate (i.e., `axis[n].def` as specified in the @FT_MM_Var
+ * structure), with~n covering all axes. In TrueType GX and OpenType
+ * Font Variations, the default instance is explicitly given. In Adobe
+ * MM fonts, the `WeightVector` entry as found in the font file is
+ * taken as the default instance.
+ *
+ * For TrueType GX and OpenType Font Variations, FreeType synthesizes
+ * a named instance for the default instance if the font does not
+ * contain such an entry.
+ *
+ * * 'Design coordinates' are the axis values found in a variation font
+ * file. Their meaning is specified by the font designer and the
+ * values are rather arbitrary.
+ *
+ * For example, the 'weight' axis in design coordinates might vary
+ * between 100 (thin) and 900 (heavy) in font~A, while font~B
+ * contains values between 400 (normal) and 800 (extra bold).
+ *
+ * * 'Normalized coordinates' are design coordinates mapped to a standard
+ * range; they are also called 'blend coordinates'.
+ *
+ * For TrueType GX and OpenType Font Variations, the range is [-1;1],
+ * with the minimum mapped to value~-1, the default mapped to
+ * value~0, and the maximum mapped to value~1, and all other
+ * coordinates mapped to intervening points. Please look up the
+ * [OpenType
+ * specification](https://learn.microsoft.com/en-us/typography/opentype/spec/otvaroverview)
+ * on how this mapping works in detail.
+ *
+ * For Adobe MM fonts, this standard range is [0;1], with the minimum
+ * mapped to value~0 and the maximum mapped to value~1, and all other
+ * coordinates mapped to intervening points. Please look up [Adobe
+ * TechNote
+ * #5015](https://adobe-type-tools.github.io/font-tech-notes/pdfs/5015.Type1_Supp.pdf)
+ * on how this mapping works in detail.
+ *
+ * Assuming that the two fonts in the previous example are OpenType
+ * Font Variations, both font~A's [100;900] and font~B's [400;800]
+ * coordinate ranges get mapped to [-1;1].
*/
@@ -64,14 +119,14 @@ FT_BEGIN_HEADER
* T1_MAX_MM_XXX
*
* @description:
- * Multiple Masters limits as defined in their specifications.
+ * Adobe MM font limits as defined in their specifications.
*
* @values:
* T1_MAX_MM_AXIS ::
- * The maximum number of Multiple Masters axes.
+ * The maximum number of Adobe MM font axes.
*
* T1_MAX_MM_DESIGNS ::
- * The maximum number of Multiple Masters designs.
+ * The maximum number of Adobe MM font designs.
*
* T1_MAX_MM_MAP_POINTS ::
* The maximum number of elements in a design map.
@@ -88,11 +143,10 @@ FT_BEGIN_HEADER
* FT_MM_Axis
*
* @description:
- * A structure to model a given axis in design space for Multiple Masters
- * fonts.
+ * A structure to model a given axis in design space for Adobe MM fonts.
*
- * This structure can't be used for TrueType GX or OpenType variation
- * fonts.
+ * This structure can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @fields:
* name ::
@@ -119,17 +173,17 @@ FT_BEGIN_HEADER
* FT_Multi_Master
*
* @description:
- * A structure to model the axes and space of a Multiple Masters font.
+ * A structure to model the axes and space of an Adobe MM font.
*
- * This structure can't be used for TrueType GX or OpenType variation
- * fonts.
+ * This structure can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @fields:
* num_axis ::
* Number of axes. Cannot exceed~4.
*
* num_designs ::
- * Number of designs; should be normally 2^num_axis even though the
+ * Number of designs; should be normally `2^num_axis` even though the
* Type~1 specification strangely allows for intermediate designs to be
* present. This number cannot exceed~16.
*
@@ -151,13 +205,13 @@ FT_BEGIN_HEADER
* FT_Var_Axis
*
* @description:
- * A structure to model a given axis in design space for Multiple
- * Masters, TrueType GX, and OpenType variation fonts.
+ * A structure to model a given axis in design space for Adobe MM fonts,
+ * TrueType GX, and OpenType Font Variations.
*
* @fields:
* name ::
* The axis's name. Not always meaningful for TrueType GX or OpenType
- * variation fonts.
+ * Font Variations.
*
* minimum ::
* The axis's minimum design coordinate.
@@ -171,17 +225,17 @@ FT_BEGIN_HEADER
*
* tag ::
* The axis's tag (the equivalent to 'name' for TrueType GX and
- * OpenType variation fonts). FreeType provides default values for
+ * OpenType Font Variations). FreeType provides default values for
* Adobe MM fonts if possible.
*
* strid ::
* The axis name entry in the font's 'name' table. This is another
* (and often better) version of the 'name' field for TrueType GX or
- * OpenType variation fonts. Not meaningful for Adobe MM fonts.
+ * OpenType Font Variations. Not meaningful for Adobe MM fonts.
*
* @note:
* The fields `minimum`, `def`, and `maximum` are 16.16 fractional values
- * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the
+ * for TrueType GX and OpenType Font Variations. For Adobe MM fonts, the
* values are whole numbers (i.e., the fractional part is zero).
*/
typedef struct FT_Var_Axis_
@@ -205,7 +259,7 @@ FT_BEGIN_HEADER
*
* @description:
* A structure to model a named instance in a TrueType GX or OpenType
- * variation font.
+ * Font Variations.
*
* This structure can't be used for Adobe MM fonts.
*
@@ -215,11 +269,11 @@ FT_BEGIN_HEADER
* entry for each axis.
*
* strid ::
- * The entry in 'name' table identifying this instance.
+ * An index into the 'name' table identifying this instance.
*
* psid ::
- * The entry in 'name' table identifying a PostScript name for this
- * instance. Value 0xFFFF indicates a missing entry.
+ * An index into the 'name' table identifying a PostScript name for
+ * this instance. Value 0xFFFF indicates a missing entry.
*/
typedef struct FT_Var_Named_Style_
{
@@ -236,39 +290,33 @@ FT_BEGIN_HEADER
* FT_MM_Var
*
* @description:
- * A structure to model the axes and space of an Adobe MM, TrueType GX,
- * or OpenType variation font.
+ * A structure to model the axes and space of Adobe MM fonts, TrueType
+ * GX, or OpenType Font Variations.
*
* Some fields are specific to one format and not to the others.
*
* @fields:
* num_axis ::
* The number of axes. The maximum value is~4 for Adobe MM fonts; no
- * limit in TrueType GX or OpenType variation fonts.
+ * limit in TrueType GX or OpenType Font Variations.
*
* num_designs ::
- * The number of designs; should be normally 2^num_axis for Adobe MM
- * fonts. Not meaningful for TrueType GX or OpenType variation fonts
+ * The number of designs; should be normally `2^num_axis` for Adobe MM
+ * fonts. Not meaningful for TrueType GX or OpenType Font Variations
* (where every glyph could have a different number of designs).
*
* num_namedstyles ::
- * The number of named styles; a 'named style' is a tuple of design
- * coordinates that has a string ID (in the 'name' table) associated
- * with it. The font can tell the user that, for example,
- * [Weight=1.5,Width=1.1] is 'Bold'. Another name for 'named style' is
- * 'named instance'.
- *
- * For Adobe Multiple Masters fonts, this value is always zero because
- * the format does not support named styles.
+ * The number of named instances. For Adobe MM fonts, this value is
+ * always zero.
*
* axis ::
- * An axis descriptor table. TrueType GX and OpenType variation fonts
+ * An axis descriptor table. TrueType GX and OpenType Font Variations
* contain slightly more data than Adobe MM fonts. Memory management
* of this pointer is done internally by FreeType.
*
* namedstyle ::
- * A named style (instance) table. Only meaningful for TrueType GX and
- * OpenType variation fonts. Memory management of this pointer is done
+ * An array of named instances. Only meaningful for TrueType GX and
+ * OpenType Font Variations. Memory management of this pointer is done
* internally by FreeType.
*/
typedef struct FT_MM_Var_
@@ -290,8 +338,8 @@ FT_BEGIN_HEADER
* @description:
* Retrieve a variation descriptor of a given Adobe MM font.
*
- * This function can't be used with TrueType GX or OpenType variation
- * fonts.
+ * This function can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @input:
* face ::
@@ -299,7 +347,7 @@ FT_BEGIN_HEADER
*
* @output:
* amaster ::
- * The Multiple Masters descriptor.
+ * The Adobe MM font's variation descriptor.
*
* @return:
* FreeType error code. 0~means success.
@@ -366,8 +414,8 @@ FT_BEGIN_HEADER
* For Adobe MM fonts, choose an interpolated font design through design
* coordinates.
*
- * This function can't be used with TrueType GX or OpenType variation
- * fonts.
+ * This function can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @inout:
* face ::
@@ -391,8 +439,8 @@ FT_BEGIN_HEADER
*
* [Since 2.9] If `num_coords` is larger than zero, this function sets
* the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
- * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero,
- * this bit flag gets unset.
+ * (i.e., @FT_IS_VARIATION returns true). If `num_coords` is zero, this
+ * bit flag gets unset.
*/
FT_EXPORT( FT_Error )
FT_Set_MM_Design_Coordinates( FT_Face face,
@@ -428,7 +476,7 @@ FT_BEGIN_HEADER
*
* @note:
* The design coordinates are 16.16 fractional values for TrueType GX and
- * OpenType variation fonts. For Adobe MM fonts, the values are supposed
+ * OpenType Font Variations. For Adobe MM fonts, the values are supposed
* to be whole numbers (i.e., the fractional part is zero).
*
* [Since 2.8.1] To reset all axes to the default values, call the
@@ -438,8 +486,14 @@ FT_BEGIN_HEADER
*
* [Since 2.9] If `num_coords` is larger than zero, this function sets
* the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
- * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero,
- * this bit flag gets unset.
+ * (i.e., @FT_IS_VARIATION returns true). If `num_coords` is zero, this
+ * bit flag gets unset.
+ *
+ * [Since 2.14] This function also sets the @FT_FACE_FLAG_VARIATION bit
+ * in @FT_Face's `face_flags` field (i.e., @FT_IS_VARIATION returns
+ * true) if any of the provided coordinates is different from the face's
+ * default value for the corresponding axis, that is, the set up face is
+ * not at its default position.
*/
FT_EXPORT( FT_Error )
FT_Set_Var_Design_Coordinates( FT_Face face,
@@ -468,14 +522,14 @@ FT_BEGIN_HEADER
*
* @output:
* coords ::
- * The design coordinates array.
+ * The design coordinates array, which must be allocated by the user.
*
* @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 whole
+ * OpenType Font Variations. For Adobe MM fonts, the values are whole
* numbers (i.e., the fractional part is zero).
*
* @since:
@@ -493,8 +547,7 @@ FT_BEGIN_HEADER
* FT_Set_MM_Blend_Coordinates
*
* @description:
- * Choose an interpolated font design through normalized blend
- * coordinates.
+ * Choose an interpolated font design through normalized coordinates.
*
* This function works with all supported variation formats.
*
@@ -509,9 +562,10 @@ FT_BEGIN_HEADER
* the number of axes, use default values for the remaining axes.
*
* coords ::
- * 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.
+ * The normalized 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 Font
+ * Variations.
*
* @return:
* FreeType error code. 0~means success.
@@ -524,8 +578,14 @@ FT_BEGIN_HEADER
*
* [Since 2.9] If `num_coords` is larger than zero, this function sets
* the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
- * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero,
- * this bit flag gets unset.
+ * (i.e., @FT_IS_VARIATION returns true). If `num_coords` is zero, this
+ * bit flag gets unset.
+ *
+ * [Since 2.14] This function also sets the @FT_FACE_FLAG_VARIATION bit
+ * in @FT_Face's `face_flags` field (i.e., @FT_IS_VARIATION returns
+ * true) if any of the provided coordinates is different from the face's
+ * default value for the corresponding axis, that is, the set up face is
+ * not at its default position.
*/
FT_EXPORT( FT_Error )
FT_Set_MM_Blend_Coordinates( FT_Face face,
@@ -539,8 +599,8 @@ FT_BEGIN_HEADER
* FT_Get_MM_Blend_Coordinates
*
* @description:
- * Get the normalized blend coordinates of the currently selected
- * interpolated font.
+ * Get the normalized coordinates of the currently selected interpolated
+ * font.
*
* This function works with all supported variation formats.
*
@@ -549,14 +609,14 @@ FT_BEGIN_HEADER
* A handle to the source face.
*
* num_coords ::
- * The number of normalized blend coordinates to retrieve. If it is
- * larger than the number of axes, set the excess values to~0.5 for
- * Adobe MM fonts, and to~0 for TrueType GX and OpenType variation
- * fonts.
+ * The number of normalized coordinates to retrieve. If it is larger
+ * than the number of axes, set the excess values to~0.5 for Adobe MM
+ * fonts, and to~0 for TrueType GX and OpenType Font Variations.
*
* @output:
* coords ::
- * The normalized blend coordinates array (as 16.16 fractional values).
+ * The normalized coordinates array (as 16.16 fractional values), which
+ * must be allocated by the user.
*
* @return:
* FreeType error code. 0~means success.
@@ -610,8 +670,8 @@ FT_BEGIN_HEADER
* For Adobe MM fonts, choose an interpolated font design by directly
* setting the weight vector.
*
- * This function can't be used with TrueType GX or OpenType variation
- * fonts.
+ * This function can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @inout:
* face ::
@@ -630,16 +690,16 @@ FT_BEGIN_HEADER
* FreeType error code. 0~means success.
*
* @note:
- * Adobe Multiple Master fonts limit the number of designs, and thus the
- * length of the weight vector to 16~elements.
+ * Adobe MM fonts limit the number of designs, and thus the length of the
+ * weight vector, to 16~elements.
*
* If `len` is larger than zero, this function sets the
* @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field (i.e.,
- * @FT_IS_VARIATION will return true). If `len` is zero, this bit flag
- * is unset and the weight vector array is reset to the default values.
+ * @FT_IS_VARIATION returns true). If `len` is zero, this bit flag is
+ * unset and the weight vector array is reset to the default values.
*
* The Adobe documentation also states that the values in the
- * WeightVector array must total 1.0 +/-~0.001. In practice this does
+ * `WeightVector` array must total 1.0 +/-~0.001. In practice this does
* not seem to be enforced, so is not enforced here, either.
*
* @since:
@@ -659,8 +719,8 @@ FT_BEGIN_HEADER
* @description:
* For Adobe MM fonts, retrieve the current weight vector of the font.
*
- * This function can't be used with TrueType GX or OpenType variation
- * fonts.
+ * This function can't be used with TrueType GX or OpenType Font
+ * Variations.
*
* @inout:
* face ::
@@ -677,14 +737,14 @@ FT_BEGIN_HEADER
*
* @output:
* weightvector ::
- * An array to be filled.
+ * An array to be filled; it must be allocated by the user.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
- * Adobe Multiple Master fonts limit the number of designs, and thus the
- * length of the WeightVector to~16.
+ * Adobe MM fonts limit the number of designs, and thus the length of the
+ * weight vector, to~16 elements.
*
* @since:
* 2.10
@@ -760,8 +820,8 @@ FT_BEGIN_HEADER
* A handle to the source face.
*
* instance_index ::
- * The index of the requested instance, starting with value 1. If set
- * to value 0, FreeType switches to font access without a named
+ * The index of the requested instance, starting with value~1. If set
+ * to value~0, FreeType switches to font access without a named
* instance.
*
* @return:
@@ -771,11 +831,11 @@ FT_BEGIN_HEADER
* The function uses the value of `instance_index` to set bits 16-30 of
* the face's `face_index` field. It also resets any variation applied
* to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's
- * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will
- * return false).
+ * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION returns
+ * false).
*
- * For Adobe MM fonts (which don't have named instances) this function
- * simply resets the current face to the default instance.
+ * For Adobe MM fonts, this function resets the current face to the
+ * default instance.
*
* @since:
* 2.9
@@ -794,10 +854,6 @@ FT_BEGIN_HEADER
* Retrieve the index of the default named instance, to be used with
* @FT_Set_Named_Instance.
*
- * The default instance of a variation font is that instance for which
- * the nth axis coordinate is equal to `axis[n].def` (as specified in the
- * @FT_MM_Var structure), with~n covering all axes.
- *
* FreeType synthesizes a named instance for the default instance if the
* font does not contain such an entry.
*
@@ -813,8 +869,8 @@ FT_BEGIN_HEADER
* FreeType error code. 0~means success.
*
* @note:
- * For Adobe MM fonts (which don't have named instances) this function
- * always returns zero for `instance_index`.
+ * For Adobe MM fonts, this function always returns zero for
+ * `instance_index`.
*
* @since:
* 2.13.1
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h
index 0ee715898f7b..2669e4a03b33 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h
@@ -4,7 +4,7 @@
*
* FreeType modules public interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h
index 6722fbf8b709..8e2ef2f01f87 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h
@@ -4,7 +4,7 @@
*
* FreeType module error offsets (specification).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h
index 44e94b4f5bbb..2545ca8486b6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h
@@ -5,7 +5,7 @@
* Support for the FT_Outline type used to store glyph shapes of
* most scalable font formats (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h
index 43bf69c202f7..94dcd6399a6e 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h
@@ -4,7 +4,7 @@
*
* FreeType API for possible FT_Parameter tags (specification only).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -133,11 +133,8 @@ FT_BEGIN_HEADER
* FT_PARAM_TAG_LCD_FILTER_WEIGHTS
*
* @description:
- * An @FT_Parameter tag to be used with @FT_Face_Properties. The
- * corresponding argument specifies the five LCD filter weights for a
- * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the
- * global default values or the values set up with
- * @FT_Library_SetLcdFilterWeights.
+ * Overriding global LCD filter weights with custom values for a given
+ * face is no longer supported and ignored.
*
* @since:
* 2.8
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h
index dc5018a1b54b..cc3102073b1d 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h
@@ -4,7 +4,7 @@
*
* FreeType renderer modules public interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h
index 4ef5c7955dfd..fdb89f24ccca 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h
@@ -4,7 +4,7 @@
*
* FreeType size objects management (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h
index d5d5cd931032..99728574db64 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h
@@ -7,7 +7,7 @@
*
* This is _not_ used to retrieve glyph names!
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h
index 41626dc9d7b3..2c4761c768d4 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h
@@ -4,7 +4,7 @@
*
* FreeType path stroker (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h
index 43081b6c3307..93499a4b4f10 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h
@@ -5,7 +5,7 @@
* FreeType synthesizing code for emboldening and slanting
* (specification).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h b/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h
index 1eacb3af398f..1de9f8e603dd 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h
@@ -4,7 +4,7 @@
*
* FreeType low-level system interface definition (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h b/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h
index a5299e938d45..ed7bd06a78fc 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h
@@ -4,7 +4,7 @@
*
* FreeType trigonometric functions (specification).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h
index 27815143a645..e207c5ebe09a 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h
@@ -4,7 +4,7 @@
*
* FreeType simple types definitions (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h
index 8865d53b3894..987e704e9b0f 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h
@@ -4,7 +4,7 @@
*
* High-level 'autohint' module-specific interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h
index 36b0390a5a56..26ee43bb9a9f 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h
@@ -4,7 +4,7 @@
*
* Basic OpenType/CFF object type definitions (specification).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h
index ef2e8e7569c3..754122fa6467 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h
@@ -5,7 +5,7 @@
* Basic OpenType/CFF type definitions and interface (specification
* only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -191,8 +191,8 @@ FT_BEGIN_HEADER
FT_UInt weight;
FT_Bool is_fixed_pitch;
FT_Fixed italic_angle;
- FT_Fixed underline_position;
- FT_Fixed underline_thickness;
+ FT_Short underline_position;
+ FT_UShort underline_thickness;
FT_Int paint_type;
FT_Int charstring_type;
FT_Matrix font_matrix;
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h
index 876f66e25617..e6d0166d8882 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h
@@ -4,7 +4,7 @@
*
* Compiler-specific macro definitions used internally by FreeType.
*
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -128,8 +128,8 @@ FT_BEGIN_HEADER
* before a function declaration.
*/
- /* Visual C, mingw */
-#if defined( _WIN32 )
+ /* Visual C, MinGW, Cygwin */
+#if defined( _WIN32 ) || defined( __CYGWIN__ )
#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */
/* gcc, clang */
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h
index 71128a2df909..16a732224ef6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h
@@ -4,7 +4,7 @@
*
* Arithmetic computations (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -27,17 +27,87 @@
FT_BEGIN_HEADER
+ /*
+ * The following macros have two purposes.
+ *
+ * - Tag places where overflow is expected and harmless.
+ *
+ * - Avoid run-time undefined behavior sanitizer errors.
+ *
+ * Use with care!
+ */
+#define ADD_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) )
+#define SUB_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) )
+#define MUL_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) )
+#define NEG_INT( a ) \
+ (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) )
+
+#define ADD_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
+#define SUB_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
+#define MUL_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
+#define NEG_LONG( a ) \
+ (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
+
+#define ADD_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
+#define SUB_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
+#define MUL_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
+#define NEG_INT32( a ) \
+ (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
+
+#ifdef FT_INT64
+
+#define ADD_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
+#define SUB_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
+#define MUL_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
+#define NEG_INT64( a ) \
+ (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
+
+#endif /* FT_INT64 */
+
+
/**************************************************************************
*
* FT_MulDiv() and FT_MulFix() are declared in freetype.h.
*
*/
-#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
- /* Provide assembler fragments for performance-critical functions. */
- /* These must be defined `static __inline__' with GCC. */
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
-#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */
+#ifdef FT_INT64
+
+ static inline FT_Long
+ FT_MulFix_64( FT_Long a,
+ FT_Long b )
+ {
+ FT_Int64 ab = MUL_INT64( a, b );
+
+
+ ab = ADD_INT64( ab, 0x8000 + ( ab >> 63 ) ); /* rounding phase */
+
+ return (FT_Long)( ab >> 16 );
+ }
+
+
+#define FT_MulFix( a, b ) FT_MulFix_64( a, b )
+
+#elif !defined( FT_CONFIG_OPTION_NO_ASSEMBLER )
+ /* Provide 32-bit assembler fragments for optimized FT_MulFix. */
+ /* These must be defined `static __inline__' or similar. */
+
+#if defined( __arm__ ) && \
+ ( defined( __thumb2__ ) || !defined( __thumb__ ) )
#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
@@ -49,6 +119,7 @@ FT_BEGIN_HEADER
{
FT_Int32 t, t2;
+#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */
__asm
{
@@ -60,28 +131,8 @@ FT_BEGIN_HEADER
mov a, t2, lsr #16 /* a = t2 >> 16 */
orr a, a, t, lsl #16 /* a |= t << 16 */
}
- return a;
- }
-
-#endif /* __CC_ARM || __ARMCC__ */
-
-
-#ifdef __GNUC__
-
-#if defined( __arm__ ) && \
- ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \
- !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
-
-#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
-
- /* documentation is in freetype.h */
-
- static __inline__ FT_Int32
- FT_MulFix_arm( FT_Int32 a,
- FT_Int32 b )
- {
- FT_Int32 t, t2;
+#elif defined( __GNUC__ )
__asm__ __volatile__ (
"smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
@@ -98,26 +149,25 @@ FT_BEGIN_HEADER
: "=r"(a), "=&r"(t2), "=&r"(t)
: "r"(a), "r"(b)
: "cc" );
- return a;
- }
-#endif /* __arm__ && */
- /* ( __thumb2__ || !__thumb__ ) && */
- /* !( __CC_ARM || __ARMCC__ ) */
+#endif
+ return a;
+ }
-#if defined( __i386__ )
+#elif defined( __i386__ ) || defined( _M_IX86 )
#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
/* documentation is in freetype.h */
- static __inline__ FT_Int32
+ static __inline FT_Int32
FT_MulFix_i386( FT_Int32 a,
FT_Int32 b )
{
FT_Int32 result;
+#if defined( __GNUC__ )
__asm__ __volatile__ (
"imul %%edx\n"
@@ -132,27 +182,8 @@ FT_BEGIN_HEADER
: "=a"(result), "=d"(b)
: "a"(a), "d"(b)
: "%ecx", "cc" );
- return result;
- }
-
-#endif /* i386 */
-
-#endif /* __GNUC__ */
-
-
-#ifdef _MSC_VER /* Visual C++ */
-#ifdef _M_IX86
-
-#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
-
- /* documentation is in freetype.h */
-
- static __inline FT_Int32
- FT_MulFix_i386( FT_Int32 a,
- FT_Int32 b )
- {
- FT_Int32 result;
+#elif defined( _MSC_VER )
__asm
{
@@ -169,82 +200,22 @@ FT_BEGIN_HEADER
add eax, edx
mov result, eax
}
- return result;
- }
-
-#endif /* _M_IX86 */
-#endif /* _MSC_VER */
-
-
-#if defined( __GNUC__ ) && defined( __x86_64__ )
-
-#define FT_MULFIX_ASSEMBLER FT_MulFix_x86_64
-
- static __inline__ FT_Int32
- FT_MulFix_x86_64( FT_Int32 a,
- FT_Int32 b )
- {
- /* Temporarily disable the warning that C90 doesn't support */
- /* `long long'. */
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wlong-long"
#endif
-#if 1
- /* Technically not an assembly fragment, but GCC does a really good */
- /* job at inlining it and generating good machine code for it. */
- long long ret, tmp;
-
-
- ret = (long long)a * b;
- tmp = ret >> 63;
- ret += 0x8000 + tmp;
-
- return (FT_Int32)( ret >> 16 );
-#else
-
- /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine */
- /* code from the lines below. The main issue is that `wide_a' is not */
- /* properly initialized by sign-extending `a'. Instead, the generated */
- /* machine code assumes that the register that contains `a' on input */
- /* can be used directly as a 64-bit value, which is wrong most of the */
- /* time. */
- long long wide_a = (long long)a;
- long long wide_b = (long long)b;
- long long result;
-
-
- __asm__ __volatile__ (
- "imul %2, %1\n"
- "mov %1, %0\n"
- "sar $63, %0\n"
- "lea 0x8000(%1, %0), %0\n"
- "sar $16, %0\n"
- : "=&r"(result), "=&r"(wide_a)
- : "r"(wide_b)
- : "cc" );
-
- return (FT_Int32)result;
-#endif
-
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic pop
-#endif
+ return result;
}
-#endif /* __GNUC__ && __x86_64__ */
-
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
+#endif /* __i386__ || _M_IX86 */
-#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
#ifdef FT_MULFIX_ASSEMBLER
#define FT_MulFix( a, b ) FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) )
-#endif
#endif
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+#endif /* FT_CONFIG_OPTION_INLINE_MULFIX */
+
/**************************************************************************
*
@@ -278,40 +249,6 @@ 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
@@ -455,6 +392,10 @@ FT_BEGIN_HEADER
#define FT_MSB( x ) FT_MSB_i386( x )
+#elif defined( __CC_ARM )
+
+#define FT_MSB( x ) ( 31 - __clz( x ) )
+
#elif defined( __SunOS_5_11 )
#include
@@ -526,55 +467,6 @@ FT_BEGIN_HEADER
#define ROUND_F26DOT6( x ) ( ( (x) + 32 - ( x < 0 ) ) & -64 )
- /*
- * The following macros have two purposes.
- *
- * - Tag places where overflow is expected and harmless.
- *
- * - Avoid run-time sanitizer errors.
- *
- * Use with care!
- */
-#define ADD_INT( a, b ) \
- (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) )
-#define SUB_INT( a, b ) \
- (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) )
-#define MUL_INT( a, b ) \
- (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) )
-#define NEG_INT( a ) \
- (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) )
-
-#define ADD_LONG( a, b ) \
- (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
-#define SUB_LONG( a, b ) \
- (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
-#define MUL_LONG( a, b ) \
- (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
-#define NEG_LONG( a ) \
- (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
-
-#define ADD_INT32( a, b ) \
- (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
-#define SUB_INT32( a, b ) \
- (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
-#define MUL_INT32( a, b ) \
- (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
-#define NEG_INT32( a ) \
- (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
-
-#ifdef FT_INT64
-
-#define ADD_INT64( a, b ) \
- (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
-#define SUB_INT64( a, b ) \
- (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
-#define MUL_INT64( a, b ) \
- (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
-#define NEG_INT64( a ) \
- (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
-
-#endif /* FT_INT64 */
-
FT_END_HEADER
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h
index d7fa8dc93cf7..d7facf40d127 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h
@@ -4,7 +4,7 @@
*
* Debugging and logging component (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h
index 5609b3ef12bd..24be4dad36be 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h
@@ -4,7 +4,7 @@
*
* FreeType internal font driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h
index f1c155b162ca..8f2a54c015b6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h
@@ -4,7 +4,7 @@
*
* The FreeType glyph loader (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h
index 622ec76bb9a8..642d21e21c6a 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h
@@ -117,6 +117,18 @@ FT_BEGIN_HEADER
FT_Hash hash,
FT_Memory memory );
+ FT_Error
+ ft_hash_str_insert_no_overwrite( const char* key,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory );
+
+ FT_Error
+ ft_hash_num_insert_no_overwrite( FT_Int num,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory );
+
size_t*
ft_hash_str_lookup( const char* key,
FT_Hash hash );
@@ -125,6 +137,17 @@ FT_BEGIN_HEADER
ft_hash_num_lookup( FT_Int num,
FT_Hash hash );
+ FT_Bool
+ ft_hash_num_iterator( FT_UInt *idx,
+ FT_Int *key,
+ size_t *value,
+ FT_Hash hash );
+
+ FT_Bool
+ ft_hash_str_iterator( FT_UInt *idx,
+ const char* *key,
+ size_t *value,
+ FT_Hash hash );
FT_END_HEADER
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h
index 4e05a29f13a1..c75c33f28959 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h
@@ -4,7 +4,7 @@
*
* The FreeType memory management macros (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h
index 8449e7a010d0..be3747bbf94a 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h
@@ -5,7 +5,7 @@
* OpenType Variations type definitions for internal use
* with the multi-masters service (specification).
*
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
* Dominik Röttsches.
*
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h
index a1e93298fdbc..d4d7bc00fe90 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h
@@ -4,7 +4,7 @@
*
* The FreeType private base classes (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -275,6 +275,28 @@ FT_BEGIN_HEADER
FT_GlyphSlot slot,
FT_Render_Mode mode );
+
+ /**************************************************************************
+ *
+ * @Function:
+ * find_unicode_charmap
+ *
+ * @Description:
+ * This function finds a Unicode charmap, if there is one. And if there
+ * is more than one, it tries to favour the more extensive one, i.e., one
+ * that supports UCS-4 against those which are limited to the BMP (UCS-2
+ * encoding.)
+ *
+ * If a unicode charmap is found, `face->charmap` is set to it.
+ *
+ * This function is called from `open_face`, from `FT_Select_Charmap(...,
+ * FT_ENCODING_UNICODE)`, and also from `afadjust.c` in the 'autofit'
+ * module.
+ */
+ FT_BASE( FT_Error )
+ find_unicode_charmap( FT_Face face );
+
+
#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap,
@@ -343,11 +365,6 @@ FT_BEGIN_HEADER
* Value~0 means to use the font's value. Value~-1 means to use the
* CFF driver's default.
*
- * lcd_weights ::
- * lcd_filter_func ::
- * These fields specify the LCD filtering weights and callback function
- * for ClearType-style subpixel rendering.
- *
* refcount ::
* A counter initialized to~1 at the time an @FT_Face structure is
* created. @FT_Reference_Face increments this counter, and
@@ -369,11 +386,6 @@ FT_BEGIN_HEADER
FT_Char no_stem_darkening;
FT_Int32 random_seed;
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
- FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */
- FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
-#endif
-
FT_Int refcount;
} FT_Face_InternalRec;
@@ -498,9 +510,9 @@ FT_BEGIN_HEADER
*/
typedef struct FT_ModuleRec_
{
- FT_Module_Class* clazz;
- FT_Library library;
- FT_Memory memory;
+ const FT_Module_Class* clazz;
+ FT_Library library;
+ FT_Memory memory;
} FT_ModuleRec;
@@ -702,9 +714,9 @@ FT_BEGIN_HEADER
const FT_Vector* origin );
/* Allocate a new bitmap buffer in a glyph slot. */
+ /* Dimensions must be preset in advance. */
FT_BASE( FT_Error )
- ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
- FT_ULong size );
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot );
/* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */
@@ -867,10 +879,6 @@ FT_BEGIN_HEADER
* lcd_weights ::
* The LCD filter weights for ClearType-style subpixel rendering.
*
- * lcd_filter_func ::
- * The LCD filtering callback function for for ClearType-style subpixel
- * rendering.
- *
* lcd_geometry ::
* This array specifies LCD subpixel geometry and controls Harmony LCD
* rendering technique, alternative to ClearType.
@@ -904,7 +912,6 @@ FT_BEGIN_HEADER
#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */
- FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
#else
FT_Vector lcd_geometry[3]; /* RGB subpixel positions */
#endif
@@ -973,17 +980,6 @@ FT_BEGIN_HEADER
#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
- /* Define default raster's interface. The default raster is located in */
- /* `src/base/ftraster.c'. */
- /* */
- /* Client applications can register new rasters through the */
- /* FT_Set_Raster() API. */
-
-#ifndef FT_NO_DEFAULT_RASTER
- FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster;
-#endif
-
-
/**************************************************************************
*
* @macro:
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h
index 4f11aa16ba11..18a954d22f50 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h
@@ -4,7 +4,7 @@
*
* Get and set properties of PostScript drivers (specification).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h
index 05c1d6c48b53..e077f98bfb96 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h
@@ -4,7 +4,7 @@
*
* Embedded resource forks accessor (specification).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* Masatake YAMATO and Redhat K.K.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h
index 8c35dbd71395..ce11bba19b26 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h
@@ -4,7 +4,7 @@
*
* The FreeType services (specification only).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h
index fd52f767ef77..20c1dd7c4b00 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h
@@ -4,7 +4,7 @@
*
* Stream handling (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h
index 42595a29ff33..3fd592800e2a 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h
@@ -4,7 +4,7 @@
*
* Tracing handling (specification only).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -19,7 +19,7 @@
/* definitions of trace levels for FreeType 2 */
/* the maximum string length (if the argument to `FT_TRACE_DEF` */
- /* gets used as a string) plus one charachter for ':' plus */
+ /* gets used as a string) plus one character for ':' plus */
/* another one for the trace level */
#define FT_MAX_TRACE_LEVEL_LENGTH (9 + 1 + 1)
@@ -159,6 +159,7 @@ FT_TRACE_DEF( gxvprop )
FT_TRACE_DEF( gxvtrak )
/* autofit components */
+FT_TRACE_DEF( afadjust )
FT_TRACE_DEF( afcjk )
FT_TRACE_DEF( afglobal )
FT_TRACE_DEF( afhints )
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h
index a1312f2aba6c..03a726c82cb5 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h
@@ -4,7 +4,7 @@
*
* FreeType validation support (specification).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h
index 745d2cb56b77..344be0f19a70 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h
@@ -5,7 +5,7 @@
* Auxiliary functions and data structures related to PostScript fonts
* (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h
index dba6c7303fdc..96c5d84f058c 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h
@@ -6,7 +6,7 @@
* recorders (specification only). These are used to support native
* T1/T2 hints in the 'type1', 'cid', and 'cff' font drivers.
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h
index 89e9c2e5de80..5bd51da23f4c 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h
@@ -4,7 +4,7 @@
*
* The FreeType BDF services (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h
index 3cb483c344f8..c97bf84fb2e0 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h
@@ -4,7 +4,7 @@
*
* The FreeType CFF tables loader service (specification).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h
index 8362cb8724d8..748a8caf887c 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h
@@ -4,7 +4,7 @@
*
* The FreeType CID font services (specification).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* Derek Clegg and Michael Toftdal.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h
index 6b837e79fcd4..690fdc2a24fa 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h
@@ -4,7 +4,7 @@
*
* The FreeType font format service (specification only).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h
index 6126ec9ada4a..7128d6f3d7aa 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h
@@ -4,7 +4,7 @@
*
* The FreeType glyph dictionary services (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h
index 29cf55281893..1ca3e0a031b6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h
@@ -4,7 +4,7 @@
*
* FreeType API for validating TrueTypeGX/AAT tables (specification).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* Masatake YAMATO, Red Hat K.K.,
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h
index ac1bc30c412f..8a3d59bec6d6 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h
@@ -4,7 +4,7 @@
*
* The FreeType Kerning service (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h
index 8b3563b25ca4..4dde3a8151af 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h
@@ -4,7 +4,7 @@
*
* The FreeType services for metrics variations (specification).
*
- * Copyright (C) 2016-2024 by
+ * Copyright (C) 2016-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -77,7 +77,7 @@ FT_BEGIN_HEADER
typedef void
(*FT_Metrics_Adjust_Func)( FT_Face face );
- typedef FT_Error
+ typedef void
(*FT_Size_Reset_Func)( FT_Size size );
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h
index 5288fadf3755..9be133e2db0b 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h
@@ -4,7 +4,7 @@
*
* The FreeType Multiple Masters and GX var services (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h
index 7aea7ec11f02..933e5de98da5 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h
@@ -4,7 +4,7 @@
*
* The FreeType OpenType validation service (specification).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h
index b2fac6d086b2..c81b6a68a8bc 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h
@@ -4,7 +4,7 @@
*
* Internal PFR service functions (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h
index d19f3adc6d5a..33864ebc3443 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h
@@ -4,7 +4,7 @@
*
* The FreeType PostScript name services (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h
index ba39c0dd4da9..0eb79c885d81 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h
@@ -4,7 +4,7 @@
*
* The FreeType property service (specification).
*
- * Copyright (C) 2012-2024 by
+ * Copyright (C) 2012-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h
index d4908ee41aa2..8f85d12157cc 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h
@@ -4,7 +4,7 @@
*
* The FreeType PostScript charmap service (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h
index 2aadcdd02a1b..83de04478dfc 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h
@@ -4,7 +4,7 @@
*
* The FreeType PostScript info service (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h
index 9e0f4ff202e9..9bf5e3473c45 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h
@@ -4,7 +4,7 @@
*
* The FreeType SFNT table loading service (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h
index 250886bcc5db..fc9b0aeb8e39 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h
@@ -4,7 +4,7 @@
*
* The FreeType TrueType/sfnt cmap extra information service.
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* Masatake YAMATO, Redhat K.K.,
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h
index 14967529a9ac..979e9ea102e2 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h
@@ -4,7 +4,7 @@
*
* The FreeType TrueType engine query service (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h
index f190b3985d02..e4f54c100377 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h
@@ -4,7 +4,7 @@
*
* The FreeType TrueType glyph service.
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* David Turner.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h
index 49f3fb7f775b..ff887ffdc038 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h
@@ -4,7 +4,7 @@
*
* The FreeType Windows FNT/FONT service (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h
index 35e4e73af02f..adba2178877e 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h
@@ -4,7 +4,7 @@
*
* High-level 'sfnt' driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -612,7 +612,7 @@ FT_BEGIN_HEADER
*
* @return:
* Value~1 if a ClipBox is found. If no clip box is found or an
- * error occured, value~0 is returned.
+ * error occurred, value~0 is returned.
*/
typedef FT_Bool
( *TT_Get_Color_Glyph_ClipBox_Func )( TT_Face face,
@@ -707,7 +707,7 @@ FT_BEGIN_HEADER
*
* @return:
* Value~1 if everything is OK. Value~0 if no details can be found for
- * this paint or any other error occured.
+ * this paint or any other error occurred.
*/
typedef FT_Bool
( *TT_Get_Paint_Func )( TT_Face face,
@@ -808,7 +808,7 @@ FT_BEGIN_HEADER
* corresponding (1,0) Apple entry.
*
* @return:
- * 1 if there is either a win or apple entry (or both), 0 otheriwse.
+ * 1 if there is either a win or apple entry (or both), 0 otherwise.
*/
typedef FT_Bool
(*TT_Get_Name_ID_Func)( TT_Face face,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h
index 68c99efb10ab..20c73b2fbd2f 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h
@@ -4,7 +4,7 @@
*
* Interface of ot-svg module (specification only).
*
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h
index 1821ae5cc839..5b26e4620d0c 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h
@@ -5,7 +5,7 @@
* Basic Type1/Type2 type definitions and interface (specification
* only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h
index 7053e656a7e5..d0e5eee89bc4 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h
@@ -5,7 +5,7 @@
* Basic SFNT/TrueType type definitions and interface (specification
* only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -930,8 +930,8 @@ FT_BEGIN_HEADER
* resolution and scaling independent parts of a TrueType font resource.
*
* @note:
- * The TT_Face structure is also used as a 'parent class' for the
- * OpenType-CFF class (T2_Face).
+ * The TT_Face structure is also used for CFF support; see file
+ * `cffotypes.h`.
*/
typedef struct TT_FaceRec_* TT_Face;
@@ -1276,10 +1276,6 @@ FT_BEGIN_HEADER
*
* If varied by the `CVAR' table, non-integer values are possible.
*
- * interpreter ::
- * A pointer to the TrueType bytecode interpreters field is also used
- * to hook the debugger in 'ttdebug'.
- *
* extra ::
* Reserved for third-party font drivers.
*
@@ -1521,10 +1517,6 @@ FT_BEGIN_HEADER
FT_ULong cvt_size;
FT_Int32* cvt;
- /* A pointer to the bytecode interpreter to use. This is also */
- /* used to hook the debugger for the `ttdebug' utility. */
- TT_Interpreter interpreter;
-
/************************************************************************
*
@@ -1582,11 +1574,6 @@ FT_BEGIN_HEADER
FT_UInt32 kern_avail_bits;
FT_UInt32 kern_order_bits;
-#ifdef TT_CONFIG_OPTION_GPOS_KERNING
- FT_Byte* gpos_table;
- FT_Bool gpos_kerning_available;
-#endif
-
#ifdef TT_CONFIG_OPTION_BDF
TT_BDFRec bdf;
#endif /* TT_CONFIG_OPTION_BDF */
@@ -1608,6 +1595,15 @@ FT_BEGIN_HEADER
/* since 2.12 */
void* svg;
+#ifdef TT_CONFIG_OPTION_GPOS_KERNING
+ /* since 2.13.3 */
+ FT_Byte* gpos_table;
+ /* since 2.14 */
+ /* This is actually an array of GPOS lookup subtables. */
+ FT_UInt32* gpos_lookups_kerning;
+ FT_UInt num_gpos_lookups_kerning;
+#endif
+
} TT_FaceRec;
@@ -1621,15 +1617,6 @@ FT_BEGIN_HEADER
* coordinates.
*
* @fields:
- * memory ::
- * A handle to the memory manager.
- *
- * max_points ::
- * The maximum size in points of the zone.
- *
- * max_contours ::
- * Max size in links contours of the zone.
- *
* n_points ::
* The current number of points in the zone.
*
@@ -1653,9 +1640,6 @@ FT_BEGIN_HEADER
*/
typedef struct TT_GlyphZoneRec_
{
- FT_Memory memory;
- FT_UShort max_points;
- FT_UShort max_contours;
FT_UShort n_points; /* number of points in zone */
FT_UShort n_contours; /* number of contours */
@@ -1714,7 +1698,6 @@ FT_BEGIN_HEADER
TT_GlyphZoneRec zone;
TT_ExecContext exec;
- FT_Byte* instructions;
FT_ULong ins_pos;
/* for possible extensibility in other formats */
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h b/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h
index 4a169d12f57e..7d5b7df0fa19 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h
@@ -5,7 +5,7 @@
* Basic WOFF/WOFF2 type definitions and interface (specification
* only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h b/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h
index 9d356938cc70..326bbcd01534 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h
@@ -4,7 +4,7 @@
*
* Interface for OT-SVG support related things (specification).
*
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h b/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h
index fbd558aa34d0..fe769f607faa 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h
@@ -5,7 +5,7 @@
* Basic Type 1/Type 2 tables definitions and interface (specification
* only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -92,7 +92,7 @@ FT_BEGIN_HEADER
FT_String* full_name;
FT_String* family_name;
FT_String* weight;
- FT_Long italic_angle;
+ FT_Fixed italic_angle;
FT_Bool is_fixed_pitch;
FT_Short underline_position;
FT_UShort underline_thickness;
@@ -645,7 +645,7 @@ FT_BEGIN_HEADER
PS_DICT_UNDERLINE_POSITION, /* FT_Short */
PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */
PS_DICT_FS_TYPE, /* FT_UShort */
- PS_DICT_ITALIC_ANGLE, /* FT_Long */
+ PS_DICT_ITALIC_ANGLE, /* FT_Fixed */
PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h b/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h
index d5d470e380f4..3ef61091cc96 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h
@@ -4,7 +4,7 @@
*
* TrueType name ID definitions (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -436,7 +436,7 @@ FT_BEGIN_HEADER
*
* The canonical source for Microsoft's IDs is
*
- * https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings ,
+ * https://learn.microsoft.com/windows/win32/intl/language-identifier-constants-and-strings ,
*
* however, we only provide macros for language identifiers present in
* the OpenType specification: Microsoft has abandoned the concept of
@@ -847,113 +847,113 @@ FT_BEGIN_HEADER
/* --------------- */
/* Bit 0 Basic Latin */
-#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */
+#define TT_UCR_BASIC_LATIN (1UL << 0) /* U+0020-U+007E */
/* Bit 1 C1 Controls and Latin-1 Supplement */
-#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */
+#define TT_UCR_LATIN1_SUPPLEMENT (1UL << 1) /* U+0080-U+00FF */
/* Bit 2 Latin Extended-A */
-#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */
+#define TT_UCR_LATIN_EXTENDED_A (1UL << 2) /* U+0100-U+017F */
/* Bit 3 Latin Extended-B */
-#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */
+#define TT_UCR_LATIN_EXTENDED_B (1UL << 3) /* U+0180-U+024F */
/* Bit 4 IPA Extensions */
/* Phonetic Extensions */
/* Phonetic Extensions Supplement */
-#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */
+#define TT_UCR_IPA_EXTENSIONS (1UL << 4) /* U+0250-U+02AF */
/* U+1D00-U+1D7F */
/* U+1D80-U+1DBF */
/* Bit 5 Spacing Modifier Letters */
/* Modifier Tone Letters */
-#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */
+#define TT_UCR_SPACING_MODIFIER (1UL << 5) /* U+02B0-U+02FF */
/* U+A700-U+A71F */
/* Bit 6 Combining Diacritical Marks */
/* Combining Diacritical Marks Supplement */
-#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1UL << 6) /* U+0300-U+036F */
/* U+1DC0-U+1DFF */
/* Bit 7 Greek and Coptic */
-#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */
+#define TT_UCR_GREEK (1UL << 7) /* U+0370-U+03FF */
/* Bit 8 Coptic */
-#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */
+#define TT_UCR_COPTIC (1UL << 8) /* U+2C80-U+2CFF */
/* Bit 9 Cyrillic */
/* Cyrillic Supplement */
/* Cyrillic Extended-A */
/* Cyrillic Extended-B */
-#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */
+#define TT_UCR_CYRILLIC (1UL << 9) /* U+0400-U+04FF */
/* U+0500-U+052F */
/* U+2DE0-U+2DFF */
/* U+A640-U+A69F */
/* Bit 10 Armenian */
-#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */
+#define TT_UCR_ARMENIAN (1UL << 10) /* U+0530-U+058F */
/* Bit 11 Hebrew */
-#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */
+#define TT_UCR_HEBREW (1UL << 11) /* U+0590-U+05FF */
/* Bit 12 Vai */
-#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */
+#define TT_UCR_VAI (1UL << 12) /* U+A500-U+A63F */
/* Bit 13 Arabic */
/* Arabic Supplement */
-#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */
+#define TT_UCR_ARABIC (1UL << 13) /* U+0600-U+06FF */
/* U+0750-U+077F */
/* Bit 14 NKo */
-#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */
+#define TT_UCR_NKO (1UL << 14) /* U+07C0-U+07FF */
/* Bit 15 Devanagari */
-#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */
- /* Bit 16 Bengali */
-#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */
+#define TT_UCR_DEVANAGARI (1UL << 15) /* U+0900-U+097F */
+ /* Bit 16 Bangla (Bengali) */
+#define TT_UCR_BENGALI (1UL << 16) /* U+0980-U+09FF */
/* Bit 17 Gurmukhi */
-#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */
+#define TT_UCR_GURMUKHI (1UL << 17) /* U+0A00-U+0A7F */
/* Bit 18 Gujarati */
-#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */
- /* Bit 19 Oriya */
-#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */
+#define TT_UCR_GUJARATI (1UL << 18) /* U+0A80-U+0AFF */
+ /* Bit 19 Oriya (Odia) */
+#define TT_UCR_ORIYA (1UL << 19) /* U+0B00-U+0B7F */
/* Bit 20 Tamil */
-#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */
+#define TT_UCR_TAMIL (1UL << 20) /* U+0B80-U+0BFF */
/* Bit 21 Telugu */
-#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */
+#define TT_UCR_TELUGU (1UL << 21) /* U+0C00-U+0C7F */
/* Bit 22 Kannada */
-#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */
+#define TT_UCR_KANNADA (1UL << 22) /* U+0C80-U+0CFF */
/* Bit 23 Malayalam */
-#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */
+#define TT_UCR_MALAYALAM (1UL << 23) /* U+0D00-U+0D7F */
/* Bit 24 Thai */
-#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */
+#define TT_UCR_THAI (1UL << 24) /* U+0E00-U+0E7F */
/* Bit 25 Lao */
-#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */
+#define TT_UCR_LAO (1UL << 25) /* U+0E80-U+0EFF */
/* Bit 26 Georgian */
/* Georgian Supplement */
-#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */
+#define TT_UCR_GEORGIAN (1UL << 26) /* U+10A0-U+10FF */
/* U+2D00-U+2D2F */
/* Bit 27 Balinese */
-#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */
+#define TT_UCR_BALINESE (1UL << 27) /* U+1B00-U+1B7F */
/* Bit 28 Hangul Jamo */
-#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */
+#define TT_UCR_HANGUL_JAMO (1UL << 28) /* U+1100-U+11FF */
/* Bit 29 Latin Extended Additional */
/* Latin Extended-C */
/* Latin Extended-D */
-#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1UL << 29) /* U+1E00-U+1EFF */
/* U+2C60-U+2C7F */
/* U+A720-U+A7FF */
/* Bit 30 Greek Extended */
-#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */
+#define TT_UCR_GREEK_EXTENDED (1UL << 30) /* U+1F00-U+1FFF */
/* Bit 31 General Punctuation */
/* Supplemental Punctuation */
-#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */
+#define TT_UCR_GENERAL_PUNCTUATION (1UL << 31) /* U+2000-U+206F */
/* U+2E00-U+2E7F */
/* ulUnicodeRange2 */
/* --------------- */
/* Bit 32 Superscripts And Subscripts */
-#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1UL << 0) /* U+2070-U+209F */
/* Bit 33 Currency Symbols */
-#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */
+#define TT_UCR_CURRENCY_SYMBOLS (1UL << 1) /* U+20A0-U+20CF */
/* Bit 34 Combining Diacritical Marks For Symbols */
#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
- (1L << 2) /* U+20D0-U+20FF */
+ (1UL << 2) /* U+20D0-U+20FF */
/* Bit 35 Letterlike Symbols */
-#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */
+#define TT_UCR_LETTERLIKE_SYMBOLS (1UL << 3) /* U+2100-U+214F */
/* Bit 36 Number Forms */
-#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */
+#define TT_UCR_NUMBER_FORMS (1UL << 4) /* U+2150-U+218F */
/* Bit 37 Arrows */
/* Supplemental Arrows-A */
/* Supplemental Arrows-B */
/* Miscellaneous Symbols and Arrows */
-#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */
+#define TT_UCR_ARROWS (1UL << 5) /* U+2190-U+21FF */
/* U+27F0-U+27FF */
/* U+2900-U+297F */
/* U+2B00-U+2BFF */
@@ -961,52 +961,52 @@ FT_BEGIN_HEADER
/* Supplemental Mathematical Operators */
/* Miscellaneous Mathematical Symbols-A */
/* Miscellaneous Mathematical Symbols-B */
-#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */
+#define TT_UCR_MATHEMATICAL_OPERATORS (1UL << 6) /* U+2200-U+22FF */
/* U+2A00-U+2AFF */
/* U+27C0-U+27EF */
/* U+2980-U+29FF */
/* Bit 39 Miscellaneous Technical */
-#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL (1UL << 7) /* U+2300-U+23FF */
/* Bit 40 Control Pictures */
-#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */
+#define TT_UCR_CONTROL_PICTURES (1UL << 8) /* U+2400-U+243F */
/* Bit 41 Optical Character Recognition */
-#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */
+#define TT_UCR_OCR (1UL << 9) /* U+2440-U+245F */
/* Bit 42 Enclosed Alphanumerics */
-#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS (1UL << 10) /* U+2460-U+24FF */
/* Bit 43 Box Drawing */
-#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */
+#define TT_UCR_BOX_DRAWING (1UL << 11) /* U+2500-U+257F */
/* Bit 44 Block Elements */
-#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */
+#define TT_UCR_BLOCK_ELEMENTS (1UL << 12) /* U+2580-U+259F */
/* Bit 45 Geometric Shapes */
-#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */
+#define TT_UCR_GEOMETRIC_SHAPES (1UL << 13) /* U+25A0-U+25FF */
/* Bit 46 Miscellaneous Symbols */
-#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS (1UL << 14) /* U+2600-U+26FF */
/* Bit 47 Dingbats */
-#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */
+#define TT_UCR_DINGBATS (1UL << 15) /* U+2700-U+27BF */
/* Bit 48 CJK Symbols and Punctuation */
-#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */
+#define TT_UCR_CJK_SYMBOLS (1UL << 16) /* U+3000-U+303F */
/* Bit 49 Hiragana */
-#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */
+#define TT_UCR_HIRAGANA (1UL << 17) /* U+3040-U+309F */
/* Bit 50 Katakana */
/* Katakana Phonetic Extensions */
-#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */
+#define TT_UCR_KATAKANA (1UL << 18) /* U+30A0-U+30FF */
/* U+31F0-U+31FF */
/* Bit 51 Bopomofo */
/* Bopomofo Extended */
-#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */
+#define TT_UCR_BOPOMOFO (1UL << 19) /* U+3100-U+312F */
/* U+31A0-U+31BF */
/* Bit 52 Hangul Compatibility Jamo */
-#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1UL << 20) /* U+3130-U+318F */
/* Bit 53 Phags-Pa */
-#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */
-#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */
-#define TT_UCR_PHAGSPA
+#define TT_UCR_PHAGSPA (1UL << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN TT_UCR_PHAGSPA /* deprecated */
+#define TT_UCR_CJK_MISC TT_UCR_PHAGSPA /* deprecated */
/* Bit 54 Enclosed CJK Letters and Months */
-#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1UL << 22) /* U+3200-U+32FF */
/* Bit 55 CJK Compatibility */
-#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */
+#define TT_UCR_CJK_COMPATIBILITY (1UL << 23) /* U+3300-U+33FF */
/* Bit 56 Hangul Syllables */
-#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */
+#define TT_UCR_HANGUL (1UL << 24) /* U+AC00-U+D7A3 */
/* Bit 57 High Surrogates */
/* High Private Use Surrogates */
/* Low Surrogates */
@@ -1017,12 +1017,12 @@ FT_BEGIN_HEADER
/* Basic Multilingual Plane that is */
/* supported by this font. So it really */
/* means >= U+10000. */
-#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */
+#define TT_UCR_SURROGATES (1UL << 25) /* U+D800-U+DB7F */
/* U+DB80-U+DBFF */
/* U+DC00-U+DFFF */
#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES
/* Bit 58 Phoenician */
-#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/
+#define TT_UCR_PHOENICIAN (1UL << 26) /*U+10900-U+1091F*/
/* Bit 59 CJK Unified Ideographs */
/* CJK Radicals Supplement */
/* Kangxi Radicals */
@@ -1030,7 +1030,7 @@ FT_BEGIN_HEADER
/* CJK Unified Ideographs Extension A */
/* CJK Unified Ideographs Extension B */
/* Kanbun */
-#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1UL << 27) /* U+4E00-U+9FFF */
/* U+2E80-U+2EFF */
/* U+2F00-U+2FDF */
/* U+2FF0-U+2FFF */
@@ -1038,178 +1038,178 @@ FT_BEGIN_HEADER
/*U+20000-U+2A6DF*/
/* U+3190-U+319F */
/* Bit 60 Private Use */
-#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */
+#define TT_UCR_PRIVATE_USE (1UL << 28) /* U+E000-U+F8FF */
/* Bit 61 CJK Strokes */
/* CJK Compatibility Ideographs */
/* CJK Compatibility Ideographs Supplement */
-#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1UL << 29) /* U+31C0-U+31EF */
/* U+F900-U+FAFF */
/*U+2F800-U+2FA1F*/
/* Bit 62 Alphabetic Presentation Forms */
-#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1UL << 30) /* U+FB00-U+FB4F */
/* Bit 63 Arabic Presentation Forms-A */
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1UL << 31) /* U+FB50-U+FDFF */
/* ulUnicodeRange3 */
/* --------------- */
/* Bit 64 Combining Half Marks */
-#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */
+#define TT_UCR_COMBINING_HALF_MARKS (1UL << 0) /* U+FE20-U+FE2F */
/* Bit 65 Vertical forms */
/* CJK Compatibility Forms */
-#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS (1UL << 1) /* U+FE10-U+FE1F */
/* U+FE30-U+FE4F */
/* Bit 66 Small Form Variants */
-#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */
+#define TT_UCR_SMALL_FORM_VARIANTS (1UL << 2) /* U+FE50-U+FE6F */
/* Bit 67 Arabic Presentation Forms-B */
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1UL << 3) /* U+FE70-U+FEFF */
/* Bit 68 Halfwidth and Fullwidth Forms */
-#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1UL << 4) /* U+FF00-U+FFEF */
/* Bit 69 Specials */
-#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */
+#define TT_UCR_SPECIALS (1UL << 5) /* U+FFF0-U+FFFF */
/* Bit 70 Tibetan */
-#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */
+#define TT_UCR_TIBETAN (1UL << 6) /* U+0F00-U+0FFF */
/* Bit 71 Syriac */
-#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */
+#define TT_UCR_SYRIAC (1UL << 7) /* U+0700-U+074F */
/* Bit 72 Thaana */
-#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */
+#define TT_UCR_THAANA (1UL << 8) /* U+0780-U+07BF */
/* Bit 73 Sinhala */
-#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */
+#define TT_UCR_SINHALA (1UL << 9) /* U+0D80-U+0DFF */
/* Bit 74 Myanmar */
-#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */
+#define TT_UCR_MYANMAR (1UL << 10) /* U+1000-U+109F */
/* Bit 75 Ethiopic */
/* Ethiopic Supplement */
/* Ethiopic Extended */
-#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */
+#define TT_UCR_ETHIOPIC (1UL << 11) /* U+1200-U+137F */
/* U+1380-U+139F */
/* U+2D80-U+2DDF */
/* Bit 76 Cherokee */
-#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */
+#define TT_UCR_CHEROKEE (1UL << 12) /* U+13A0-U+13FF */
/* Bit 77 Unified Canadian Aboriginal Syllabics */
-#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1UL << 13) /* U+1400-U+167F */
/* Bit 78 Ogham */
-#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */
+#define TT_UCR_OGHAM (1UL << 14) /* U+1680-U+169F */
/* Bit 79 Runic */
-#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */
+#define TT_UCR_RUNIC (1UL << 15) /* U+16A0-U+16FF */
/* Bit 80 Khmer */
/* Khmer Symbols */
-#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */
+#define TT_UCR_KHMER (1UL << 16) /* U+1780-U+17FF */
/* U+19E0-U+19FF */
/* Bit 81 Mongolian */
-#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */
+#define TT_UCR_MONGOLIAN (1UL << 17) /* U+1800-U+18AF */
/* Bit 82 Braille Patterns */
-#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */
+#define TT_UCR_BRAILLE (1UL << 18) /* U+2800-U+28FF */
/* Bit 83 Yi Syllables */
/* Yi Radicals */
-#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */
+#define TT_UCR_YI (1UL << 19) /* U+A000-U+A48F */
/* U+A490-U+A4CF */
/* Bit 84 Tagalog */
/* Hanunoo */
/* Buhid */
/* Tagbanwa */
-#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */
+#define TT_UCR_PHILIPPINE (1UL << 20) /* U+1700-U+171F */
/* U+1720-U+173F */
/* U+1740-U+175F */
/* U+1760-U+177F */
/* Bit 85 Old Italic */
-#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/
+#define TT_UCR_OLD_ITALIC (1UL << 21) /*U+10300-U+1032F*/
/* Bit 86 Gothic */
-#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/
+#define TT_UCR_GOTHIC (1UL << 22) /*U+10330-U+1034F*/
/* Bit 87 Deseret */
-#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/
+#define TT_UCR_DESERET (1UL << 23) /*U+10400-U+1044F*/
/* Bit 88 Byzantine Musical Symbols */
/* Musical Symbols */
/* Ancient Greek Musical Notation */
-#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/
+#define TT_UCR_MUSICAL_SYMBOLS (1UL << 24) /*U+1D000-U+1D0FF*/
/*U+1D100-U+1D1FF*/
/*U+1D200-U+1D24F*/
/* Bit 89 Mathematical Alphanumeric Symbols */
-#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1UL << 25) /*U+1D400-U+1D7FF*/
/* Bit 90 Private Use (plane 15) */
/* Private Use (plane 16) */
-#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1UL << 26) /*U+F0000-U+FFFFD*/
/*U+100000-U+10FFFD*/
/* Bit 91 Variation Selectors */
/* Variation Selectors Supplement */
-#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */
+#define TT_UCR_VARIATION_SELECTORS (1UL << 27) /* U+FE00-U+FE0F */
/*U+E0100-U+E01EF*/
/* Bit 92 Tags */
-#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/
+#define TT_UCR_TAGS (1UL << 28) /*U+E0000-U+E007F*/
/* Bit 93 Limbu */
-#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */
+#define TT_UCR_LIMBU (1UL << 29) /* U+1900-U+194F */
/* Bit 94 Tai Le */
-#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */
+#define TT_UCR_TAI_LE (1UL << 30) /* U+1950-U+197F */
/* Bit 95 New Tai Lue */
-#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */
+#define TT_UCR_NEW_TAI_LUE (1UL << 31) /* U+1980-U+19DF */
/* ulUnicodeRange4 */
/* --------------- */
/* Bit 96 Buginese */
-#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */
+#define TT_UCR_BUGINESE (1UL << 0) /* U+1A00-U+1A1F */
/* Bit 97 Glagolitic */
-#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */
+#define TT_UCR_GLAGOLITIC (1UL << 1) /* U+2C00-U+2C5F */
/* Bit 98 Tifinagh */
-#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */
+#define TT_UCR_TIFINAGH (1UL << 2) /* U+2D30-U+2D7F */
/* Bit 99 Yijing Hexagram Symbols */
-#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */
+#define TT_UCR_YIJING (1UL << 3) /* U+4DC0-U+4DFF */
/* Bit 100 Syloti Nagri */
-#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */
+#define TT_UCR_SYLOTI_NAGRI (1UL << 4) /* U+A800-U+A82F */
/* Bit 101 Linear B Syllabary */
/* Linear B Ideograms */
/* Aegean Numbers */
-#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/
+#define TT_UCR_LINEAR_B (1UL << 5) /*U+10000-U+1007F*/
/*U+10080-U+100FF*/
/*U+10100-U+1013F*/
/* Bit 102 Ancient Greek Numbers */
-#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/
+#define TT_UCR_ANCIENT_GREEK_NUMBERS (1UL << 6) /*U+10140-U+1018F*/
/* Bit 103 Ugaritic */
-#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/
+#define TT_UCR_UGARITIC (1UL << 7) /*U+10380-U+1039F*/
/* Bit 104 Old Persian */
-#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/
+#define TT_UCR_OLD_PERSIAN (1UL << 8) /*U+103A0-U+103DF*/
/* Bit 105 Shavian */
-#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/
+#define TT_UCR_SHAVIAN (1UL << 9) /*U+10450-U+1047F*/
/* Bit 106 Osmanya */
-#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/
+#define TT_UCR_OSMANYA (1UL << 10) /*U+10480-U+104AF*/
/* Bit 107 Cypriot Syllabary */
-#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/
+#define TT_UCR_CYPRIOT_SYLLABARY (1UL << 11) /*U+10800-U+1083F*/
/* Bit 108 Kharoshthi */
-#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/
+#define TT_UCR_KHAROSHTHI (1UL << 12) /*U+10A00-U+10A5F*/
/* Bit 109 Tai Xuan Jing Symbols */
-#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/
+#define TT_UCR_TAI_XUAN_JING (1UL << 13) /*U+1D300-U+1D35F*/
/* Bit 110 Cuneiform */
/* Cuneiform Numbers and Punctuation */
-#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/
+#define TT_UCR_CUNEIFORM (1UL << 14) /*U+12000-U+123FF*/
/*U+12400-U+1247F*/
/* Bit 111 Counting Rod Numerals */
-#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/
+#define TT_UCR_COUNTING_ROD_NUMERALS (1UL << 15) /*U+1D360-U+1D37F*/
/* Bit 112 Sundanese */
-#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */
+#define TT_UCR_SUNDANESE (1UL << 16) /* U+1B80-U+1BBF */
/* Bit 113 Lepcha */
-#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */
+#define TT_UCR_LEPCHA (1UL << 17) /* U+1C00-U+1C4F */
/* Bit 114 Ol Chiki */
-#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */
+#define TT_UCR_OL_CHIKI (1UL << 18) /* U+1C50-U+1C7F */
/* Bit 115 Saurashtra */
-#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */
+#define TT_UCR_SAURASHTRA (1UL << 19) /* U+A880-U+A8DF */
/* Bit 116 Kayah Li */
-#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */
+#define TT_UCR_KAYAH_LI (1UL << 20) /* U+A900-U+A92F */
/* Bit 117 Rejang */
-#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */
+#define TT_UCR_REJANG (1UL << 21) /* U+A930-U+A95F */
/* Bit 118 Cham */
-#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */
+#define TT_UCR_CHAM (1UL << 22) /* U+AA00-U+AA5F */
/* Bit 119 Ancient Symbols */
-#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/
+#define TT_UCR_ANCIENT_SYMBOLS (1UL << 23) /*U+10190-U+101CF*/
/* Bit 120 Phaistos Disc */
-#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/
+#define TT_UCR_PHAISTOS_DISC (1UL << 24) /*U+101D0-U+101FF*/
/* Bit 121 Carian */
/* Lycian */
/* Lydian */
-#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/
+#define TT_UCR_OLD_ANATOLIAN (1UL << 25) /*U+102A0-U+102DF*/
/*U+10280-U+1029F*/
/*U+10920-U+1093F*/
/* Bit 122 Domino Tiles */
/* Mahjong Tiles */
-#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/
+#define TT_UCR_GAME_TILES (1UL << 26) /*U+1F030-U+1F09F*/
/*U+1F000-U+1F02F*/
/* Bit 123-127 Reserved for process-internal usage */
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h b/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h
index 2cf0ff1bc61e..aa4336435d93 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h
@@ -5,7 +5,7 @@
* Basic SFNT/TrueType tables definitions and interface
* (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -192,7 +192,7 @@ FT_BEGIN_HEADER
* A pointer into the 'hmtx' table.
*
* @note:
- * For an OpenType variation font, the values of the following fields can
+ * For OpenType Font Variations, the values of the following fields can
* change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
* the font contains an 'MVAR' table: `caret_Slope_Rise`,
* `caret_Slope_Run`, and `caret_Offset`.
@@ -310,7 +310,7 @@ FT_BEGIN_HEADER
* A pointer into the 'vmtx' table.
*
* @note:
- * For an OpenType variation font, the values of the following fields can
+ * For OpenType Font Variations, the values of the following fields can
* change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
* the font contains an 'MVAR' table: `Ascender`, `Descender`,
* `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`.
@@ -359,7 +359,7 @@ FT_BEGIN_HEADER
* table. In this case, the `version` field is always set to 0xFFFF.
*
* @note:
- * For an OpenType variation font, the values of the following fields can
+ * For OpenType Font Variations, the values of the following fields can
* change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
* the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`,
* `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`,
@@ -442,7 +442,7 @@ FT_BEGIN_HEADER
* them.
*
* @note:
- * For an OpenType variation font, the values of the following fields can
+ * For OpenType Font Variations, the values of the following fields can
* change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
* the font contains an 'MVAR' table: `underlinePosition` and
* `underlineThickness`.
@@ -705,6 +705,9 @@ FT_BEGIN_HEADER
* definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
* one with @FT_MAKE_TAG.
*
+ * [Since 2.14] Use value~1 if you want to access the table directory
+ * of the (currently selected) font.
+ *
* offset ::
* The starting offset in the table (or file if tag~==~0).
*
diff --git a/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h b/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h
index da0af5d3f235..56bb0a3ee5e8 100644
--- a/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h
+++ b/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h
@@ -4,7 +4,7 @@
*
* Tags for TrueType and OpenType tables (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/include/ft2build.h b/src/java.desktop/share/native/libfreetype/include/ft2build.h
index d3d7685039c4..3008aea7cf5a 100644
--- a/src/java.desktop/share/native/libfreetype/include/ft2build.h
+++ b/src/java.desktop/share/native/libfreetype/include/ft2build.h
@@ -4,7 +4,7 @@
*
* FreeType 2 build and setup macros.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c
new file mode 100644
index 000000000000..a1aa45914d07
--- /dev/null
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c
@@ -0,0 +1,1621 @@
+/****************************************************************************
+ *
+ * afadjust.c
+ *
+ * Auto-fitter routines to adjust components based on charcode (body).
+ *
+ * Copyright (C) 2023-2025 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * Written by Craig White .
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+#include "afadjust.h"
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+# include "afgsub.h"
+#endif
+
+#include
+#include
+#include
+#include
+
+#define AF_ADJUSTMENT_DATABASE_LENGTH \
+ ( sizeof ( adjustment_database ) / \
+ sizeof ( adjustment_database[0] ) )
+
+#undef FT_COMPONENT
+#define FT_COMPONENT afadjust
+
+
+ typedef struct AF_AdjustmentDatabaseEntry_
+ {
+ FT_UInt32 codepoint;
+ FT_UInt32 flags;
+
+ } AF_AdjustmentDatabaseEntry;
+
+
+ /*
+ All entries in this list must be sorted by ascending Unicode code
+ points. The table entries are 3 numbers consisting of:
+
+ - Unicode code point.
+ - The vertical adjustment type. This should be a combination of the
+ AF_ADJUST_XXX and AF_IGNORE_XXX macros.
+ */
+ static AF_AdjustmentDatabaseEntry adjustment_database[] =
+ {
+ /* C0 Controls and Basic Latin */
+ { 0x21, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ! */
+ { 0x51, AF_IGNORE_CAPITAL_BOTTOM } , /* Q */
+ { 0x3F, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ? */
+ { 0x69, AF_ADJUST_UP }, /* i */
+ { 0x6A, AF_ADJUST_UP }, /* j */
+#if 0
+ /* XXX TODO */
+ { 0x7E, AF_ADJUST_TILDE_TOP }, /* ~ */
+#endif
+
+ /* C1 Controls and Latin-1 Supplement */
+ { 0xA1, AF_ADJUST_UP }, /* ¡ */
+ { 0xA6, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ¦ */
+ { 0xAA, AF_ADJUST_UP }, /* ª */
+ { 0xBA, AF_ADJUST_UP }, /* º */
+ { 0xBF, AF_ADJUST_UP }, /* ¿ */
+
+ { 0xC0, AF_ADJUST_UP }, /* À */
+ { 0xC1, AF_ADJUST_UP }, /* Á */
+ { 0xC2, AF_ADJUST_UP }, /* Â */
+ { 0xC3, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ã */
+ { 0xC4, AF_ADJUST_UP }, /* Ä */
+ { 0xC5, AF_ADJUST_UP }, /* Å */
+ { 0xC7, AF_IGNORE_CAPITAL_BOTTOM }, /* Ç */
+ { 0xC8, AF_ADJUST_UP }, /* È */
+ { 0xC9, AF_ADJUST_UP }, /* É */
+ { 0xCA, AF_ADJUST_UP }, /* Ê */
+ { 0xCB, AF_ADJUST_UP }, /* Ë */
+ { 0xCC, AF_ADJUST_UP }, /* Ì */
+ { 0xCD, AF_ADJUST_UP }, /* Í */
+ { 0xCE, AF_ADJUST_UP }, /* Î */
+ { 0xCF, AF_ADJUST_UP }, /* Ï */
+
+ { 0xD1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ñ */
+ { 0xD2, AF_ADJUST_UP }, /* Ò */
+ { 0xD3, AF_ADJUST_UP }, /* Ó */
+ { 0xD4, AF_ADJUST_UP }, /* Ô */
+ { 0xD5, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Õ */
+ { 0xD6, AF_ADJUST_UP }, /* Ö */
+ { 0xD8, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ø */
+ { 0xD9, AF_ADJUST_UP }, /* Ù */
+ { 0xDA, AF_ADJUST_UP }, /* Ú */
+ { 0xDB, AF_ADJUST_UP }, /* Û */
+ { 0xDC, AF_ADJUST_UP }, /* Ü */
+ { 0xDD, AF_ADJUST_UP }, /* Ý */
+
+ { 0xE0, AF_ADJUST_UP }, /* à */
+ { 0xE1, AF_ADJUST_UP }, /* á */
+ { 0xE2, AF_ADJUST_UP }, /* â */
+ { 0xE3, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ã */
+ { 0xE4, AF_ADJUST_UP }, /* ä */
+ { 0xE5, AF_ADJUST_UP }, /* å */
+ { 0xE7, AF_IGNORE_SMALL_BOTTOM }, /* ç */
+ { 0xE8, AF_ADJUST_UP }, /* è */
+ { 0xE9, AF_ADJUST_UP }, /* é */
+ { 0xEA, AF_ADJUST_UP }, /* ê */
+ { 0xEB, AF_ADJUST_UP }, /* ë */
+ { 0xEC, AF_ADJUST_UP }, /* ì */
+ { 0xED, AF_ADJUST_UP }, /* í */
+ { 0xEE, AF_ADJUST_UP }, /* î */
+ { 0xEF, AF_ADJUST_UP }, /* ï */
+
+ { 0xF1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ñ */
+ { 0xF2, AF_ADJUST_UP }, /* ò */
+ { 0xF3, AF_ADJUST_UP }, /* ó */
+ { 0xF4, AF_ADJUST_UP }, /* ô */
+ { 0xF5, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* õ */
+ { 0xF6, AF_ADJUST_UP }, /* ö */
+ { 0xF8, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ø */
+ { 0xF9, AF_ADJUST_UP }, /* ù */
+ { 0xFA, AF_ADJUST_UP }, /* ú */
+ { 0xFB, AF_ADJUST_UP }, /* û */
+ { 0xFC, AF_ADJUST_UP }, /* ü */
+ { 0xFD, AF_ADJUST_UP }, /* ý */
+ { 0xFF, AF_ADJUST_UP }, /* ÿ */
+
+ /* Latin Extended-A */
+ { 0x100, AF_ADJUST_UP }, /* Ā */
+ { 0x101, AF_ADJUST_UP }, /* ā */
+ { 0x102, AF_ADJUST_UP }, /* Ă */
+ { 0x103, AF_ADJUST_UP }, /* ă */
+ { 0x104, AF_IGNORE_CAPITAL_BOTTOM }, /* Ą */
+ { 0x105, AF_IGNORE_SMALL_BOTTOM }, /* ą */
+ { 0x106, AF_ADJUST_UP }, /* Ć */
+ { 0x107, AF_ADJUST_UP }, /* ć */
+ { 0x108, AF_ADJUST_UP }, /* Ĉ */
+ { 0x109, AF_ADJUST_UP }, /* ĉ */
+ { 0x10A, AF_ADJUST_UP }, /* Ċ */
+ { 0x10B, AF_ADJUST_UP }, /* ċ */
+ { 0x10C, AF_ADJUST_UP }, /* Č */
+ { 0x10D, AF_ADJUST_UP }, /* č */
+ { 0x10E, AF_ADJUST_UP }, /* Ď */
+
+ { 0x112, AF_ADJUST_UP }, /* Ē */
+ { 0x113, AF_ADJUST_UP }, /* ē */
+ { 0x114, AF_ADJUST_UP }, /* Ĕ */
+ { 0x115, AF_ADJUST_UP }, /* ĕ */
+ { 0x116, AF_ADJUST_UP }, /* Ė */
+ { 0x117, AF_ADJUST_UP }, /* ė */
+ { 0x118, AF_IGNORE_CAPITAL_BOTTOM }, /* Ę */
+ { 0x119, AF_IGNORE_SMALL_BOTTOM }, /* ę */
+ { 0x11A, AF_ADJUST_UP }, /* Ě */
+ { 0x11B, AF_ADJUST_UP }, /* ě */
+ { 0x11C, AF_ADJUST_UP }, /* Ĝ */
+ { 0x11D, AF_ADJUST_UP }, /* ĝ */
+ { 0x11E, AF_ADJUST_UP }, /* Ğ */
+ { 0x11F, AF_ADJUST_UP }, /* ğ */
+
+ { 0x120, AF_ADJUST_UP }, /* Ġ */
+ { 0x121, AF_ADJUST_UP }, /* ġ */
+ { 0x122, AF_ADJUST_DOWN }, /* Ģ */
+ { 0x123, AF_ADJUST_UP }, /* ģ */
+ { 0x124, AF_ADJUST_UP }, /* Ĥ */
+ { 0x125, AF_ADJUST_UP }, /* ĥ */
+ { 0x128, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ĩ */
+ { 0x129, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ĩ */
+ { 0x12A, AF_ADJUST_UP }, /* Ī */
+ { 0x12B, AF_ADJUST_UP }, /* ī */
+ { 0x12C, AF_ADJUST_UP }, /* Ĭ */
+ { 0x12D, AF_ADJUST_UP }, /* ĭ */
+ { 0x12E, AF_IGNORE_CAPITAL_BOTTOM }, /* Į */
+ { 0x12F, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* į */
+
+ { 0x130, AF_ADJUST_UP }, /* İ */
+ { 0x133, AF_ADJUST_UP }, /* ij */
+ { 0x134, AF_ADJUST_UP }, /* Ĵ */
+ { 0x135, AF_ADJUST_UP }, /* ĵ */
+ { 0x136, AF_ADJUST_DOWN }, /* Ķ */
+ { 0x137, AF_ADJUST_DOWN }, /* ķ */
+ { 0x139, AF_ADJUST_UP }, /* Ĺ */
+ { 0x13A, AF_ADJUST_UP }, /* ĺ */
+ { 0x13B, AF_ADJUST_DOWN }, /* Ļ */
+ { 0x13C, AF_ADJUST_DOWN }, /* ļ */
+
+ { 0x143, AF_ADJUST_UP }, /* Ń */
+ { 0x144, AF_ADJUST_UP }, /* ń */
+ { 0x145, AF_ADJUST_DOWN }, /* Ņ */
+ { 0x146, AF_ADJUST_DOWN }, /* ņ */
+ { 0x147, AF_ADJUST_UP }, /* Ň */
+ { 0x148, AF_ADJUST_UP }, /* ň */
+ { 0x14C, AF_ADJUST_UP }, /* Ō */
+ { 0x14D, AF_ADJUST_UP }, /* ō */
+ { 0x14E, AF_ADJUST_UP }, /* Ŏ */
+ { 0x14F, AF_ADJUST_UP }, /* ŏ */
+
+ { 0x150, AF_ADJUST_UP }, /* Ő */
+ { 0x151, AF_ADJUST_UP }, /* ő */
+ { 0x154, AF_ADJUST_UP }, /* Ŕ */
+ { 0x155, AF_ADJUST_UP }, /* ŕ */
+ { 0x156, AF_ADJUST_DOWN }, /* Ŗ */
+ { 0x157, AF_ADJUST_DOWN }, /* ŗ */
+ { 0x158, AF_ADJUST_UP }, /* Ř */
+ { 0x159, AF_ADJUST_UP }, /* ř */
+ { 0x15A, AF_ADJUST_UP }, /* Ś */
+ { 0x15B, AF_ADJUST_UP }, /* ś */
+ { 0x15C, AF_ADJUST_UP }, /* Ŝ */
+ { 0x15D, AF_ADJUST_UP }, /* ŝ */
+ { 0x15E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ş */
+ { 0x15F, AF_IGNORE_SMALL_BOTTOM }, /* ş */
+
+ { 0x160, AF_ADJUST_UP }, /* Š */
+ { 0x161, AF_ADJUST_UP }, /* š */
+ { 0x162, AF_IGNORE_CAPITAL_BOTTOM }, /* Ţ */
+ { 0x163, AF_IGNORE_SMALL_BOTTOM }, /* ţ */
+ { 0x164, AF_ADJUST_UP }, /* Ť */
+ { 0x168, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ũ */
+ { 0x169, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ũ */
+ { 0x16A, AF_ADJUST_UP }, /* Ū */
+ { 0x16B, AF_ADJUST_UP }, /* ū */
+ { 0x16C, AF_ADJUST_UP }, /* Ŭ */
+ { 0x16D, AF_ADJUST_UP }, /* ŭ */
+ { 0x16E, AF_ADJUST_UP }, /* Ů */
+ { 0x16F, AF_ADJUST_UP }, /* ů */
+
+ { 0x170, AF_ADJUST_UP }, /* Ű */
+ { 0x171, AF_ADJUST_UP }, /* ű */
+ { 0x172, AF_IGNORE_CAPITAL_BOTTOM }, /* Ų */
+ { 0x173, AF_IGNORE_SMALL_BOTTOM }, /* ų */
+ { 0x174, AF_ADJUST_UP }, /* Ŵ */
+ { 0x175, AF_ADJUST_UP }, /* ŵ */
+ { 0x176, AF_ADJUST_UP }, /* Ŷ */
+ { 0x177, AF_ADJUST_UP }, /* ŷ */
+ { 0x178, AF_ADJUST_UP }, /* Ÿ */
+ { 0x179, AF_ADJUST_UP }, /* Ź */
+ { 0x17A, AF_ADJUST_UP }, /* ź */
+ { 0x17B, AF_ADJUST_UP }, /* Ż */
+ { 0x17C, AF_ADJUST_UP }, /* ż */
+ { 0x17D, AF_ADJUST_UP }, /* Ž */
+ { 0x17E, AF_ADJUST_UP }, /* ž */
+
+ /* Latin Extended-B */
+ { 0x187, AF_IGNORE_CAPITAL_TOP }, /* Ƈ */
+ { 0x188, AF_IGNORE_SMALL_TOP }, /* ƈ */
+
+ { 0x1A0, AF_IGNORE_CAPITAL_TOP }, /* Ơ */
+ { 0x1A1, AF_IGNORE_SMALL_TOP }, /* ơ */
+ { 0x1A5, AF_IGNORE_SMALL_TOP }, /* ƥ */
+ { 0x1AB, AF_IGNORE_SMALL_BOTTOM }, /* ƫ */
+ { 0x1AE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ʈ */
+ { 0x1AF, AF_IGNORE_CAPITAL_TOP }, /* Ư */
+
+ { 0x1B0, AF_IGNORE_SMALL_TOP }, /* ư */
+ { 0x1B4, AF_IGNORE_SMALL_TOP }, /* ƴ */
+
+ { 0x1C3, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ǃ */
+ { 0x1C4, AF_ADJUST_UP }, /* DŽ */
+#if 0
+ { 0x1C5, AF_ADJUST_UP }, /* Dž */
+ { 0x1C6, AF_ADJUST_UP }, /* dž */
+ { 0x1C8, AF_ADJUST_UP }, /* Lj */
+ { 0x1C9, AF_ADJUST_UP }, /* lj */
+ { 0x1CB, AF_ADJUST_UP }, /* Nj */
+#endif
+ { 0x1CC, AF_ADJUST_UP }, /* nj */
+ { 0x1CD, AF_ADJUST_UP }, /* Ǎ */
+ { 0x1CE, AF_ADJUST_UP }, /* ǎ */
+ { 0x1CF, AF_ADJUST_UP }, /* Ǐ */
+
+ { 0x1D0, AF_ADJUST_UP }, /* ǐ */
+ { 0x1D1, AF_ADJUST_UP }, /* Ǒ */
+ { 0x1D2, AF_ADJUST_UP }, /* ǒ */
+ { 0x1D3, AF_ADJUST_UP }, /* Ǔ */
+ { 0x1D4, AF_ADJUST_UP }, /* ǔ */
+ { 0x1D5, AF_ADJUST_UP2 }, /* Ǖ */
+ { 0x1D6, AF_ADJUST_UP2 }, /* ǖ */
+ { 0x1D7, AF_ADJUST_UP2 }, /* Ǘ */
+ { 0x1D8, AF_ADJUST_UP2 }, /* ǘ */
+ { 0x1D9, AF_ADJUST_UP2 }, /* Ǚ */
+ { 0x1DA, AF_ADJUST_UP2 }, /* ǚ */
+ { 0x1DB, AF_ADJUST_UP2 }, /* Ǜ */
+ { 0x1DC, AF_ADJUST_UP2 }, /* ǜ */
+ { 0x1DE, AF_ADJUST_UP2 }, /* Ǟ */
+ { 0x1DF, AF_ADJUST_UP2 }, /* ǟ */
+
+ { 0x1E0, AF_ADJUST_UP2 }, /* Ǡ */
+ { 0x1E1, AF_ADJUST_UP2 }, /* ǡ */
+ { 0x1E2, AF_ADJUST_UP }, /* Ǣ */
+ { 0x1E3, AF_ADJUST_UP }, /* ǣ */
+ { 0x1E6, AF_ADJUST_UP }, /* Ǧ */
+ { 0x1E7, AF_ADJUST_UP }, /* ǧ */
+ { 0x1E8, AF_ADJUST_UP }, /* Ǩ */
+ { 0x1E9, AF_ADJUST_UP }, /* ǩ */
+ { 0x1EA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ǫ */
+ { 0x1EB, AF_IGNORE_SMALL_BOTTOM }, /* ǫ */
+ { 0x1EC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ǭ */
+ { 0x1ED, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ǭ */
+ { 0x1EE, AF_ADJUST_UP }, /* Ǯ */
+ { 0x1EF, AF_ADJUST_UP }, /* ǯ */
+
+ { 0x1F0, AF_ADJUST_UP }, /* ǰ */
+ { 0x1F4, AF_ADJUST_UP }, /* Ǵ */
+ { 0x1F5, AF_ADJUST_UP }, /* ǵ */
+ { 0x1F8, AF_ADJUST_UP }, /* Ǹ */
+ { 0x1F9, AF_ADJUST_UP }, /* ǹ */
+ { 0x1FA, AF_ADJUST_UP2 }, /* Ǻ */
+ { 0x1FB, AF_ADJUST_UP2 }, /* ǻ */
+ { 0x1FC, AF_ADJUST_UP }, /* Ǽ */
+ { 0x1FD, AF_ADJUST_UP }, /* ǽ */
+ { 0x1FE, AF_ADJUST_UP }, /* Ǿ */
+ { 0x1FF, AF_ADJUST_UP }, /* ǿ */
+
+ { 0x200, AF_ADJUST_UP }, /* Ȁ */
+ { 0x201, AF_ADJUST_UP }, /* ȁ */
+ { 0x202, AF_ADJUST_UP }, /* Ȃ */
+ { 0x203, AF_ADJUST_UP }, /* ȃ */
+ { 0x204, AF_ADJUST_UP }, /* Ȅ */
+ { 0x205, AF_ADJUST_UP }, /* ȅ */
+ { 0x206, AF_ADJUST_UP }, /* Ȇ */
+ { 0x207, AF_ADJUST_UP }, /* ȇ */
+ { 0x208, AF_ADJUST_UP }, /* Ȉ */
+ { 0x209, AF_ADJUST_UP }, /* ȉ */
+ { 0x20A, AF_ADJUST_UP }, /* Ȋ */
+ { 0x20B, AF_ADJUST_UP }, /* ȋ */
+ { 0x20C, AF_ADJUST_UP }, /* Ȍ */
+ { 0x20D, AF_ADJUST_UP }, /* ȍ */
+ { 0x20E, AF_ADJUST_UP }, /* Ȏ */
+ { 0x20F, AF_ADJUST_UP }, /* ȏ */
+
+ { 0x210, AF_ADJUST_UP }, /* Ȑ */
+ { 0x211, AF_ADJUST_UP }, /* ȑ */
+ { 0x212, AF_ADJUST_UP }, /* Ȓ */
+ { 0x213, AF_ADJUST_UP }, /* ȓ */
+ { 0x214, AF_ADJUST_UP }, /* Ȕ */
+ { 0x215, AF_ADJUST_UP }, /* ȕ */
+ { 0x216, AF_ADJUST_UP }, /* Ȗ */
+ { 0x217, AF_ADJUST_UP }, /* ȗ */
+ { 0x218, AF_ADJUST_DOWN }, /* Ș */
+ { 0x219, AF_ADJUST_DOWN }, /* ș */
+ { 0x21A, AF_ADJUST_DOWN }, /* Ț */
+ { 0x21B, AF_ADJUST_DOWN }, /* ț */
+ { 0x21E, AF_ADJUST_UP }, /* Ȟ */
+ { 0x21F, AF_ADJUST_UP }, /* ȟ */
+
+ { 0x224, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȥ */
+ { 0x225, AF_IGNORE_SMALL_BOTTOM }, /* ȥ */
+ { 0x226, AF_ADJUST_UP }, /* Ȧ */
+ { 0x227, AF_ADJUST_UP }, /* ȧ */
+ { 0x228, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȩ */
+ { 0x229, AF_IGNORE_SMALL_BOTTOM }, /* ȩ */
+ { 0x22A, AF_ADJUST_UP2 }, /* Ȫ */
+ { 0x22B, AF_ADJUST_UP2 }, /* ȫ */
+ { 0x22C, AF_ADJUST_UP2 }, /* Ȭ */
+ { 0x22D, AF_ADJUST_UP2 }, /* ȭ */
+ { 0x22E, AF_ADJUST_UP }, /* Ȯ */
+ { 0x22F, AF_ADJUST_UP }, /* ȯ */
+
+ { 0x230, AF_ADJUST_UP2 }, /* Ȱ */
+ { 0x231, AF_ADJUST_UP2 }, /* ȱ */
+ { 0x232, AF_ADJUST_UP }, /* Ȳ */
+ { 0x233, AF_ADJUST_UP }, /* ȳ */
+ { 0x23A, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ⱥ */
+ { 0x23B, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ȼ */
+ { 0x23F, AF_IGNORE_SMALL_BOTTOM }, /* ȿ */
+
+ { 0x240, AF_IGNORE_SMALL_BOTTOM }, /* ɀ */
+ { 0x249, AF_ADJUST_UP }, /* ɉ */
+
+ /* IPA Extensions */
+ { 0x256, AF_IGNORE_SMALL_BOTTOM }, /* ɖ */
+
+ { 0x260, AF_IGNORE_SMALL_TOP }, /* ɠ */
+ { 0x267, AF_IGNORE_SMALL_BOTTOM }, /* ɧ */
+ { 0x268, AF_ADJUST_UP }, /* ɨ */
+
+ { 0x272, AF_IGNORE_SMALL_BOTTOM }, /* ɲ */
+ { 0x273, AF_IGNORE_SMALL_BOTTOM }, /* ɳ */
+ { 0x27B, AF_IGNORE_SMALL_BOTTOM }, /* ɻ */
+ { 0x27D, AF_IGNORE_SMALL_BOTTOM }, /* ɽ */
+
+ { 0x282, AF_IGNORE_SMALL_BOTTOM }, /* ʂ */
+ { 0x288, AF_IGNORE_SMALL_BOTTOM }, /* ʈ */
+
+ { 0x290, AF_IGNORE_SMALL_BOTTOM }, /* ʐ */
+ { 0x29B, AF_IGNORE_SMALL_TOP }, /* ʛ */
+
+ { 0x2A0, AF_IGNORE_SMALL_TOP }, /* ʠ */
+
+ /* Spacing Modifier Letters */
+ { 0x2B2, AF_ADJUST_UP }, /* ʲ */
+ { 0x2B5, AF_IGNORE_SMALL_BOTTOM }, /* ʵ */
+
+ /* Greek and Coptic */
+ { 0x390, AF_ADJUST_UP2 }, /* ΐ */
+
+ { 0x3AA, AF_ADJUST_UP }, /* Ϊ */
+ { 0x3AB, AF_ADJUST_UP }, /* Ϋ */
+ { 0x3AC, AF_ADJUST_UP }, /* ά */
+ { 0x3AD, AF_ADJUST_UP }, /* έ */
+ { 0x3AE, AF_ADJUST_UP }, /* ή */
+ { 0x3AF, AF_ADJUST_UP }, /* ί */
+
+ { 0x3B0, AF_ADJUST_UP2 }, /* ΰ */
+
+ { 0x3CA, AF_ADJUST_UP }, /* ϊ */
+ { 0x3CB, AF_ADJUST_UP }, /* ϋ */
+ { 0x3CC, AF_ADJUST_UP }, /* ό */
+ { 0x3CD, AF_ADJUST_UP }, /* ύ */
+ { 0x3CE, AF_ADJUST_UP }, /* ώ */
+ { 0x3CF, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϗ */
+
+ { 0x3D4, AF_ADJUST_UP }, /* ϔ */
+ { 0x3D7, AF_IGNORE_SMALL_BOTTOM }, /* ϗ */
+ { 0x3D9, AF_IGNORE_SMALL_BOTTOM }, /* ϙ */
+
+ { 0x3E2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϣ */
+ { 0x3E3, AF_IGNORE_SMALL_BOTTOM }, /* ϣ */
+
+ { 0x3F3, AF_ADJUST_UP }, /* ϳ */
+
+ /* Cyrillic */
+ { 0x400, AF_ADJUST_UP }, /* Ѐ */
+ { 0x401, AF_ADJUST_UP }, /* Ё */
+ { 0x403, AF_ADJUST_UP }, /* Ѓ */
+ { 0x407, AF_ADJUST_UP }, /* Ї */
+ { 0x40C, AF_ADJUST_UP }, /* Ќ */
+ { 0x40D, AF_ADJUST_UP }, /* Ѝ */
+ { 0x40E, AF_ADJUST_UP }, /* Ў */
+ { 0x40F, AF_IGNORE_CAPITAL_BOTTOM }, /* Џ */
+
+ { 0x419, AF_ADJUST_UP }, /* Й */
+
+ { 0x426, AF_IGNORE_CAPITAL_BOTTOM }, /* Ц */
+ { 0x429, AF_IGNORE_CAPITAL_BOTTOM }, /* Щ */
+
+ { 0x439, AF_ADJUST_UP }, /* й */
+
+ { 0x446, AF_IGNORE_SMALL_BOTTOM }, /* ц */
+ { 0x449, AF_IGNORE_SMALL_BOTTOM }, /* щ */
+
+ { 0x450, AF_ADJUST_UP }, /* ѐ */
+ { 0x451, AF_ADJUST_UP }, /* ё */
+ { 0x453, AF_ADJUST_UP }, /* ѓ */
+ { 0x456, AF_ADJUST_UP }, /* і */
+ { 0x457, AF_ADJUST_UP }, /* ї */
+ { 0x458, AF_ADJUST_UP }, /* ј */
+ { 0x45C, AF_ADJUST_UP }, /* ќ */
+ { 0x45D, AF_ADJUST_UP }, /* ѝ */
+ { 0x45E, AF_ADJUST_UP }, /* ў */
+ { 0x45F, AF_IGNORE_SMALL_BOTTOM }, /* џ */
+
+ { 0x476, AF_ADJUST_UP }, /* Ѷ */
+ { 0x477, AF_ADJUST_UP }, /* ѷ */
+ { 0x47C, AF_ADJUST_UP2 }, /* Ѽ */
+ { 0x47D, AF_ADJUST_UP2 }, /* ѽ */
+ { 0x47E, AF_ADJUST_UP }, /* Ѿ */
+ { 0x47F, AF_ADJUST_UP }, /* ѿ */
+
+ { 0x480, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҁ */
+ { 0x481, AF_IGNORE_SMALL_BOTTOM }, /* ҁ */
+ { 0x48A, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ҋ */
+ { 0x48B, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ҋ */
+
+ { 0x490, AF_IGNORE_CAPITAL_TOP }, /* Ґ */
+ { 0x491, AF_IGNORE_SMALL_TOP }, /* ґ */
+ { 0x496, AF_IGNORE_CAPITAL_BOTTOM }, /* Җ */
+ { 0x497, AF_IGNORE_SMALL_BOTTOM }, /* җ */
+ { 0x498, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҙ */
+ { 0x499, AF_IGNORE_SMALL_BOTTOM }, /* ҙ */
+ { 0x49A, AF_IGNORE_CAPITAL_BOTTOM }, /* Қ */
+ { 0x49B, AF_IGNORE_SMALL_BOTTOM }, /* қ */
+
+ { 0x4A2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ң */
+ { 0x4A3, AF_IGNORE_SMALL_BOTTOM }, /* ң */
+ { 0x4AA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҫ */
+ { 0x4AB, AF_IGNORE_SMALL_BOTTOM }, /* ҫ */
+ { 0x4AC, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҭ */
+ { 0x4AD, AF_IGNORE_SMALL_BOTTOM }, /* ҭ */
+
+ { 0x4B2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҳ */
+ { 0x4B3, AF_IGNORE_SMALL_BOTTOM }, /* ҳ */
+ { 0x4B4, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҵ */
+ { 0x4B5, AF_IGNORE_SMALL_BOTTOM }, /* ҵ */
+ { 0x4B6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҷ */
+ { 0x4B7, AF_IGNORE_SMALL_BOTTOM }, /* ҷ */
+ { 0x4BE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҿ */
+ { 0x4BF, AF_IGNORE_SMALL_BOTTOM }, /* ҿ */
+
+ { 0x4C1, AF_ADJUST_UP }, /* Ӂ */
+ { 0x4C2, AF_ADJUST_UP }, /* ӂ */
+ { 0x4C5, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӆ */
+ { 0x4C6, AF_IGNORE_SMALL_BOTTOM }, /* ӆ */
+ { 0x4C9, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӊ */
+ { 0x4CA, AF_IGNORE_SMALL_BOTTOM }, /* ӊ */
+ { 0x4CB, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӌ */
+ { 0x4CC, AF_IGNORE_SMALL_BOTTOM }, /* ӌ */
+ { 0x4CD, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӎ */
+ { 0x4CE, AF_IGNORE_SMALL_BOTTOM }, /* ӎ */
+
+ { 0x4D0, AF_ADJUST_UP }, /* Ӑ */
+ { 0x4D1, AF_ADJUST_UP }, /* ӑ */
+ { 0x4D2, AF_ADJUST_UP }, /* Ӓ */
+ { 0x4D3, AF_ADJUST_UP }, /* ӓ */
+ { 0x4D6, AF_ADJUST_UP }, /* Ӗ */
+ { 0x4D7, AF_ADJUST_UP }, /* ӗ */
+ { 0x4DA, AF_ADJUST_UP }, /* Ӛ */
+ { 0x4DB, AF_ADJUST_UP }, /* ӛ */
+ { 0x4DC, AF_ADJUST_UP }, /* Ӝ */
+ { 0x4DD, AF_ADJUST_UP }, /* ӝ */
+ { 0x4DE, AF_ADJUST_UP }, /* Ӟ */
+ { 0x4DF, AF_ADJUST_UP }, /* ӟ */
+
+ { 0x4E2, AF_ADJUST_UP }, /* Ӣ */
+ { 0x4E3, AF_ADJUST_UP }, /* ӣ */
+ { 0x4E4, AF_ADJUST_UP }, /* Ӥ */
+ { 0x4E5, AF_ADJUST_UP }, /* ӥ */
+ { 0x4E6, AF_ADJUST_UP }, /* Ӧ */
+ { 0x4E7, AF_ADJUST_UP }, /* ӧ */
+ { 0x4EA, AF_ADJUST_UP }, /* Ӫ */
+ { 0x4EB, AF_ADJUST_UP }, /* ӫ */
+ { 0x4EC, AF_ADJUST_UP }, /* Ӭ */
+ { 0x4ED, AF_ADJUST_UP }, /* ӭ */
+ { 0x4EE, AF_ADJUST_UP }, /* Ӯ */
+ { 0x4EF, AF_ADJUST_UP }, /* ӯ */
+
+ { 0x4F0, AF_ADJUST_UP }, /* Ӱ */
+ { 0x4F1, AF_ADJUST_UP }, /* ӱ */
+ { 0x4F2, AF_ADJUST_UP }, /* Ӳ */
+ { 0x4F3, AF_ADJUST_UP }, /* ӳ */
+ { 0x4F4, AF_ADJUST_UP }, /* Ӵ */
+ { 0x4F5, AF_ADJUST_UP }, /* ӵ */
+ { 0x4F6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӷ */
+ { 0x4F7, AF_IGNORE_SMALL_BOTTOM }, /* ӷ */
+ { 0x4F8, AF_ADJUST_UP }, /* Ӹ */
+ { 0x4F9, AF_ADJUST_UP }, /* ӹ */
+ { 0x4FA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӻ */
+ { 0x4FB, AF_IGNORE_SMALL_BOTTOM }, /* ӻ */
+
+ /* Cyrillic Supplement */
+ { 0x506, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԇ */
+ { 0x507, AF_IGNORE_SMALL_BOTTOM }, /* ԇ */
+
+ { 0x524, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԥ */
+ { 0x525, AF_IGNORE_SMALL_BOTTOM }, /* ԥ */
+ { 0x526, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԧ */
+ { 0x527, AF_IGNORE_SMALL_BOTTOM }, /* ԧ */
+ { 0x52E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԯ */
+ { 0x52F, AF_IGNORE_SMALL_BOTTOM }, /* ԯ */
+
+ /* Cherokee */
+ { 0x13A5, AF_ADJUST_UP }, /* Ꭵ */
+
+ /* Phonetic Extensions */
+ { 0x1D09, AF_ADJUST_DOWN }, /* ᴉ */
+
+ { 0x1D4E, AF_ADJUST_DOWN }, /* ᵎ */
+
+ { 0x1D51, AF_IGNORE_SMALL_BOTTOM }, /* ᵑ */
+
+ { 0x1D62, AF_ADJUST_UP }, /* ᵢ */
+
+ /* Phonetic Extensions Supplement */
+ { 0x1D80, AF_IGNORE_SMALL_BOTTOM }, /* ᶀ */
+ { 0x1D81, AF_IGNORE_SMALL_BOTTOM }, /* ᶁ */
+ { 0x1D82, AF_IGNORE_SMALL_BOTTOM }, /* ᶂ */
+ { 0x1D84, AF_IGNORE_SMALL_BOTTOM }, /* ᶄ */
+ { 0x1D85, AF_IGNORE_SMALL_BOTTOM }, /* ᶅ */
+ { 0x1D86, AF_IGNORE_SMALL_BOTTOM }, /* ᶆ */
+ { 0x1D87, AF_IGNORE_SMALL_BOTTOM }, /* ᶇ */
+ { 0x1D89, AF_IGNORE_SMALL_BOTTOM }, /* ᶉ */
+ { 0x1D8A, AF_IGNORE_SMALL_BOTTOM }, /* ᶊ */
+ { 0x1D8C, AF_IGNORE_SMALL_BOTTOM }, /* ᶌ */
+ { 0x1D8D, AF_IGNORE_SMALL_BOTTOM }, /* ᶍ */
+ { 0x1D8E, AF_IGNORE_SMALL_BOTTOM }, /* ᶎ */
+ { 0x1D8F, AF_IGNORE_SMALL_BOTTOM }, /* ᶏ */
+
+ { 0x1D90, AF_IGNORE_SMALL_BOTTOM }, /* ᶐ */
+ { 0x1D91, AF_IGNORE_SMALL_BOTTOM }, /* ᶑ */
+ { 0x1D92, AF_IGNORE_SMALL_BOTTOM }, /* ᶒ */
+ { 0x1D93, AF_IGNORE_SMALL_BOTTOM }, /* ᶓ */
+ { 0x1D94, AF_IGNORE_SMALL_BOTTOM }, /* ᶔ */
+ { 0x1D95, AF_IGNORE_SMALL_BOTTOM }, /* ᶕ */
+ { 0x1D96, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ᶖ */
+ { 0x1D97, AF_IGNORE_SMALL_BOTTOM }, /* ᶗ */
+ { 0x1D98, AF_IGNORE_SMALL_BOTTOM }, /* ᶘ */
+ { 0x1D99, AF_IGNORE_SMALL_BOTTOM }, /* ᶙ */
+ { 0x1D9A, AF_IGNORE_SMALL_BOTTOM }, /* ᶚ */
+
+ { 0x1DA4, AF_ADJUST_UP }, /* ᶤ */
+ { 0x1DA8, AF_ADJUST_UP }, /* ᶨ */
+ { 0x1DA9, AF_IGNORE_SMALL_BOTTOM }, /* ᶩ */
+ { 0x1DAA, AF_IGNORE_SMALL_BOTTOM }, /* ᶪ */
+ { 0x1DAC, AF_IGNORE_SMALL_BOTTOM }, /* ᶬ */
+ { 0x1DAE, AF_IGNORE_SMALL_BOTTOM }, /* ᶮ */
+ { 0x1DAF, AF_IGNORE_SMALL_BOTTOM }, /* ᶯ */
+
+ { 0x1DB3, AF_IGNORE_SMALL_BOTTOM }, /* ᶳ */
+ { 0x1DB5, AF_IGNORE_SMALL_BOTTOM }, /* ᶵ */
+ { 0x1DBC, AF_IGNORE_SMALL_BOTTOM }, /* ᶼ */
+
+ /* Latin Extended Additional */
+ { 0x1E00, AF_ADJUST_DOWN }, /* Ḁ */
+ { 0x1E01, AF_ADJUST_DOWN }, /* ḁ */
+ { 0x1E02, AF_ADJUST_UP }, /* Ḃ */
+ { 0x1E03, AF_ADJUST_UP }, /* ḃ */
+ { 0x1E04, AF_ADJUST_DOWN }, /* Ḅ */
+ { 0x1E05, AF_ADJUST_DOWN }, /* ḅ */
+ { 0x1E06, AF_ADJUST_DOWN }, /* Ḇ */
+ { 0x1E07, AF_ADJUST_DOWN }, /* ḇ */
+ { 0x1E08, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḉ */
+ { 0x1E09, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḉ */
+ { 0x1E0A, AF_ADJUST_UP }, /* Ḋ */
+ { 0x1E0B, AF_ADJUST_UP }, /* ḋ */
+ { 0x1E0C, AF_ADJUST_DOWN }, /* Ḍ */
+ { 0x1E0D, AF_ADJUST_DOWN }, /* ḍ */
+ { 0x1E0E, AF_ADJUST_DOWN }, /* Ḏ */
+ { 0x1E0F, AF_ADJUST_DOWN }, /* ḏ */
+
+ { 0x1E10, AF_ADJUST_DOWN }, /* Ḑ */
+ { 0x1E11, AF_ADJUST_DOWN }, /* ḑ */
+ { 0x1E12, AF_ADJUST_DOWN }, /* Ḓ */
+ { 0x1E13, AF_ADJUST_DOWN }, /* ḓ */
+ { 0x1E14, AF_ADJUST_UP2 }, /* Ḕ */
+ { 0x1E15, AF_ADJUST_UP2 }, /* ḕ */
+ { 0x1E16, AF_ADJUST_UP2 }, /* Ḗ */
+ { 0x1E17, AF_ADJUST_UP2 }, /* ḗ */
+ { 0x1E18, AF_ADJUST_DOWN }, /* Ḙ */
+ { 0x1E19, AF_ADJUST_DOWN }, /* ḙ */
+ { 0x1E1A, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḛ */
+ { 0x1E1B, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḛ */
+ { 0x1E1C, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḝ */
+ { 0x1E1D, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḝ */
+ { 0x1E1E, AF_ADJUST_UP }, /* Ḟ */
+ { 0x1E1F, AF_ADJUST_UP }, /* ḟ */
+
+ { 0x1E20, AF_ADJUST_UP }, /* Ḡ */
+ { 0x1E21, AF_ADJUST_UP }, /* ḡ */
+ { 0x1E22, AF_ADJUST_UP }, /* Ḣ */
+ { 0x1E23, AF_ADJUST_UP }, /* ḣ */
+ { 0x1E24, AF_ADJUST_DOWN }, /* Ḥ */
+ { 0x1E25, AF_ADJUST_DOWN }, /* ḥ */
+ { 0x1E26, AF_ADJUST_UP }, /* Ḧ */
+ { 0x1E27, AF_ADJUST_UP }, /* ḧ */
+ { 0x1E28, AF_IGNORE_CAPITAL_BOTTOM }, /* Ḩ */
+ { 0x1E29, AF_IGNORE_SMALL_BOTTOM }, /* ḩ */
+ { 0x1E2A, AF_ADJUST_DOWN }, /* Ḫ */
+ { 0x1E2B, AF_ADJUST_DOWN }, /* ḫ */
+ { 0x1E2C, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḭ */
+ { 0x1E2D, AF_ADJUST_UP | AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḭ */
+ { 0x1E2E, AF_ADJUST_UP2 }, /* Ḯ */
+ { 0x1E2F, AF_ADJUST_UP2 }, /* ḯ */
+
+ { 0x1E30, AF_ADJUST_UP }, /* Ḱ */
+ { 0x1E31, AF_ADJUST_UP }, /* ḱ */
+ { 0x1E32, AF_ADJUST_DOWN }, /* Ḳ */
+ { 0x1E33, AF_ADJUST_DOWN }, /* ḳ */
+ { 0x1E34, AF_ADJUST_DOWN }, /* Ḵ */
+ { 0x1E35, AF_ADJUST_DOWN }, /* ḵ */
+ { 0x1E36, AF_ADJUST_DOWN }, /* Ḷ */
+ { 0x1E37, AF_ADJUST_DOWN }, /* ḷ */
+ { 0x1E38, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ḹ */
+ { 0x1E39, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ḹ */
+ { 0x1E3A, AF_ADJUST_DOWN }, /* Ḻ */
+ { 0x1E3B, AF_ADJUST_DOWN }, /* ḻ */
+ { 0x1E3C, AF_ADJUST_DOWN }, /* Ḽ */
+ { 0x1E3D, AF_ADJUST_DOWN }, /* ḽ */
+ { 0x1E3E, AF_ADJUST_UP }, /* Ḿ */
+ { 0x1E3F, AF_ADJUST_UP }, /* ḿ */
+
+ { 0x1E40, AF_ADJUST_UP }, /* Ṁ */
+ { 0x1E41, AF_ADJUST_UP }, /* ṁ */
+ { 0x1E42, AF_ADJUST_DOWN }, /* Ṃ */
+ { 0x1E43, AF_ADJUST_DOWN }, /* ṃ */
+ { 0x1E44, AF_ADJUST_UP }, /* Ṅ */
+ { 0x1E45, AF_ADJUST_UP }, /* ṅ */
+ { 0x1E46, AF_ADJUST_DOWN }, /* Ṇ */
+ { 0x1E47, AF_ADJUST_DOWN }, /* ṇ */
+ { 0x1E48, AF_ADJUST_DOWN }, /* Ṉ */
+ { 0x1E49, AF_ADJUST_DOWN }, /* ṉ */
+ { 0x1E4A, AF_ADJUST_DOWN }, /* Ṋ */
+ { 0x1E4B, AF_ADJUST_DOWN }, /* ṋ */
+ { 0x1E4C, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṍ */
+ { 0x1E4D, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṍ */
+ { 0x1E4E, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṏ */
+ { 0x1E4F, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṏ */
+
+ { 0x1E50, AF_ADJUST_UP2 }, /* Ṑ */
+ { 0x1E51, AF_ADJUST_UP2 }, /* ṑ */
+ { 0x1E52, AF_ADJUST_UP2 }, /* Ṓ */
+ { 0x1E53, AF_ADJUST_UP2 }, /* ṓ */
+ { 0x1E54, AF_ADJUST_UP }, /* Ṕ */
+ { 0x1E55, AF_ADJUST_UP }, /* ṕ */
+ { 0x1E56, AF_ADJUST_UP }, /* Ṗ */
+ { 0x1E57, AF_ADJUST_UP }, /* ṗ */
+ { 0x1E58, AF_ADJUST_UP }, /* Ṙ */
+ { 0x1E59, AF_ADJUST_UP }, /* ṙ */
+ { 0x1E5A, AF_ADJUST_DOWN }, /* Ṛ */
+ { 0x1E5B, AF_ADJUST_DOWN }, /* ṛ */
+ { 0x1E5C, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṝ */
+ { 0x1E5D, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṝ */
+ { 0x1E5E, AF_ADJUST_DOWN }, /* Ṟ */
+ { 0x1E5F, AF_ADJUST_DOWN }, /* ṟ */
+
+ { 0x1E60, AF_ADJUST_UP }, /* Ṡ */
+ { 0x1E61, AF_ADJUST_UP }, /* ṡ */
+ { 0x1E62, AF_ADJUST_DOWN }, /* Ṣ */
+ { 0x1E63, AF_ADJUST_DOWN }, /* ṣ */
+ { 0x1E64, AF_ADJUST_UP }, /* Ṥ */
+ { 0x1E65, AF_ADJUST_UP }, /* ṥ */
+ { 0x1E66, AF_ADJUST_UP }, /* Ṧ */
+ { 0x1E67, AF_ADJUST_UP }, /* ṧ */
+ { 0x1E68, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṩ */
+ { 0x1E69, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṩ */
+ { 0x1E6A, AF_ADJUST_UP }, /* Ṫ */
+ { 0x1E6B, AF_ADJUST_UP }, /* ṫ */
+ { 0x1E6C, AF_ADJUST_DOWN }, /* Ṭ */
+ { 0x1E6D, AF_ADJUST_DOWN }, /* ṭ */
+ { 0x1E6E, AF_ADJUST_DOWN }, /* Ṯ */
+ { 0x1E6F, AF_ADJUST_DOWN }, /* ṯ */
+
+ { 0x1E70, AF_ADJUST_DOWN }, /* Ṱ */
+ { 0x1E71, AF_ADJUST_DOWN }, /* ṱ */
+ { 0x1E72, AF_ADJUST_DOWN }, /* Ṳ */
+ { 0x1E73, AF_ADJUST_DOWN }, /* ṳ */
+ { 0x1E74, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ṵ */
+ { 0x1E75, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ṵ */
+ { 0x1E76, AF_ADJUST_DOWN }, /* Ṷ */
+ { 0x1E77, AF_ADJUST_DOWN }, /* ṷ */
+ { 0x1E78, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṹ */
+ { 0x1E79, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṹ */
+ { 0x1E7A, AF_ADJUST_UP2 }, /* Ṻ */
+ { 0x1E7B, AF_ADJUST_UP2 }, /* ṻ */
+ { 0x1E7C, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ṽ */
+ { 0x1E7D, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ṽ */
+ { 0x1E7E, AF_ADJUST_DOWN }, /* Ṿ */
+ { 0x1E7F, AF_ADJUST_DOWN }, /* ṿ */
+
+ { 0x1E80, AF_ADJUST_UP }, /* Ẁ */
+ { 0x1E81, AF_ADJUST_UP }, /* ẁ */
+ { 0x1E82, AF_ADJUST_UP }, /* Ẃ */
+ { 0x1E83, AF_ADJUST_UP }, /* ẃ */
+ { 0x1E84, AF_ADJUST_UP }, /* Ẅ */
+ { 0x1E85, AF_ADJUST_UP }, /* ẅ */
+ { 0x1E86, AF_ADJUST_UP }, /* Ẇ */
+ { 0x1E87, AF_ADJUST_UP }, /* ẇ */
+ { 0x1E88, AF_ADJUST_DOWN }, /* Ẉ */
+ { 0x1E89, AF_ADJUST_DOWN }, /* ẉ */
+ { 0x1E8A, AF_ADJUST_UP }, /* Ẋ */
+ { 0x1E8B, AF_ADJUST_UP }, /* ẋ */
+ { 0x1E8C, AF_ADJUST_UP }, /* Ẍ */
+ { 0x1E8D, AF_ADJUST_UP }, /* ẍ */
+ { 0x1E8E, AF_ADJUST_UP }, /* Ẏ */
+ { 0x1E8F, AF_ADJUST_UP }, /* ẏ */
+
+ { 0x1E90, AF_ADJUST_UP }, /* Ẑ */
+ { 0x1E91, AF_ADJUST_UP }, /* ẑ */
+ { 0x1E92, AF_ADJUST_DOWN }, /* Ẓ */
+ { 0x1E93, AF_ADJUST_DOWN }, /* ẓ */
+ { 0x1E94, AF_ADJUST_DOWN }, /* Ẕ */
+ { 0x1E95, AF_ADJUST_DOWN }, /* ẕ */
+ { 0x1E96, AF_ADJUST_DOWN }, /* ẖ */
+ { 0x1E97, AF_ADJUST_UP }, /* ẗ */
+ { 0x1E98, AF_ADJUST_UP }, /* ẘ */
+ { 0x1E99, AF_ADJUST_UP }, /* ẙ */
+ { 0x1E9A, AF_ADJUST_UP }, /* ẚ */
+ { 0x1E9B, AF_ADJUST_UP }, /* ẛ */
+
+ { 0x1EA0, AF_ADJUST_DOWN }, /* Ạ */
+ { 0x1EA1, AF_ADJUST_DOWN }, /* ạ */
+ { 0x1EA2, AF_ADJUST_UP }, /* Ả */
+ { 0x1EA3, AF_ADJUST_UP }, /* ả */
+ { 0x1EA4, AF_ADJUST_UP2 }, /* Ấ */
+ { 0x1EA5, AF_ADJUST_UP2 }, /* ấ */
+ { 0x1EA6, AF_ADJUST_UP2 }, /* Ầ */
+ { 0x1EA7, AF_ADJUST_UP2 }, /* ầ */
+ { 0x1EA8, AF_ADJUST_UP2 }, /* Ẩ */
+ { 0x1EA9, AF_ADJUST_UP2 }, /* ẩ */
+ { 0x1EAA, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẫ */
+ { 0x1EAB, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẫ */
+ { 0x1EAC, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ậ */
+ { 0x1EAD, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ậ */
+ { 0x1EAE, AF_ADJUST_UP2 }, /* Ắ */
+ { 0x1EAF, AF_ADJUST_UP2 }, /* ắ */
+
+ { 0x1EB0, AF_ADJUST_UP2 }, /* Ằ */
+ { 0x1EB1, AF_ADJUST_UP2 }, /* ằ */
+ { 0x1EB2, AF_ADJUST_UP2 }, /* Ẳ */
+ { 0x1EB3, AF_ADJUST_UP2 }, /* ẳ */
+ { 0x1EB4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẵ */
+ { 0x1EB5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẵ */
+ { 0x1EB6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ặ */
+ { 0x1EB7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ặ */
+ { 0x1EB8, AF_ADJUST_DOWN }, /* Ẹ */
+ { 0x1EB9, AF_ADJUST_DOWN }, /* ẹ */
+ { 0x1EBA, AF_ADJUST_UP }, /* Ẻ */
+ { 0x1EBB, AF_ADJUST_UP }, /* ẻ */
+ { 0x1EBC, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ẽ */
+ { 0x1EBD, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ẽ */
+ { 0x1EBE, AF_ADJUST_UP2 }, /* Ế */
+ { 0x1EBF, AF_ADJUST_UP2 }, /* ế */
+
+ { 0x1EC0, AF_ADJUST_UP2 }, /* Ề */
+ { 0x1EC1, AF_ADJUST_UP2 }, /* ề */
+ { 0x1EC2, AF_ADJUST_UP2 }, /* Ể */
+ { 0x1EC3, AF_ADJUST_UP2 }, /* ể */
+ { 0x1EC4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ễ */
+ { 0x1EC5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ễ */
+ { 0x1EC6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ệ */
+ { 0x1EC7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ệ */
+ { 0x1EC8, AF_ADJUST_UP }, /* Ỉ */
+ { 0x1EC9, AF_ADJUST_UP }, /* ỉ */
+ { 0x1ECA, AF_ADJUST_DOWN }, /* Ị */
+ { 0x1ECB, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ị */
+ { 0x1ECC, AF_ADJUST_DOWN }, /* Ọ */
+ { 0x1ECD, AF_ADJUST_DOWN }, /* ọ */
+ { 0x1ECE, AF_ADJUST_UP }, /* Ỏ */
+ { 0x1ECF, AF_ADJUST_UP }, /* ỏ */
+
+ { 0x1ED0, AF_ADJUST_UP2 }, /* Ố */
+ { 0x1ED1, AF_ADJUST_UP2 }, /* ố */
+ { 0x1ED2, AF_ADJUST_UP2 }, /* Ồ */
+ { 0x1ED3, AF_ADJUST_UP2 }, /* ồ */
+ { 0x1ED4, AF_ADJUST_UP2 }, /* Ổ */
+ { 0x1ED5, AF_ADJUST_UP2 }, /* ổ */
+ { 0x1ED6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ỗ */
+ { 0x1ED7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ỗ */
+ { 0x1ED8, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ộ */
+ { 0x1ED9, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ộ */
+ { 0x1EDA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ớ */
+ { 0x1EDB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ớ */
+ { 0x1EDC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ờ */
+ { 0x1EDD, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ờ */
+ { 0x1EDE, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ở */
+ { 0x1EDF, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ở */
+
+ { 0x1EE0, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ỡ */
+ { 0x1EE1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ỡ */
+ { 0x1EE2, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ợ */
+ { 0x1EE3, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ợ */
+ { 0x1EE4, AF_ADJUST_DOWN }, /* Ụ */
+ { 0x1EE5, AF_ADJUST_DOWN }, /* ụ */
+ { 0x1EE6, AF_ADJUST_UP }, /* Ủ */
+ { 0x1EE7, AF_ADJUST_UP }, /* ủ */
+ { 0x1EE8, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ứ */
+ { 0x1EE9, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ứ */
+ { 0x1EEA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ừ */
+ { 0x1EEB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ừ */
+ { 0x1EEC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ử */
+ { 0x1EED, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ử */
+ { 0x1EEE, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ữ */
+ { 0x1EEF, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ữ */
+
+ { 0x1EF0, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ự */
+ { 0x1EF1, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ự */
+ { 0x1EF2, AF_ADJUST_UP }, /* Ỳ */
+ { 0x1EF3, AF_ADJUST_UP }, /* ỳ */
+ { 0x1EF4, AF_ADJUST_DOWN }, /* Ỵ */
+ { 0x1EF5, AF_ADJUST_DOWN }, /* ỵ */
+ { 0x1EF6, AF_ADJUST_UP }, /* Ỷ */
+ { 0x1EF7, AF_ADJUST_UP }, /* ỷ */
+ { 0x1EF8, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ỹ */
+ { 0x1EF9, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ỹ */
+
+ /* Greek Extended */
+ { 0x1F00, AF_ADJUST_UP }, /* ἀ */
+ { 0x1F01, AF_ADJUST_UP }, /* ἁ */
+ { 0x1F02, AF_ADJUST_UP }, /* ἂ */
+ { 0x1F03, AF_ADJUST_UP }, /* ἃ */
+ { 0x1F04, AF_ADJUST_UP }, /* ἄ */
+ { 0x1F05, AF_ADJUST_UP }, /* ἅ */
+ { 0x1F06, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἆ */
+ { 0x1F07, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἇ */
+
+ { 0x1F10, AF_ADJUST_UP }, /* ἐ */
+ { 0x1F11, AF_ADJUST_UP }, /* ἑ */
+ { 0x1F12, AF_ADJUST_UP }, /* ἒ */
+ { 0x1F13, AF_ADJUST_UP }, /* ἓ */
+ { 0x1F14, AF_ADJUST_UP }, /* ἔ */
+ { 0x1F15, AF_ADJUST_UP }, /* ἕ */
+
+ { 0x1F20, AF_ADJUST_UP }, /* ἠ */
+ { 0x1F21, AF_ADJUST_UP }, /* ἡ */
+ { 0x1F22, AF_ADJUST_UP }, /* ἢ */
+ { 0x1F23, AF_ADJUST_UP }, /* ἣ */
+ { 0x1F24, AF_ADJUST_UP }, /* ἤ */
+ { 0x1F25, AF_ADJUST_UP }, /* ἥ */
+ { 0x1F26, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἦ */
+ { 0x1F27, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἧ */
+
+ { 0x1F30, AF_ADJUST_UP }, /* ἰ */
+ { 0x1F31, AF_ADJUST_UP }, /* ἱ */
+ { 0x1F32, AF_ADJUST_UP }, /* ἲ */
+ { 0x1F33, AF_ADJUST_UP }, /* ἳ */
+ { 0x1F34, AF_ADJUST_UP }, /* ἴ */
+ { 0x1F35, AF_ADJUST_UP }, /* ἵ */
+ { 0x1F36, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἶ */
+ { 0x1F37, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἷ */
+
+ { 0x1F40, AF_ADJUST_UP }, /* ὀ */
+ { 0x1F41, AF_ADJUST_UP }, /* ὁ */
+ { 0x1F42, AF_ADJUST_UP }, /* ὂ */
+ { 0x1F43, AF_ADJUST_UP }, /* ὃ */
+ { 0x1F44, AF_ADJUST_UP }, /* ὄ */
+ { 0x1F45, AF_ADJUST_UP }, /* ὅ */
+
+ { 0x1F50, AF_ADJUST_UP }, /* ὐ */
+ { 0x1F51, AF_ADJUST_UP }, /* ὑ */
+ { 0x1F52, AF_ADJUST_UP }, /* ὒ */
+ { 0x1F53, AF_ADJUST_UP }, /* ὓ */
+ { 0x1F54, AF_ADJUST_UP }, /* ὔ */
+ { 0x1F55, AF_ADJUST_UP }, /* ὕ */
+ { 0x1F56, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὖ */
+ { 0x1F57, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὗ */
+
+ { 0x1F60, AF_ADJUST_UP }, /* ὠ */
+ { 0x1F61, AF_ADJUST_UP }, /* ὡ */
+ { 0x1F62, AF_ADJUST_UP }, /* ὢ */
+ { 0x1F63, AF_ADJUST_UP }, /* ὣ */
+ { 0x1F64, AF_ADJUST_UP }, /* ὤ */
+ { 0x1F65, AF_ADJUST_UP }, /* ὥ */
+ { 0x1F66, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὦ */
+ { 0x1F67, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὧ */
+
+ { 0x1F70, AF_ADJUST_UP }, /* ὰ */
+ { 0x1F71, AF_ADJUST_UP }, /* ά */
+ { 0x1F72, AF_ADJUST_UP }, /* ὲ */
+ { 0x1F73, AF_ADJUST_UP }, /* έ */
+ { 0x1F74, AF_ADJUST_UP }, /* ὴ */
+ { 0x1F75, AF_ADJUST_UP }, /* ή */
+ { 0x1F76, AF_ADJUST_UP }, /* ὶ */
+ { 0x1F77, AF_ADJUST_UP }, /* ί */
+ { 0x1F78, AF_ADJUST_UP }, /* ὸ */
+ { 0x1F79, AF_ADJUST_UP }, /* ό */
+ { 0x1F7A, AF_ADJUST_UP }, /* ὺ */
+ { 0x1F7B, AF_ADJUST_UP }, /* ύ */
+ { 0x1F7C, AF_ADJUST_UP }, /* ὼ */
+ { 0x1F7D, AF_ADJUST_UP }, /* ώ */
+
+ { 0x1F80, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾀ */
+ { 0x1F81, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾁ */
+ { 0x1F82, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾂ */
+ { 0x1F83, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾃ */
+ { 0x1F84, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾄ */
+ { 0x1F85, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾅ */
+ { 0x1F86, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾆ */
+ { 0x1F87, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾇ */
+ { 0x1F88, AF_ADJUST_DOWN }, /* ᾈ */
+ { 0x1F89, AF_ADJUST_DOWN }, /* ᾉ */
+ { 0x1F8A, AF_ADJUST_DOWN }, /* ᾊ */
+ { 0x1F8B, AF_ADJUST_DOWN }, /* ᾋ */
+ { 0x1F8C, AF_ADJUST_DOWN }, /* ᾌ */
+ { 0x1F8D, AF_ADJUST_DOWN }, /* ᾍ */
+ { 0x1F8E, AF_ADJUST_DOWN }, /* ᾎ */
+ { 0x1F8F, AF_ADJUST_DOWN }, /* ᾏ */
+
+ { 0x1F90, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾐ */
+ { 0x1F91, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾑ */
+ { 0x1F92, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾒ */
+ { 0x1F93, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾓ */
+ { 0x1F94, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾔ */
+ { 0x1F95, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾕ */
+ { 0x1F96, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾖ */
+ { 0x1F97, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾗ */
+ { 0x1F98, AF_ADJUST_DOWN }, /* ᾘ */
+ { 0x1F99, AF_ADJUST_DOWN }, /* ᾙ */
+ { 0x1F9A, AF_ADJUST_DOWN }, /* ᾚ */
+ { 0x1F9B, AF_ADJUST_DOWN }, /* ᾛ */
+ { 0x1F9C, AF_ADJUST_DOWN }, /* ᾜ */
+ { 0x1F9D, AF_ADJUST_DOWN }, /* ᾝ */
+ { 0x1F9E, AF_ADJUST_DOWN }, /* ᾞ */
+ { 0x1F9F, AF_ADJUST_DOWN }, /* ᾟ */
+
+ { 0x1FA0, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾠ */
+ { 0x1FA1, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾡ */
+ { 0x1FA2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾢ */
+ { 0x1FA3, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾣ */
+ { 0x1FA4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾤ */
+ { 0x1FA5, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾥ */
+ { 0x1FA6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾦ */
+ { 0x1FA7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾧ */
+ { 0x1FA8, AF_ADJUST_DOWN }, /* ᾨ */
+ { 0x1FA9, AF_ADJUST_DOWN }, /* ᾩ */
+ { 0x1FAA, AF_ADJUST_DOWN }, /* ᾪ */
+ { 0x1FAB, AF_ADJUST_DOWN }, /* ᾫ */
+ { 0x1FAC, AF_ADJUST_DOWN }, /* ᾬ */
+ { 0x1FAD, AF_ADJUST_DOWN }, /* ᾭ */
+ { 0x1FAE, AF_ADJUST_DOWN }, /* ᾮ */
+ { 0x1FAF, AF_ADJUST_DOWN }, /* ᾯ */
+
+ { 0x1FB0, AF_ADJUST_UP }, /* ᾰ */
+ { 0x1FB1, AF_ADJUST_UP }, /* ᾱ */
+ { 0x1FB2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾲ */
+ { 0x1FB3, AF_ADJUST_DOWN }, /* ᾳ */
+ { 0x1FB4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾴ */
+ { 0x1FB6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ᾶ */
+ { 0x1FB7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾷ */
+ { 0x1FB8, AF_ADJUST_UP }, /* Ᾰ */
+ { 0x1FB9, AF_ADJUST_UP }, /* Ᾱ */
+ { 0x1FBC, AF_ADJUST_DOWN }, /* ᾼ */
+
+ { 0x1FC2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῂ */
+ { 0x1FC3, AF_ADJUST_DOWN }, /* ῃ */
+ { 0x1FC4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῄ */
+ { 0x1FC6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῆ */
+ { 0x1FC7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῇ */
+ { 0x1FCC, AF_ADJUST_DOWN }, /* ῌ */
+
+ { 0x1FD0, AF_ADJUST_UP }, /* ῐ */
+ { 0x1FD1, AF_ADJUST_UP }, /* ῑ */
+ { 0x1FD2, AF_ADJUST_UP2 }, /* ῒ */
+ { 0x1FD3, AF_ADJUST_UP2 }, /* ΐ */
+ { 0x1FD6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῖ */
+ { 0x1FD7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῗ */
+ { 0x1FD8, AF_ADJUST_UP }, /* Ῐ */
+ { 0x1FD9, AF_ADJUST_UP }, /* Ῑ */
+
+ { 0x1FE0, AF_ADJUST_UP }, /* ῠ */
+ { 0x1FE1, AF_ADJUST_UP }, /* ῡ */
+ { 0x1FE2, AF_ADJUST_UP2 }, /* ῢ */
+ { 0x1FE3, AF_ADJUST_UP2 }, /* ΰ */
+ { 0x1FE4, AF_ADJUST_UP }, /* ῤ */
+ { 0x1FE5, AF_ADJUST_UP }, /* ῥ */
+ { 0x1FE6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῦ */
+ { 0x1FE7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῧ */
+ { 0x1FE8, AF_ADJUST_UP }, /* Ῠ */
+ { 0x1FE9, AF_ADJUST_UP }, /* Ῡ */
+ { 0x1FF2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῲ */
+ { 0x1FF3, AF_ADJUST_DOWN }, /* ῳ */
+ { 0x1FF4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῴ */
+ { 0x1FF6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῶ */
+ { 0x1FF7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῷ */
+ { 0x1FFC, AF_ADJUST_DOWN }, /* ῼ */
+
+ /* General Punctuation */
+ { 0x203C, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‼ */
+ { 0x203D, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‽ */
+
+ { 0x2047, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁇ */
+ { 0x2048, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁈ */
+ { 0x2049, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁉ */
+
+ /* Superscripts and Subscripts */
+ { 0x2071, AF_ADJUST_UP }, /* ⁱ */
+
+ /* Currency Symbols */
+ { 0x20AB, AF_ADJUST_DOWN }, /* ₫ */
+
+ { 0x20C0, AF_ADJUST_DOWN }, /* ⃀ */
+
+ /* Number Forms */
+ { 0x2170, AF_ADJUST_UP }, /* ⅰ */
+ { 0x2171, AF_ADJUST_UP }, /* ⅱ */
+ { 0x2172, AF_ADJUST_UP }, /* ⅲ */
+ { 0x2173, AF_ADJUST_UP }, /* ⅳ */
+ { 0x2175, AF_ADJUST_UP }, /* ⅵ */
+ { 0x2176, AF_ADJUST_UP }, /* ⅶ */
+ { 0x2177, AF_ADJUST_UP }, /* ⅷ */
+ { 0x2178, AF_ADJUST_UP }, /* ⅸ */
+ { 0x217A, AF_ADJUST_UP }, /* ⅺ */
+ { 0x217B, AF_ADJUST_UP }, /* ⅻ */
+
+ /* Latin Extended-C */
+ { 0x2C64, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɽ */
+ { 0x2C67, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱨ */
+ { 0x2C68, AF_IGNORE_SMALL_BOTTOM } , /* ⱨ */
+ { 0x2C69, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱪ */
+ { 0x2C6A, AF_IGNORE_SMALL_BOTTOM } , /* ⱪ */
+ { 0x2C6B, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱬ */
+ { 0x2C6C, AF_IGNORE_SMALL_BOTTOM } , /* ⱬ */
+ { 0x2C6E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɱ */
+
+ { 0x2C7C, AF_ADJUST_UP }, /* ⱼ */
+ { 0x2C7E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ȿ */
+ { 0x2C7F, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɀ */
+
+ /* Coptic */
+ { 0x2CC2, AF_ADJUST_UP }, /* Ⳃ */
+ { 0x2CC3, AF_ADJUST_UP }, /* ⳃ */
+
+ /* Supplemental Punctuation */
+ { 0x2E18, AF_ADJUST_UP }, /* ⸘ */
+
+ { 0x2E2E, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⸮ */
+
+ /* Cyrillic Extended-B */
+ { 0xA640, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙁ */
+ { 0xA641, AF_IGNORE_SMALL_BOTTOM } , /* ꙁ */
+ { 0xA642, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙃ */
+ { 0xA643, AF_IGNORE_SMALL_BOTTOM } , /* ꙃ */
+
+ { 0xA680, AF_IGNORE_CAPITAL_TOP } , /* Ꚁ */
+ { 0xA681, AF_IGNORE_SMALL_TOP } , /* ꚁ */
+ { 0xA688, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚉ */
+ { 0xA689, AF_IGNORE_SMALL_BOTTOM } , /* ꚉ */
+ { 0xA68A, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚋ */
+ { 0xA68B, AF_IGNORE_SMALL_BOTTOM } , /* ꚋ */
+ { 0xA68E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚏ */
+ { 0xA68F, AF_IGNORE_SMALL_BOTTOM } , /* ꚏ */
+
+ { 0xA690, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚑ */
+ { 0xA691, AF_IGNORE_SMALL_BOTTOM } , /* ꚑ */
+ { 0xA696, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚗ */
+ { 0xA697, AF_IGNORE_SMALL_BOTTOM } , /* ꚗ */
+
+ /* Latin Extended-D */
+ { 0xA726, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꜧ */
+ { 0xA727, AF_IGNORE_SMALL_BOTTOM } , /* ꜧ */
+
+ { 0xA756, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝗ */
+ { 0xA758, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝙ */
+
+ { 0xA771, AF_IGNORE_SMALL_BOTTOM } , /* ꝱ */
+ { 0xA772, AF_IGNORE_SMALL_BOTTOM } , /* ꝲ */
+ { 0xA773, AF_IGNORE_SMALL_BOTTOM } , /* ꝳ */
+ { 0xA774, AF_IGNORE_SMALL_BOTTOM } , /* ꝴ */
+ { 0xA776, AF_IGNORE_SMALL_BOTTOM } , /* ꝶ */
+
+ { 0xA790, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞑ */
+ { 0xA791, AF_IGNORE_SMALL_BOTTOM } , /* ꞑ */
+ { 0xA794, AF_IGNORE_SMALL_BOTTOM } , /* ꞔ */
+ { 0xA795, AF_IGNORE_SMALL_BOTTOM } , /* ꞕ */
+
+ { 0xA7C0, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ꟁ */
+ { 0xA7C1, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ꟁ */
+ { 0xA7C4, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞔ */
+ { 0xA7C5, AF_IGNORE_CAPITAL_BOTTOM } , /* Ʂ */
+ { 0xA7C6, AF_IGNORE_CAPITAL_BOTTOM } , /* Ᶎ */
+ { 0xA7CC, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* */
+ { 0xA7CD, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* */
+
+ /* Latin Extended-E */
+ { 0xAB3C, AF_IGNORE_SMALL_BOTTOM } , /* ꬼ */
+
+ { 0xAB46, AF_IGNORE_SMALL_BOTTOM } , /* ꭆ */
+
+ { 0xAB5C, AF_IGNORE_SMALL_BOTTOM } , /* ꭜ */
+
+ { 0xAB66, AF_IGNORE_SMALL_BOTTOM } , /* ꭦ */
+ { 0xAB67, AF_IGNORE_SMALL_BOTTOM } , /* ꭧ */
+ };
+
+
+ FT_LOCAL_DEF( FT_UInt32 )
+ af_adjustment_database_lookup( FT_UInt32 codepoint )
+ {
+ /* Binary search for database entry */
+ FT_Offset low = 0;
+ FT_Offset high = AF_ADJUSTMENT_DATABASE_LENGTH - 1;
+
+
+ while ( high >= low )
+ {
+ FT_Offset mid = ( low + high ) / 2;
+ FT_UInt32 mid_codepoint = adjustment_database[mid].codepoint;
+
+
+ if ( mid_codepoint < codepoint )
+ low = mid + 1;
+ else if ( mid_codepoint > codepoint )
+ high = mid - 1;
+ else
+ return adjustment_database[mid].flags;
+ }
+
+ return 0;
+ }
+
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+ static FT_Error
+ add_substitute( FT_Int glyph_idx,
+ size_t value,
+ FT_UInt32 codepoint,
+ FT_Hash reverse_map,
+ FT_Hash subst_map,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+ FT_Int first_substitute = (FT_Int)( value & 0xFFFF );
+
+ FT_UInt used = reverse_map->used;
+
+
+ /*
+ OpenType features like 'unic' map lowercase letter glyphs to uppercase
+ forms (and vice versa), which could lead to the use of wrong entries
+ in the adjustment database. For this reason we don't overwrite,
+ prioritizing cmap entries.
+
+ XXX Note, however, that this cannot cover all cases since there might
+ be contradictory entries for glyphs not in the cmap. A possible
+ solution might be to specially mark pairs of related lowercase and
+ uppercase characters in the adjustment database that have diacritics
+ on different vertical sides (for example, U+0122 'Ģ' and U+0123 'ģ').
+ The auto-hinter could then perform a topological analysis to do the
+ right thing.
+ */
+ error = ft_hash_num_insert_no_overwrite( first_substitute, codepoint,
+ reverse_map, memory );
+ if ( error )
+ return error;
+
+ if ( reverse_map->used > used )
+ {
+ size_t* subst = ft_hash_num_lookup( first_substitute, subst_map );
+
+
+ if ( subst )
+ {
+ error = add_substitute( first_substitute, *subst, codepoint,
+ reverse_map, subst_map, memory );
+ if ( error )
+ return error;
+ }
+ }
+
+ /* The remaining substitutes. */
+ if ( value & 0xFFFF0000U )
+ {
+ FT_UInt num_substitutes = value >> 16;
+
+ FT_UInt i;
+
+
+ for ( i = 1; i <= num_substitutes; i++ )
+ {
+ FT_Int idx = glyph_idx + (FT_Int)( i << 16 );
+ size_t* substitute = ft_hash_num_lookup( idx, subst_map );
+
+
+ used = reverse_map->used;
+
+ error = ft_hash_num_insert_no_overwrite( *substitute,
+ codepoint,
+ reverse_map,
+ memory );
+ if ( error )
+ return error;
+
+ if ( reverse_map->used > used )
+ {
+ size_t* subst = ft_hash_num_lookup( *substitute, subst_map );
+
+
+ if ( subst )
+ {
+ error = add_substitute( *substitute, *subst, codepoint,
+ reverse_map, subst_map, memory );
+ if ( error )
+ return error;
+ }
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+
+ /* Construct a 'reverse cmap' (i.e., a mapping from glyph indices to */
+ /* character codes) for all glyphs that an input code point could turn */
+ /* into. */
+ /* */
+ /* If HarfBuzz support is not available, this is the direct inversion */
+ /* of the cmap table, otherwise the mapping gets extended with data */
+ /* from the 'GSUB' table. */
+ FT_LOCAL_DEF( FT_Error )
+ af_reverse_character_map_new( FT_Hash *map,
+ AF_StyleMetrics metrics )
+ {
+ FT_Error error;
+
+ AF_FaceGlobals globals = metrics->globals;
+ FT_Face face = globals->face;
+ FT_Memory memory = face->memory;
+
+ FT_CharMap old_charmap;
+
+ FT_UInt32 codepoint;
+ FT_Offset i;
+
+
+ FT_TRACE4(( "af_reverse_character_map_new:"
+ " building reverse character map (style `%s')\n",
+ af_style_names[metrics->style_class->style] ));
+
+ /* Search for a unicode charmap. */
+ /* If there isn't one, create a blank map. */
+
+ /* Back up `face->charmap` because `find_unicode_charmap` sets it. */
+ old_charmap = face->charmap;
+
+ if ( ( error = find_unicode_charmap( face ) ) )
+ goto Exit;
+
+ *map = NULL;
+ if ( FT_QNEW( *map ) )
+ goto Exit;
+
+ error = ft_hash_num_init( *map, memory );
+ if ( error )
+ goto Exit;
+
+ /* Initialize reverse cmap with data directly from the cmap table. */
+ for ( i = 0; i < AF_ADJUSTMENT_DATABASE_LENGTH; i++ )
+ {
+ FT_Int cmap_glyph;
+
+
+ /*
+ We cannot restrict `codepoint` to character ranges; we have no
+ control what data the script-specific portion of the GSUB table
+ actually holds.
+
+ An example is `arial.ttf` version 7.00; in this font, there are
+ lookups for Cyrillic (lookup 43), Greek (lookup 44), and Latin
+ (lookup 45) that map capital letter glyphs to small capital glyphs.
+ It is tempting to expect that script-specific versions of the 'c2sc'
+ feature only use script-specific lookups. However, this is not the
+ case in this font: the feature uses all three lookups regardless of
+ the script.
+
+ The auto-hinter, while assigning glyphs to styles, uses the first
+ coverage result it encounters for a particular glyph. For example,
+ if the coverage for Cyrillic is tested before Latin (as is currently
+ the case), glyphs without a cmap entry that are covered in 'c2sc'
+ are treated as Cyrillic.
+
+ If we now look at glyph 3498, which is a small-caps version of the
+ Latin character 'A grave' (U+00C0, glyph 172), we can see that it is
+ registered as belonging to a Cyrillic style due to the algorithm
+ just described. As a result, checking only for characters from the
+ Latin range would miss this glyph; we thus have to test all
+ character codes in the database.
+ */
+ codepoint = adjustment_database[i].codepoint;
+
+ cmap_glyph = (FT_Int)FT_Get_Char_Index( face, codepoint );
+ if ( cmap_glyph == 0 )
+ continue;
+
+ error = ft_hash_num_insert( cmap_glyph, codepoint, *map, memory );
+ if ( error )
+ goto Exit;
+ }
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+ if ( ft_hb_enabled( globals ) )
+ {
+ hb_font_t *hb_font;
+ hb_face_t *hb_face;
+
+ hb_set_t *gsub_lookups;
+ hb_script_t script;
+
+ unsigned int script_count = 1;
+ hb_tag_t script_tags[2] = { HB_TAG_NONE, HB_TAG_NONE };
+
+ FT_Hash subst_map = NULL;
+
+ hb_codepoint_t idx;
+ FT_UInt hash_idx;
+ FT_Int glyph_idx;
+ size_t value;
+
+
+ /* No need to check whether HarfBuzz has allocation issues; */
+ /* it continues to work in such cases and simply returns */
+ /* 'empty' objects that do nothing. */
+
+ hb_font = globals->hb_font;
+ hb_face = hb( font_get_face )( hb_font );
+
+ gsub_lookups = hb( set_create )();
+
+ script = af_hb_scripts[metrics->style_class->script];
+
+ hb( ot_tags_from_script_and_language )( script, NULL,
+ &script_count, script_tags,
+ NULL, NULL );
+
+ /* Compute set of all script-specific GSUB lookups. */
+ hb( ot_layout_collect_lookups )( hb_face,
+ HB_OT_TAG_GSUB,
+ script_tags, NULL, NULL,
+ gsub_lookups );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_Bool have_idx = FALSE;
+
+
+ FT_TRACE4(( " GSUB lookups to check:\n" ));
+
+ FT_TRACE4(( " " ));
+ idx = HB_SET_VALUE_INVALID;
+ while ( hb( set_next )( gsub_lookups, &idx ) )
+ if ( idx < globals->gsub_lookup_count &&
+ globals->gsub_lookups_single_alternate[idx] )
+ {
+ have_idx = TRUE;
+ FT_TRACE4(( " %u", idx ));
+ }
+ if ( !have_idx )
+ FT_TRACE4(( " (none)" ));
+ FT_TRACE4(( "\n" ));
+
+ FT_TRACE4(( "\n" ));
+ }
+#endif
+
+ if ( FT_QNEW( subst_map ) )
+ goto Exit_HarfBuzz;
+
+ error = ft_hash_num_init( subst_map, memory );
+ if ( error )
+ goto Exit_HarfBuzz;
+
+ idx = HB_SET_VALUE_INVALID;
+ while ( hb( set_next )( gsub_lookups, &idx ) )
+ {
+ FT_UInt32 offset;
+
+
+ /* HarfBuzz only validates lookup indices while */
+ /* processing lookups, not while collecting them, */
+ /* so we have to do that by ourselves. */
+ if ( idx < globals->gsub_lookup_count )
+ offset = globals->gsub_lookups_single_alternate[idx];
+ else
+ offset = 0;
+
+ /* Put all substitutions into a single hash table. Note that */
+ /* the hash values usually contain more than a single character */
+ /* code; this can happen if different 'SingleSubst' subtables */
+ /* map a given glyph index to different substitutions, or if */
+ /* 'AlternateSubst' subtable entries are present. */
+ if ( offset )
+ af_map_lookup( globals, subst_map, offset );
+ }
+
+ /*
+ Now iterate over the collected substitution data in `subst_map`
+ (using recursion to resolve one-to-many mappings) and insert the
+ data into the reverse cmap.
+
+ As an example, suppose we have the following cmap and substitution
+ data:
+
+ cmap: X -> a
+ Y -> b
+ Z -> c
+
+ substitutions: a -> b
+ b -> c, d
+ d -> e
+
+ The reverse map now becomes as follows.
+
+ a -> X
+ b -> Y
+ c -> Z (via cmap, ignoring mapping from 'b')
+ d -> Y (via 'b')
+ e -> Y (via 'b' and 'd')
+ */
+
+ hash_idx = 0;
+ while ( ft_hash_num_iterator( &hash_idx,
+ &glyph_idx,
+ &value,
+ subst_map ) )
+ {
+ size_t* val;
+
+
+ /* Ignore keys that do not point to the first substitute. */
+ if ( (FT_UInt)glyph_idx & 0xFFFF0000U )
+ continue;
+
+ /* Ignore glyph indices that are not related to accents. */
+ val = ft_hash_num_lookup( glyph_idx, *map );
+ if ( !val )
+ continue;
+
+ codepoint = *val;
+
+ error = add_substitute( glyph_idx, value, codepoint,
+ *map, subst_map, memory );
+ if ( error )
+ break;
+ }
+
+ Exit_HarfBuzz:
+ hb( set_destroy )( gsub_lookups );
+
+ ft_hash_num_free( subst_map, memory );
+ FT_FREE( subst_map );
+
+ if ( error )
+ goto Exit;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+ FT_TRACE4(( " reverse character map built successfully"
+ " with %u entries\n", ( *map )->used ));
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ {
+ FT_UInt cnt;
+
+
+ FT_TRACE7(( " gidx code flags\n" ));
+ /* " XXXXX 0xXXXX XXXXXXXXXXX..." */
+ FT_TRACE7(( " ------------------------------\n" ));
+
+ for ( cnt = 0; cnt < globals->glyph_count; cnt++ )
+ {
+ size_t* val;
+ FT_UInt32 adj_type;
+
+ const char* flag_names[] =
+ {
+ "up", /* AF_ADJUST_UP */
+ "down", /* AF_ADJUST_DOWN */
+ "double up", /* AF_ADJUST_UP2 */
+ "double down", /* AF_ADJUST_DOWN2 */
+
+ "top tilde", /* AF_ADJUST_TILDE_TOP */
+ "bottom tilde", /* AF_ADJUST_TILDE_BOTTOM */
+ "below-top tilde", /* AF_ADJUST_TILDE_TOP2 */
+ "above-bottom tilde", /* AF_ADJUST_TILDE_BOTTOM2 */
+
+ "ignore capital top", /* AF_IGNORE_CAPITAL_TOP */
+ "ignore capital bottom", /* AF_IGNORE_CAPITAL_BOTTOM */
+ "ignore small top", /* AF_IGNORE_SMALL_TOP */
+ "ignore small bottom", /* AF_IGNORE_SMALL_BOTTOM */
+ };
+ size_t flag_names_size = sizeof ( flag_names ) / sizeof ( char* );
+
+ char flag_str[256];
+ int need_comma;
+
+ size_t j;
+
+
+ val = ft_hash_num_lookup( (FT_Int)cnt, *map );
+ if ( !val )
+ continue;
+ codepoint = *val;
+
+ adj_type = af_adjustment_database_lookup( codepoint );
+ if ( !adj_type )
+ continue;
+
+ flag_str[0] = '\0';
+ need_comma = 0;
+
+ for ( j = 0; j < flag_names_size; j++ )
+ {
+ if ( adj_type & (1 << j ) )
+ {
+ if ( !need_comma )
+ need_comma = 1;
+ else
+ strcat( flag_str, ", " );
+ strcat( flag_str, flag_names[j] );
+ }
+ }
+
+ FT_TRACE7(( " %5u 0x%04X %s\n", cnt, codepoint, flag_str ));
+ }
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ Exit:
+ face->charmap = old_charmap;
+
+ if ( error )
+ {
+ FT_TRACE4(( " error while building reverse character map."
+ " Using blank map.\n" ));
+
+ if ( *map )
+ ft_hash_num_free( *map, memory );
+
+ FT_FREE( *map );
+ *map = NULL;
+ return error;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ af_reverse_character_map_done( FT_Hash map,
+ FT_Memory memory )
+ {
+ if ( map )
+ ft_hash_num_free( map, memory );
+ FT_FREE( map );
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h
new file mode 100644
index 000000000000..4837451ae4cf
--- /dev/null
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+ *
+ * afadjust.h
+ *
+ * Auto-fitter routines to adjust components based on charcode (header).
+ *
+ * Copyright (C) 2023-2025 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * Written by Craig White .
+ *
+ * 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 AFADJUST_H_
+#define AFADJUST_H_
+
+#include
+
+#include "afglobal.h"
+#include "aftypes.h"
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * Adjustment type flags.
+ *
+ * They also specify topological constraints that the auto-hinter relies
+ * on. For example, using `AF_ADJUST_UP` implies that we have two
+ * enclosing contours, one for the base glyph and one for the diacritic
+ * above, and no other contour inbetween or above. With 'enclosing' it is
+ * meant that such a contour can contain more inner contours.
+ *
+ */
+
+ /* Find the topmost contour and push it up until its lowest point is */
+ /* one pixel above the highest point not enclosed by that contour. */
+#define AF_ADJUST_UP 0x01
+
+ /* Find the bottommost contour and push it down until its highest point */
+ /* is one pixel below the lowest point not enclosed by that contour. */
+#define AF_ADJUST_DOWN 0x02
+
+ /* Find the contour below the topmost contour and push it up, together */
+ /* with the topmost contour, until its lowest point is one pixel above */
+ /* the highest point not enclosed by that contour. This flag is */
+ /* mutually exclusive with `AF_ADJUST_UP`. */
+#define AF_ADJUST_UP2 0x04
+
+ /* Find the contour above the bottommost contour and push it down, */
+ /* together with the bottommost contour, until its highest point is */
+ /* one pixel below the lowest point not enclosed by that contour. */
+ /* This flag is mutually exclusive with `AF_ADJUST_DOWN`. */
+#define AF_ADJUST_DOWN2 0x08
+
+ /* The topmost contour is a tilde. Enlarge it vertically so that it */
+ /* stays legible at small sizes, not degenerating to a horizontal line. */
+#define AF_ADJUST_TILDE_TOP 0x10
+
+ /* The bottommost contour is a tilde. Enlarge it vertically so that it */
+ /* stays legible at small sizes, not degenerating to a horizontal line. */
+#define AF_ADJUST_TILDE_BOTTOM 0x20
+
+ /* The contour below the topmost contour is a tilde. Enlarge it */
+ /* vertically so that it stays legible at small sizes, not degenerating */
+ /* to a horizontal line. To be used with `AF_ADJUST_UP2` only. */
+#define AF_ADJUST_TILDE_TOP2 0x40
+
+ /* The contour above the bottommost contour is a tilde. Enlarge it */
+ /* vertically so that it stays legible at small sizes, not degenerating */
+ /* to a horizontal line. To be used with `AF_ADJUST_DOWN2` only. */
+#define AF_ADJUST_TILDE_BOTTOM2 0x80
+
+ /* Make the auto-hinter ignore any diacritic (either a separate contour */
+ /* or part of the base character outline) that is attached to the top */
+ /* of an uppercase base character. */
+#define AF_IGNORE_CAPITAL_TOP 0x100
+
+ /* Make the auto-hinter ignore any diacritic (either a separate contour */
+ /* or part of the base character outline) that is attached to the */
+ /* bottom of an uppercase base character. */
+#define AF_IGNORE_CAPITAL_BOTTOM 0x200
+
+ /* Make the auto-hinter ignore any diacritic (either a separate contour */
+ /* or part of the base character outline) that is attached to the top */
+ /* of a lowercase base character. */
+#define AF_IGNORE_SMALL_TOP 0x400
+
+ /* Make the auto-hinter ignore any diacritic (either a separate contour */
+ /* or part of the base character outline) that is attached to the */
+ /* bottom of a lowercase base character. */
+#define AF_IGNORE_SMALL_BOTTOM 0x800
+
+ /* By default, the AF_ADJUST_XXX flags are applied only if diacritics */
+ /* have a 'small' height (based on some heuristic checks). If this */
+ /* flag is set, no such check is performed. */
+#define AF_ADJUST_NO_HEIGHT_CHECK 0x1000
+
+ /* No adjustment, i.e., no flag is set. */
+#define AF_ADJUST_NONE 0x00
+
+
+ FT_LOCAL( FT_UInt32 )
+ af_adjustment_database_lookup( FT_UInt32 codepoint );
+
+ /* Allocate and populate the reverse character map, */
+ /* using the character map within the face. */
+ FT_LOCAL( FT_Error )
+ af_reverse_character_map_new( FT_Hash *map,
+ AF_StyleMetrics metrics );
+
+ /* Free the reverse character map. */
+ FT_LOCAL( FT_Error )
+ af_reverse_character_map_done( FT_Hash map,
+ FT_Memory memory );
+
+
+FT_END_HEADER
+
+#endif /* AFADJUST_H_ */
+
+
+/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c
index ea83969cdc97..a6219bdfe41c 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c
@@ -7,7 +7,7 @@
*
* Auto-fitter data for blue strings (body).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -467,24 +467,24 @@
af_blue_stringsets[] =
{
/* */
- { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 },
+ { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
{ AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_ARABIC_BOTTOM, 0 },
{ AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_AVESTAN_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
@@ -508,14 +508,14 @@
{ AF_BLUE_STRING_CHAKMA_BOTTOM, 0 },
{ AF_BLUE_STRING_CHAKMA_DESCENDER, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 },
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 },
{ AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_CARIAN_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
@@ -527,24 +527,24 @@
{ AF_BLUE_STRING_CHEROKEE_SMALL, 0 },
{ AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 },
+ { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
{ AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 },
{ AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_CYPRIOT_SMALL, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 },
+ { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
{ AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_CYRILLIC_SMALL, 0 },
- { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_CYRILLIC_SMALL, 0 },
+ { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP |
@@ -553,12 +553,12 @@
{ AF_BLUE_STRING_DEVANAGARI_BASE, 0 },
{ AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 },
+ { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
{ AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
@@ -578,23 +578,23 @@
{ AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 },
+ { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
{ AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_GOTHIC_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_GREEK_SMALL, 0 },
- { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_GREEK_SMALL, 0 },
+ { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
{ AF_BLUE_STRING_GUJARATI_BOTTOM, 0 },
@@ -643,45 +643,45 @@
{ AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_LAO_DESCENDER, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
+ { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 },
- { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 },
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
+ { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 },
- { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 },
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_LISU_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 },
{ AF_BLUE_STRING_MAX, 0 },
@@ -691,12 +691,12 @@
{ AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_MYANMAR_DESCENDER, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_NKO_BOTTOM, 0 },
+ { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_NKO_BOTTOM, 0 },
{ AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_NKO_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_OL_CHIKI, 0 },
@@ -704,15 +704,15 @@
{ AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 },
- { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 },
- { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+ { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 },
+ { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_OSMANYA_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
@@ -723,13 +723,13 @@
{ AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 },
{ AF_BLUE_STRING_MAX, 0 },
- { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
- { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 },
- { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 },
+ { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
+ { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 },
+ { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 },
{ AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
- { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 },
- { AF_BLUE_STRING_MAX, 0 },
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT },
+ { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+ { AF_BLUE_STRING_MAX, 0 },
{ AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP },
{ AF_BLUE_STRING_SINHALA_BOTTOM, 0 },
{ AF_BLUE_STRING_SINHALA_DESCENDER, 0 },
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin
index d2270fac7443..786c6b3b9e6f 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin
@@ -4,7 +4,7 @@
*
* Auto-fitter data for blue strings (body).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat
index 88bab2632abe..f6e96ff8189d 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat
@@ -2,7 +2,7 @@
//
// Auto-fitter data for blue strings.
//
-// Copyright (C) 2013-2024 by
+// Copyright (C) 2013-2025 by
// David Turner, Robert Wilhelm, and Werner Lemberg.
//
// This file is part of the FreeType project, and may only be used,
@@ -699,12 +699,12 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
AF_BLUE_STRINGSET_ADLM
- { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 }
+ { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
{ AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_ARAB
{ AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -713,14 +713,14 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_ARMN
- { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_AVST
{ AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -756,14 +756,14 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_CANS
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }
{ AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_CARI
{ AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -781,12 +781,12 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_COPT
- { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 }
+ { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
{ AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_CPRT
{ AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -796,13 +796,13 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_CYRL
- { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }
+ { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
{ AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }
- { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }
+ { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_DEVA
{ AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -815,12 +815,12 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_DSRT
- { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 }
+ { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
{ AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_ETHI
{ AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -848,12 +848,12 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_GLAG
- { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 }
+ { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
{ AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_GOTH
{ AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -861,14 +861,14 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_GREK
- { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_GREEK_SMALL, 0 }
- { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_GREEK_SMALL, 0 }
+ { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_GUJR
{ AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
@@ -935,34 +935,34 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_LATN
- { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_LATB
- { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 }
- { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 }
+ { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_LATP
- { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }
- { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }
+ { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_LISU
{ AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -975,15 +975,15 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_MEDF
- { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
{ AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_MONG
{ AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -999,12 +999,12 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_NKOO
- { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_NKO_BOTTOM, 0 }
+ { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_NKO_BOTTOM, 0 }
{ AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_NKO_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_NONE
{ AF_BLUE_STRING_MAX, 0 }
@@ -1020,15 +1020,15 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_OSGE
- { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 }
- { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }
- { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+ { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }
+ { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_OSMA
{ AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
@@ -1047,13 +1047,13 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
{ AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_SHAW
- { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
- { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }
- { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }
+ { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
+ { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }
+ { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }
{ AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP |
- AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
- { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 }
- { AF_BLUE_STRING_MAX, 0 }
+ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }
+ { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+ { AF_BLUE_STRING_MAX, 0 }
AF_BLUE_STRINGSET_SINH
{ AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h
index 2aa9d0984ef7..5bb8406dc2b4 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h
@@ -7,7 +7,7 @@
*
* Auto-fitter data for blue strings (specification).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -314,14 +314,17 @@ FT_BEGIN_HEADER
/* Properties are specific to a writing system. We assume that a given */
/* blue string can't be used in more than a single writing system, which */
/* is a safe bet. */
-#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */
+#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must be value 1 */
#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 )
#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 )
#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 )
#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 )
-#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */
-#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */
+#define AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM ( 1U << 5 )
+#define AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM ( 1U << 6 )
+
+#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must be value 1 */
+#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must be value 2 */
#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin
index 38031505a85b..dbac14548d55 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin
@@ -4,7 +4,7 @@
*
* Auto-fitter data for blue strings (specification).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -99,14 +99,17 @@ FT_BEGIN_HEADER
/* Properties are specific to a writing system. We assume that a given */
/* blue string can't be used in more than a single writing system, which */
/* is a safe bet. */
-#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */
+#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must be value 1 */
#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 )
#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 )
#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 )
#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 )
-#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */
-#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */
+#define AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM ( 1U << 5 )
+#define AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM ( 1U << 6 )
+
+#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must be value 1 */
+#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must be value 2 */
#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c b/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c
index 869b60487c21..7086601838c3 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines for CJK writing system (body).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -90,12 +90,8 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
const char* p;
@@ -105,9 +101,8 @@
p = script_class->standard_charstring;
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
/* We check a list of standard characters. The first match wins. */
@@ -144,7 +139,7 @@
break;
}
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
if ( !glyph_index )
goto Exit;
@@ -152,7 +147,7 @@
if ( !glyph_index )
goto Exit;
- FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n",
+ FT_TRACE5(( "standard character: U+%04lX (glyph index %lu)\n",
ch, glyph_index ));
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
@@ -297,12 +292,8 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
/* we walk over the blue character strings as specified in the */
@@ -313,9 +304,8 @@
FT_TRACE5(( "==========================\n" ));
FT_TRACE5(( "\n" ));
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
{
@@ -340,7 +330,7 @@
};
- FT_TRACE5(( "blue zone %d (%s):\n",
+ FT_TRACE5(( "blue zone %u (%s):\n",
axis->blue_count,
cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) |
AF_CJK_IS_TOP_BLUE( bs ) ] ));
@@ -553,7 +543,7 @@
} /* end for loop */
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
FT_TRACE5(( "\n" ));
@@ -572,23 +562,20 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
/* in all supported charmaps, digits have character codes 0x30-0x39 */
const char digits[] = "0 1 2 3 4 5 6 7 8 9";
const char* p;
+ FT_UNUSED( face );
+
p = digits;
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
while ( *p )
{
@@ -624,7 +611,7 @@
}
}
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
metrics->root.digits_have_same_width = same_width;
}
@@ -710,7 +697,7 @@
FT_Pos delta1, delta2;
- blue->ref.fit = FT_PIX_ROUND( blue->ref.cur );
+ blue->ref.fit = FT_PIX_ROUND( blue->ref.cur );
/* shoot is under shoot for cjk */
delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org;
@@ -736,7 +723,7 @@
blue->shoot.fit = blue->ref.fit - delta2;
- FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n",
+ FT_TRACE5(( ">> active cjk blue zone %c%u[%ld/%ld]:\n",
( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V',
nn, blue->ref.org, blue->shoot.org ));
FT_TRACE5(( " ref: cur=%.2f fit=%.2f\n",
@@ -1378,7 +1365,7 @@
}
- /* Initalize hinting engine. */
+ /* Initialize hinting engine. */
FT_LOCAL_DEF( FT_Error )
af_cjk_hints_init( AF_GlyphHints hints,
@@ -2185,7 +2172,7 @@
af_cjk_align_edge_points( AF_GlyphHints hints,
AF_Dimension dim )
{
- AF_AxisHints axis = & hints->axis[dim];
+ AF_AxisHints axis = &hints->axis[dim];
AF_Edge edges = axis->edges;
AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges );
AF_Edge edge;
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h b/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h
index bc5aaf12e6ee..bd1b39358e08 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines for CJK writing system (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h b/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h
index 7980cf2e9796..b93bcd1a2c54 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h
@@ -4,7 +4,7 @@
*
* Auto-fitter coverages (specification only).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c b/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c
index ad667d2edc79..8613544f913c 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c
@@ -5,7 +5,7 @@
* Auto-fitter dummy routines to be used if no hinting should be
* performed (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h b/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h
index 613c2f88a389..78a79439d95a 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h
@@ -5,7 +5,7 @@
* Auto-fitter dummy routines to be used if no hinting should be
* performed (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h b/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h
index ae584ff06db6..f3093fc90dfb 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h
@@ -4,7 +4,7 @@
*
* Autofitter error codes (specification only).
*
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c
index b7403fa65e1b..e74d81411619 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c
@@ -4,7 +4,7 @@
*
* Auto-fitter routines to compute global hinting values (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,11 @@
#include "afws-decl.h"
#include
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+# include "afgsub.h"
+# include "ft-hb-ft.h"
+#endif
+
/**************************************************************************
*
@@ -184,7 +189,7 @@
if ( gindex != 0 &&
gindex < globals->glyph_count &&
( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
- gstyles[gindex] = ss;
+ gstyles[gindex] = ss | AF_HAS_CMAP_ENTRY;
for (;;)
{
@@ -195,7 +200,7 @@
if ( gindex < globals->glyph_count &&
( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
- gstyles[gindex] = ss;
+ gstyles[gindex] = ss | AF_HAS_CMAP_ENTRY;
}
}
@@ -301,7 +306,7 @@
if ( !( count % 10 ) )
FT_TRACE4(( " " ));
- FT_TRACE4(( " %d", idx ));
+ FT_TRACE4(( " %u", idx ));
count++;
if ( !( count % 10 ) )
@@ -356,8 +361,21 @@
globals->scale_down_factor = 0;
#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- globals->hb_font = hb_ft_font_create_( face, NULL );
- globals->hb_buf = hb_buffer_create();
+ if ( ft_hb_enabled ( globals ) )
+ {
+ globals->hb_font = ft_hb_ft_font_create( globals );
+ globals->hb_buf = hb( buffer_create )();
+
+ af_parse_gsub( globals );
+ }
+ else
+ {
+ globals->hb_font = NULL;
+ globals->hb_buf = NULL;
+
+ globals->gsub = NULL;
+ globals->gsub_lookups_single_alternate = NULL;
+ }
#endif
error = af_face_globals_compute_style_coverage( globals );
@@ -405,8 +423,14 @@
}
#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- hb_font_destroy( globals->hb_font );
- hb_buffer_destroy( globals->hb_buf );
+ if ( ft_hb_enabled ( globals ) )
+ {
+ hb( font_destroy )( globals->hb_font );
+ hb( buffer_destroy )( globals->hb_buf );
+
+ FT_FREE( globals->gsub );
+ FT_FREE( globals->gsub_lookups_single_alternate );
+ }
#endif
/* no need to free `globals->glyph_styles'; */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h
index ddb54c89b276..dc061159492e 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h
@@ -5,7 +5,7 @@
* Auto-fitter routines to compute global hinting values
* (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -73,15 +73,17 @@ FT_BEGIN_HEADER
/* default script for OpenType; ignored if HarfBuzz isn't used */
#define AF_SCRIPT_DEFAULT AF_SCRIPT_LATN
- /* a bit mask for AF_DIGIT and AF_NONBASE */
-#define AF_STYLE_MASK 0x3FFF
+ /* a bit mask for AF_DIGIT, AF_NONBASE, and AF_HAS_CMAP_ENTRY */
+#define AF_STYLE_MASK 0x1FFF
/* an uncovered glyph */
#define AF_STYLE_UNASSIGNED AF_STYLE_MASK
- /* if this flag is set, we have an ASCII digit */
+ /* if this flag is set, we have an ASCII digit */
#define AF_DIGIT 0x8000U
/* if this flag is set, we have a non-base character */
#define AF_NONBASE 0x4000U
+ /* if this flag is set, the glyph has a (direct) cmap entry */
+#define AF_HAS_CMAP_ENTRY 0x2000U
/* `increase-x-height' property */
#define AF_PROP_INCREASE_X_HEIGHT_MIN 6
@@ -111,6 +113,13 @@ FT_BEGIN_HEADER
#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
hb_font_t* hb_font;
hb_buffer_t* hb_buf; /* for feature comparison */
+
+ /* The GSUB table. */
+ FT_Byte* gsub;
+ /* An array of lookup offsets (of `gsub_lookup_count` elements), */
+ /* with only SingleSubst and AlternateSubst lookups non-NULL. */
+ FT_UShort gsub_lookup_count;
+ FT_UInt32* gsub_lookups_single_alternate;
#endif
/* per-face auto-hinter properties */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c b/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c
index 96ffe343aa44..11faa655f62f 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -840,6 +840,10 @@
if ( hints->contours != hints->embedded.contours )
FT_FREE( hints->contours );
+ if ( hints->contour_y_minima != hints->embedded.contour_y_minima )
+ FT_FREE( hints->contour_y_minima );
+ if ( hints->contour_y_maxima != hints->embedded.contour_y_maxima )
+ FT_FREE( hints->contour_y_maxima );
hints->max_contours = 0;
hints->num_contours = 0;
@@ -896,19 +900,30 @@
{
if ( !hints->contours )
{
- hints->contours = hints->embedded.contours;
+ hints->contours = hints->embedded.contours;
+ hints->contour_y_minima = hints->embedded.contour_y_minima;
+ hints->contour_y_maxima = hints->embedded.contour_y_maxima;
+
hints->max_contours = AF_CONTOURS_EMBEDDED;
}
}
else if ( new_max > old_max )
{
if ( hints->contours == hints->embedded.contours )
- hints->contours = NULL;
+ {
+ hints->contours = NULL;
+ hints->contour_y_minima = NULL;
+ hints->contour_y_maxima = NULL;
+ }
new_max = ( new_max + 3 ) & ~3; /* round up to a multiple of 4 */
if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) )
goto Exit;
+ if ( FT_RENEW_ARRAY( hints->contour_y_minima, old_max, new_max ) )
+ goto Exit;
+ if ( FT_RENEW_ARRAY( hints->contour_y_maxima, old_max, new_max ) )
+ goto Exit;
hints->max_contours = new_max;
}
@@ -1324,7 +1339,7 @@
af_glyph_hints_align_edge_points( AF_GlyphHints hints,
AF_Dimension dim )
{
- AF_AxisHints axis = & hints->axis[dim];
+ AF_AxisHints axis = &hints->axis[dim];
AF_Segment segments = axis->segments;
AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments );
AF_Segment seg;
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h b/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h
index 76fe83006a52..46b3ed3366f2 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -222,6 +222,9 @@ FT_BEGIN_HEADER
/* the distance to the next point is very small */
#define AF_FLAG_NEAR ( 1U << 5 )
+ /* prevent the auto-hinter from adding such a point to a segment */
+#define AF_FLAG_IGNORE ( 1U << 6 )
+
/* edge hint flags */
#define AF_EDGE_NORMAL 0
@@ -229,6 +232,7 @@ FT_BEGIN_HEADER
#define AF_EDGE_SERIF ( 1U << 1 )
#define AF_EDGE_DONE ( 1U << 2 )
#define AF_EDGE_NEUTRAL ( 1U << 3 ) /* edge aligns to a neutral blue zone */
+#define AF_EDGE_NO_BLUE ( 1U << 4 ) /* do not align edge to blue zone */
typedef struct AF_PointRec_* AF_Point;
@@ -303,6 +307,7 @@ FT_BEGIN_HEADER
} AF_EdgeRec;
+
#define AF_SEGMENTS_EMBEDDED 18 /* number of embedded segments */
#define AF_EDGES_EMBEDDED 12 /* number of embedded edges */
@@ -346,9 +351,11 @@ FT_BEGIN_HEADER
FT_Int num_points; /* number of used points */
AF_Point points; /* points array */
- FT_Int max_contours; /* number of allocated contours */
- FT_Int num_contours; /* number of used contours */
- AF_Point* contours; /* contours array */
+ FT_Int max_contours; /* number of allocated contours */
+ FT_Int num_contours; /* number of used contours */
+ AF_Point* contours; /* contours array */
+ FT_Pos* contour_y_minima; /* array with y maxima of contours */
+ FT_Pos* contour_y_maxima; /* array with y minima of contours */
AF_AxisHintsRec axis[AF_DIMENSION_MAX];
@@ -357,11 +364,13 @@ FT_BEGIN_HEADER
/* implementations */
AF_StyleMetrics metrics;
- /* Two arrays to avoid allocation penalty. */
+ /* Some arrays to avoid allocation penalty. */
/* The `embedded' structure must be the last element! */
struct
{
AF_Point contours[AF_CONTOURS_EMBEDDED];
+ FT_Pos contour_y_minima[AF_CONTOURS_EMBEDDED];
+ FT_Pos contour_y_maxima[AF_CONTOURS_EMBEDDED];
AF_PointRec points[AF_POINTS_EMBEDDED];
} embedded;
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c b/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c
index c6d23efd86f5..a2cd14f88171 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines for Indic writing system (body).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* Rahul Bhalerao , .
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h b/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h
index a7f73f25153a..a2e825e9f868 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h
@@ -5,7 +5,7 @@
* Auto-fitter hinting routines for Indic writing system
* (specification).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* Rahul Bhalerao , .
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c
index 89287f7ea5a6..4a42d9194745 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c
@@ -4,7 +4,7 @@
*
* Auto-fitter hinting routines for latin writing system (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,7 @@
#include "afglobal.h"
#include "aflatin.h"
#include "aferrors.h"
+#include "afadjust.h"
/**************************************************************************
@@ -81,12 +82,8 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
const char* p;
@@ -97,9 +94,9 @@
p = script_class->standard_charstring;
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled ( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
+
/*
* We check a list of standard characters to catch features like
* `c2sc' (small caps from caps) that don't contain lowercase letters
@@ -140,7 +137,7 @@
break;
}
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
if ( !glyph_index )
{
@@ -149,7 +146,7 @@
goto Exit;
}
- FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n",
+ FT_TRACE5(( "standard character: U+%04lX (glyph index %lu)\n",
ch, glyph_index ));
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
@@ -334,12 +331,8 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
/* we walk over the blue character strings as specified in the */
@@ -349,9 +342,8 @@
FT_TRACE5(( "============================\n" ));
FT_TRACE5(( "\n" ));
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled ( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
{
@@ -367,7 +359,7 @@
FT_Bool have_flag = 0;
- FT_TRACE5(( "blue zone %d", axis->blue_count ));
+ FT_TRACE5(( "blue zone %u", axis->blue_count ));
if ( bs->properties )
{
@@ -407,6 +399,20 @@
FT_TRACE5(( "long" ));
}
+ if ( AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( bs ) )
+ {
+ if ( have_flag )
+ FT_TRACE5(( ", " ));
+ FT_TRACE5(( "capital bottom" ));
+ }
+
+ if ( AF_LATIN_IS_SMALL_BOTTOM_BLUE( bs ) )
+ {
+ if ( have_flag )
+ FT_TRACE5(( ", " ));
+ FT_TRACE5(( "small bottom" ));
+ }
+
FT_TRACE5(( ")" ));
}
@@ -454,9 +460,9 @@
}
if ( AF_LATIN_IS_TOP_BLUE( bs ) )
- best_y_extremum = FT_INT_MIN;
+ best_y_extremum = FT_LONG_MIN;
else
- best_y_extremum = FT_INT_MAX;
+ best_y_extremum = FT_LONG_MAX;
/* iterate over all glyph elements of the character cluster */
/* and get the data of the `biggest' one */
@@ -487,7 +493,7 @@
if ( num_idx == 1 )
FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch ));
else
- FT_TRACE5(( " component %d of cluster starting with U+%04lX"
+ FT_TRACE5(( " component %u of cluster starting with U+%04lX"
" contains no (usable) outlines\n", i, ch ));
#endif
continue;
@@ -825,7 +831,7 @@
if ( num_idx == 1 )
FT_TRACE5(( " U+%04lX: best_y = %5ld", ch, best_y ));
else
- FT_TRACE5(( " component %d of cluster starting with U+%04lX:"
+ FT_TRACE5(( " component %u of cluster starting with U+%04lX:"
" best_y = %5ld", i, ch, best_y ));
#endif
@@ -879,8 +885,8 @@
} /* end for loop */
- if ( !( best_y_extremum == FT_INT_MIN ||
- best_y_extremum == FT_INT_MAX ) )
+ if ( !( best_y_extremum == FT_LONG_MIN ||
+ best_y_extremum == FT_LONG_MAX ) )
{
if ( best_round )
rounds[num_rounds++] = best_y_extremum;
@@ -959,6 +965,10 @@
blue->flags |= AF_LATIN_BLUE_SUB_TOP;
if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
blue->flags |= AF_LATIN_BLUE_NEUTRAL;
+ if ( AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( bs ) )
+ blue->flags |= AF_LATIN_BLUE_BOTTOM;
+ if ( AF_LATIN_IS_SMALL_BOTTOM_BLUE( bs ) )
+ blue->flags |= AF_LATIN_BLUE_BOTTOM_SMALL;
/*
* The following flag is used later to adjust the y and x scales
@@ -973,7 +983,7 @@
} /* end for loop */
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
if ( axis->blue_count )
{
@@ -1070,23 +1080,20 @@
/* If HarfBuzz is not available, we need a pointer to a single */
/* unsigned long value. */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- void* shaper_buf;
-#else
FT_ULong shaper_buf_;
void* shaper_buf = &shaper_buf_;
-#endif
/* in all supported charmaps, digits have character codes 0x30-0x39 */
const char digits[] = "0 1 2 3 4 5 6 7 8 9";
const char* p;
+ FT_UNUSED( face );
+
p = digits;
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
- shaper_buf = af_shaper_buf_create( face );
-#endif
+ if ( ft_hb_enabled ( metrics->root.globals ) )
+ shaper_buf = af_shaper_buf_create( metrics->root.globals );
while ( *p )
{
@@ -1122,7 +1129,7 @@
}
}
- af_shaper_buf_destroy( face, shaper_buf );
+ af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
metrics->root.digits_have_same_width = same_width;
}
@@ -1155,6 +1162,9 @@
af_latin_metrics_check_digits( metrics, face );
}
+ af_reverse_character_map_new( &metrics->root.reverse_charmap,
+ &metrics->root );
+
Exit:
face->charmap = oldmap;
return error;
@@ -1263,7 +1273,7 @@
max_height = FT_MAX( max_height, -Axis->blues[nn].descender );
}
- dist = FT_MulFix( max_height, new_scale - scale );
+ dist = FT_MulFix( max_height, new_scale - scale );
if ( -128 < dist && dist < 128 )
{
@@ -1466,13 +1476,13 @@
AF_LatinBlue blue = &axis->blues[nn];
- FT_TRACE5(( " reference %d: %ld scaled to %.2f%s\n",
+ FT_TRACE5(( " reference %u: %ld scaled to %.2f%s\n",
nn,
blue->ref.org,
(double)blue->ref.fit / 64,
( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? ""
: " (inactive)" ));
- FT_TRACE5(( " overshoot %d: %ld scaled to %.2f%s\n",
+ FT_TRACE5(( " overshoot %u: %ld scaled to %.2f%s\n",
nn,
blue->shoot.org,
(double)blue->shoot.fit / 64,
@@ -1484,6 +1494,17 @@
}
+ FT_CALLBACK_DEF( void )
+ af_latin_metrics_done( AF_StyleMetrics metrics_ )
+ {
+ AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_;
+
+
+ af_reverse_character_map_done( metrics->root.reverse_charmap,
+ metrics->root.globals->face->memory );
+ }
+
+
/* Scale global values in both directions. */
FT_LOCAL_DEF( void )
@@ -1617,7 +1638,8 @@
FT_Pos prev_max_on_coord = max_on_coord;
- if ( FT_ABS( last->out_dir ) == major_dir &&
+ if ( !( point->flags & AF_FLAG_IGNORE ) &&
+ FT_ABS( last->out_dir ) == major_dir &&
FT_ABS( point->out_dir ) == major_dir )
{
/* we are already on an edge, try to locate its start */
@@ -1676,13 +1698,17 @@
max_on_coord = v;
}
- if ( point->out_dir != segment_dir || point == last )
+ if ( point->flags & AF_FLAG_IGNORE ||
+ point->out_dir != segment_dir ||
+ point == last )
{
/* check whether the new segment's start point is identical to */
/* the previous segment's end point; for example, this might */
/* happen for spikes */
- if ( !prev_segment || segment->first != prev_segment->last )
+ if ( point->flags & AF_FLAG_IGNORE ||
+ !prev_segment ||
+ segment->first != prev_segment->last )
{
/* points are different: we are just leaving an edge, thus */
/* record a new segment */
@@ -1842,7 +1868,8 @@
/* if we are not on an edge, check whether the major direction */
/* coincides with the current point's `out' direction, or */
/* whether we have a single-point contour */
- if ( !on_edge &&
+ if ( !( point->flags & AF_FLAG_IGNORE ) &&
+ !on_edge &&
( FT_ABS( point->out_dir ) == major_dir ||
point == point->prev ) )
{
@@ -2521,6 +2548,9 @@
FT_Pos best_dist; /* initial threshold */
+ if ( edge->flags & AF_EDGE_NO_BLUE )
+ continue;
+
/* compute the initial threshold as a fraction of the EM size */
/* (the value 40 is heuristic) */
best_dist = FT_MulFix( metrics->units_per_em / 40, scale );
@@ -2610,7 +2640,7 @@
}
- /* Initalize hinting engine. */
+ /* Initialize hinting engine. */
static FT_Error
af_latin_hints_init( AF_GlyphHints hints,
@@ -2737,247 +2767,1439 @@
}
- /* Compute the snapped width of a given stem, ignoring very thin ones. */
- /* There is a lot of voodoo in this function; changing the hard-coded */
- /* parameters influence the whole hinting process. */
+#undef FT_COMPONENT
+#define FT_COMPONENT afadjust
- static FT_Pos
- af_latin_compute_stem_width( AF_GlyphHints hints,
- AF_Dimension dim,
- FT_Pos width,
- FT_Pos base_delta,
- FT_UInt base_flags,
- FT_UInt stem_flags )
+
+ static void
+ af_move_contour_vertically( AF_Point contour,
+ FT_Int movement )
{
- AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics;
- AF_LatinAxis axis = &metrics->axis[dim];
- FT_Pos dist = width;
- FT_Int sign = 0;
- FT_Int vertical = ( dim == AF_DIMENSION_VERT );
+ AF_Point point = contour;
+ AF_Point first_point = point;
- if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
- axis->extra_light )
- return width;
+ if ( point )
+ {
+ do
+ {
+ point->y += movement;
+ point = point->next;
- if ( dist < 0 )
+ } while ( point != first_point );
+ }
+ }
+
+
+ /* Move all contours higher than `limit` by `delta`. */
+ static void
+ af_move_contours_up( AF_GlyphHints hints,
+ FT_Pos limit,
+ FT_Pos delta )
+ {
+ FT_Int contour;
+
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
{
- dist = -width;
- sign = 1;
+ FT_Pos min_y = hints->contour_y_minima[contour];
+ FT_Pos max_y = hints->contour_y_maxima[contour];
+
+
+ if ( min_y < max_y &&
+ min_y > limit )
+ af_move_contour_vertically( hints->contours[contour],
+ delta );
}
+ }
- if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
- ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
+
+ static void
+ af_move_contours_down( AF_GlyphHints hints,
+ FT_Pos limit,
+ FT_Pos delta )
+ {
+ FT_Int contour;
+
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
{
- /* smooth hinting process: very lightly quantize the stem width */
+ FT_Pos min_y = hints->contour_y_minima[contour];
+ FT_Pos max_y = hints->contour_y_maxima[contour];
- /* leave the widths of serifs alone */
- if ( ( stem_flags & AF_EDGE_SERIF ) &&
- vertical &&
- ( dist < 3 * 64 ) )
- goto Done_Width;
- else if ( base_flags & AF_EDGE_ROUND )
- {
- if ( dist < 80 )
- dist = 64;
- }
- else if ( dist < 56 )
- dist = 56;
+ if ( min_y < max_y &&
+ max_y < limit )
+ af_move_contour_vertically( hints->contours[contour],
+ -delta );
+ }
+ }
- if ( axis->width_count > 0 )
- {
- FT_Pos delta;
+ /* Compute vertical extrema of all contours and store them in the */
+ /* `contour_y_minima` and `contour_y_maxima` arrays of `hints`. */
+ static void
+ af_compute_vertical_extrema( AF_GlyphHints hints )
+ {
+ FT_Int contour;
- /* compare to standard width */
- delta = dist - axis->widths[0].cur;
- if ( delta < 0 )
- delta = -delta;
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos min_y = FT_LONG_MAX;
+ FT_Pos max_y = FT_LONG_MIN;
- if ( delta < 40 )
- {
- dist = axis->widths[0].cur;
- if ( dist < 48 )
- dist = 48;
+ AF_Point first_point = hints->contours[contour];
+ AF_Point point = first_point;
- goto Done_Width;
- }
- if ( dist < 3 * 64 )
- {
- delta = dist & 63;
- dist &= -64;
+ if ( !first_point || first_point->next->next == first_point )
+ goto End_loop;
- if ( delta < 10 )
- dist += delta;
+ do
+ {
+ if ( point->y < min_y )
+ min_y = point->y;
+ if ( point->y > max_y )
+ max_y = point->y;
- else if ( delta < 32 )
- dist += 10;
+ point = point->next;
- else if ( delta < 54 )
- dist += 54;
+ } while ( point != first_point );
- else
- dist += delta;
- }
- else
- {
- /* A stem's end position depends on two values: the start */
- /* position and the stem length. The former gets usually */
- /* rounded to the grid, while the latter gets rounded also if it */
- /* exceeds a certain length (see below in this function). This */
- /* `double rounding' can lead to a great difference to the */
- /* original, unhinted position; this normally doesn't matter for */
- /* large PPEM values, but for small sizes it can easily make */
- /* outlines collide. For this reason, we adjust the stem length */
- /* by a small amount depending on the PPEM value in case the */
- /* former and latter rounding both point into the same */
- /* direction. */
+ End_loop:
+ hints->contour_y_minima[contour] = min_y;
+ hints->contour_y_maxima[contour] = max_y;
+ }
+ }
- FT_Pos bdelta = 0;
+ static FT_Int
+ af_find_highest_contour( AF_GlyphHints hints )
+ {
+ FT_Int highest_contour = 0;
+ FT_Pos highest_min_y = FT_LONG_MAX;
+ FT_Pos highest_max_y = FT_LONG_MIN;
- if ( ( ( width > 0 ) && ( base_delta > 0 ) ) ||
- ( ( width < 0 ) && ( base_delta < 0 ) ) )
- {
- FT_UInt ppem = metrics->root.scaler.face->size->metrics.x_ppem;
+ FT_Int contour;
- if ( ppem < 10 )
- bdelta = base_delta;
- else if ( ppem < 30 )
- bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20;
+ /* At this point we have one 'lower' (usually the base glyph) */
+ /* and one 'upper' object (usually the diacritic glyph). If */
+ /* there are more contours, they must be enclosed within either */
+ /* 'lower' or 'upper'. To find this enclosing 'upper' contour */
+ /* it is thus sufficient to search for the contour with the */
+ /* highest y maximum value. */
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos current_min_y = hints->contour_y_minima[contour];
+ FT_Pos current_max_y = hints->contour_y_maxima[contour];
- if ( bdelta < 0 )
- bdelta = -bdelta;
- }
- dist = ( dist - bdelta + 32 ) & ~63;
- }
+ /* If we have two contours with the same maximum value, take */
+ /* the one that has a smaller height. */
+ if ( current_max_y > highest_max_y ||
+ ( current_max_y == highest_max_y &&
+ current_min_y > highest_min_y ) )
+ {
+ highest_min_y = current_min_y;
+ highest_max_y = current_max_y;
+ highest_contour = contour;
}
}
- else
- {
- /* strong hinting process: snap the stem width to integer pixels */
- FT_Pos org_dist = dist;
+ return highest_contour;
+ }
- dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
+ static FT_Int
+ af_find_second_highest_contour( AF_GlyphHints hints )
+ {
+ FT_Int highest_contour;
+ FT_Pos highest_min_y;
- if ( vertical )
- {
- /* in the case of vertical hinting, always round */
- /* the stem heights to integer pixels */
+ FT_Int second_highest_contour = 0;
+ FT_Pos second_highest_max_y = FT_LONG_MIN;
- if ( dist >= 64 )
- dist = ( dist + 16 ) & ~63;
- else
- dist = 64;
- }
- else
- {
- if ( AF_LATIN_HINTS_DO_MONO( hints ) )
- {
- /* monochrome horizontal hinting: snap widths to integer pixels */
- /* with a different threshold */
+ FT_Int contour;
- if ( dist < 64 )
- dist = 64;
- else
- dist = ( dist + 32 ) & ~63;
- }
- else
- {
- /* for horizontal anti-aliased hinting, we adopt a more subtle */
- /* approach: we strengthen small stems, round stems whose size */
- /* is between 1 and 2 pixels to an integer, otherwise nothing */
- if ( dist < 48 )
- dist = ( dist + 64 ) >> 1;
+ if ( hints->num_contours < 3 )
+ return 0;
- else if ( dist < 128 )
- {
- /* We only round to an integer width if the corresponding */
- /* distortion is less than 1/4 pixel. Otherwise this */
- /* makes everything worse since the diagonals, which are */
- /* not hinted, appear a lot bolder or thinner than the */
- /* vertical stems. */
+ highest_contour = af_find_highest_contour( hints );
+ highest_min_y = hints->contour_y_minima[highest_contour];
- FT_Pos delta;
+ /* Search the contour with the largest vertical maximum that has a */
+ /* vertical minimum lower than the vertical minimum of the topmost */
+ /* contour. */
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos current_min_y;
+ FT_Pos current_max_y;
- dist = ( dist + 22 ) & ~63;
- delta = dist - org_dist;
- if ( delta < 0 )
- delta = -delta;
+ if ( contour == highest_contour )
+ continue;
- if ( delta >= 16 )
- {
- dist = org_dist;
- if ( dist < 48 )
- dist = ( dist + 64 ) >> 1;
- }
- }
- else
- /* round otherwise to prevent color fringes in LCD mode */
- dist = ( dist + 32 ) & ~63;
- }
+ current_min_y = hints->contour_y_minima[contour];
+ current_max_y = hints->contour_y_maxima[contour];
+
+ if ( current_max_y > second_highest_max_y &&
+ current_min_y < highest_min_y )
+ {
+ second_highest_max_y = current_max_y;
+ second_highest_contour = contour;
}
}
- Done_Width:
- if ( sign )
- dist = -dist;
-
- return dist;
+ return second_highest_contour;
}
- /* Align one stem edge relative to the previous stem edge. */
-
- static void
- af_latin_align_linked_edge( AF_GlyphHints hints,
- AF_Dimension dim,
- AF_Edge base_edge,
- AF_Edge stem_edge )
+ static FT_Int
+ af_find_lowest_contour( AF_GlyphHints hints )
{
- FT_Pos dist, base_delta;
- FT_Pos fitted_width;
+ FT_Int lowest_contour = 0;
+ FT_Pos lowest_min_y = FT_LONG_MAX;
+ FT_Pos lowest_max_y = FT_LONG_MIN;
+ FT_Int contour;
- dist = stem_edge->opos - base_edge->opos;
- base_delta = base_edge->pos - base_edge->opos;
- fitted_width = af_latin_compute_stem_width( hints, dim,
- dist, base_delta,
- base_edge->flags,
- stem_edge->flags );
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos current_min_y = hints->contour_y_minima[contour];
+ FT_Pos current_max_y = hints->contour_y_maxima[contour];
- stem_edge->pos = base_edge->pos + fitted_width;
+ if ( current_min_y < lowest_min_y ||
+ ( current_min_y == lowest_min_y &&
+ current_max_y < lowest_max_y ) )
+ {
+ lowest_min_y = current_min_y;
+ lowest_max_y = current_max_y;
+ lowest_contour = contour;
+ }
+ }
- FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f,"
- " dist was %.2f, now %.2f\n",
- stem_edge - hints->axis[dim].edges,
- (double)stem_edge->opos / 64, (double)stem_edge->pos / 64,
- (double)dist / 64, (double)fitted_width / 64 ));
+ return lowest_contour;
}
- /* Shift the coordinates of the `serif' edge by the same amount */
- /* as the corresponding `base' edge has been moved already. */
-
- static void
- af_latin_align_serif_edge( AF_GlyphHints hints,
- AF_Edge base,
- AF_Edge serif )
+ static FT_Int
+ af_find_second_lowest_contour( AF_GlyphHints hints )
{
- FT_UNUSED( hints );
+ FT_Int lowest_contour;
+ FT_Pos lowest_max_y;
- serif->pos = base->pos + ( serif->opos - base->opos );
+ FT_Int second_lowest_contour = 0;
+ FT_Pos second_lowest_min_y = FT_LONG_MAX;
+
+ FT_Int contour;
+
+
+ if ( hints->num_contours < 3 )
+ return 0;
+
+ lowest_contour = af_find_lowest_contour( hints );
+ lowest_max_y = hints->contour_y_maxima[lowest_contour];
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos current_min_y;
+ FT_Pos current_max_y;
+
+
+ if ( contour == lowest_contour )
+ continue;
+
+ current_min_y = hints->contour_y_minima[contour];
+ current_max_y = hints->contour_y_maxima[contour];
+
+ if ( current_min_y < second_lowest_min_y &&
+ current_max_y > lowest_max_y )
+ {
+ second_lowest_min_y = current_min_y;
+ second_lowest_contour = contour;
+ }
+ }
+
+ return second_lowest_contour;
+ }
+
+
+ /* While aligning edges to blue zones, make the auto-hinter */
+ /* ignore the ones that are higher than `pos`. */
+ static void
+ af_prevent_top_blue_alignment( AF_GlyphHints hints,
+ FT_Pos pos )
+ {
+ AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT];
+
+ AF_Edge edges = axis->edges;
+ AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges );
+ AF_Edge edge;
+
+
+ for ( edge = edges; edge < edge_limit; edge++ )
+ if ( edge->pos > pos )
+ edge->flags |= AF_EDGE_NO_BLUE;
+ }
+
+
+ static void
+ af_prevent_bottom_blue_alignment( AF_GlyphHints hints,
+ FT_Pos pos )
+ {
+ AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT];
+
+ AF_Edge edges = axis->edges;
+ AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges );
+ AF_Edge edge;
+
+
+ for ( edge = edges; edge < edge_limit; edge++ )
+ if ( edge->pos < pos )
+ edge->flags |= AF_EDGE_NO_BLUE;
+ }
+
+
+ static void
+ af_latin_get_base_glyph_blues( AF_GlyphHints hints,
+ FT_Bool is_capital,
+ AF_LatinBlue* top,
+ AF_LatinBlue* bottom )
+ {
+ AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics;
+ AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT];
+
+ FT_UInt top_flag;
+ FT_UInt bottom_flag;
+
+ FT_UInt i;
+
+
+ top_flag = is_capital ? AF_LATIN_BLUE_TOP
+ : AF_LATIN_BLUE_ADJUSTMENT;
+ top_flag |= AF_LATIN_BLUE_ACTIVE;
+
+ for ( i = 0; i < axis->blue_count; i++ )
+ if ( ( axis->blues[i].flags & top_flag ) == top_flag )
+ break;
+ if ( i < axis->blue_count )
+ *top = &axis->blues[i];
+
+ bottom_flag = is_capital ? AF_LATIN_BLUE_BOTTOM
+ : AF_LATIN_BLUE_BOTTOM_SMALL;
+ bottom_flag |= AF_LATIN_BLUE_ACTIVE;
+
+ for ( i = 0; i < axis->blue_count; i++ )
+ if ( ( axis->blues[i].flags & bottom_flag ) == bottom_flag )
+ break;
+ if ( i < axis->blue_count )
+ *bottom = &axis->blues[i];
+ }
+
+
+ /* Make the auto-hinter ignore top blue zones while aligning edges. */
+ /* This affects everything that is higher than a vertical position */
+ /* based on the lowercase or uppercase top and bottom blue zones */
+ /* (depending on `is_capital`). */
+ static void
+ af_latin_ignore_top( AF_GlyphHints hints,
+ AF_LatinBlue top_blue,
+ AF_LatinBlue bottom_blue )
+ {
+ FT_Pos base_glyph_height;
+ FT_Pos limit;
+
+
+ /* Ignore blue zones that are higher than a heuristic threshold */
+ /* (value 7 corresponds to approx. 14%, which should be sufficient */
+ /* to exceed the height of uppercase serifs. We also add a quarter */
+ /* of a pixel as a safety measure. */
+ base_glyph_height = top_blue->shoot.cur - bottom_blue->shoot.cur;
+ limit = top_blue->shoot.cur + base_glyph_height / 7 + 16;
+
+ af_prevent_top_blue_alignment( hints, limit );
+ }
+
+
+ static void
+ af_latin_ignore_bottom( AF_GlyphHints hints,
+ AF_LatinBlue top_blue,
+ AF_LatinBlue bottom_blue )
+ {
+ FT_Pos base_glyph_height;
+ FT_Pos limit;
+
+
+ base_glyph_height = top_blue->shoot.cur - bottom_blue->shoot.cur;
+ limit = bottom_blue->shoot.cur - base_glyph_height / 7 - 16;
+
+ af_prevent_bottom_blue_alignment( hints, limit );
+ }
+
+
+ static void
+ af_touch_contour( AF_GlyphHints hints,
+ FT_Int contour )
+ {
+ AF_Point first_point = hints->contours[contour];
+ AF_Point p = first_point;
+
+
+ do
+ {
+ p = p->next;
+
+ p->flags |= AF_FLAG_IGNORE;
+ if ( !( p->flags & AF_FLAG_CONTROL ) )
+ p->flags |= AF_FLAG_TOUCH_Y;
+
+ } while ( p != first_point );
+ }
+
+
+ static void
+ af_touch_top_contours( AF_GlyphHints hints,
+ FT_Int limit_contour )
+ {
+ FT_Pos limit = hints->contour_y_minima[limit_contour];
+
+ FT_Int contour;
+
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos min_y = hints->contour_y_minima[contour];
+ FT_Pos max_y = hints->contour_y_maxima[contour];
+
+
+ if ( min_y < max_y &&
+ min_y >= limit )
+ af_touch_contour( hints, contour );
+ }
+ }
+
+
+ static void
+ af_touch_bottom_contours( AF_GlyphHints hints,
+ FT_Int limit_contour )
+ {
+ FT_Pos limit = hints->contour_y_minima[limit_contour];
+
+ FT_Int contour;
+
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos min_y = hints->contour_y_minima[contour];
+ FT_Pos max_y = hints->contour_y_maxima[contour];
+
+
+ if ( min_y < max_y &&
+ max_y <= limit )
+ af_touch_contour( hints, contour );
+ }
+ }
+
+
+ /* Stretch tilde vertically, if necessary, and return the height */
+ /* difference between the original and the stretched outline. */
+ static FT_Pos
+ af_latin_stretch_top_tilde( AF_GlyphHints hints,
+ FT_Int tilde_contour )
+ {
+ AF_Point p = hints->contours[tilde_contour];
+ AF_Point first_point = p;
+
+ FT_Pos min_y = hints->contour_y_minima[tilde_contour];
+ FT_Pos max_y = hints->contour_y_maxima[tilde_contour];
+
+ FT_Pos min_measurement = FT_LONG_MAX;
+ FT_Bool measurement_taken = FALSE;
+
+ FT_Pos height;
+ FT_Pos extremum_threshold;
+ FT_Pos target_height;
+
+
+ if ( min_y == max_y )
+ return 0;
+
+ FT_TRACE4(( "af_latin_stretch_top_tilde: min y: %ld, max y: %ld\n",
+ min_y, max_y ));
+
+ height = SUB_LONG( max_y, min_y );
+ extremum_threshold = height / 8; /* Value 8 is heuristic. */
+
+ /* Find points that are local vertical round extrema, and which */
+ /* do not coincide with the vertical extreme values (i.e., we */
+ /* search for the 'other' wiggles in the tilde), then measure the */
+ /* distance to the vertical extreme values. Try to find the one */
+ /* with the smallest distance. */
+ /* */
+ /* The algorithm only works for tilde shapes that don't deviate */
+ /* from the standard shape too much. In particular, the wiggles */
+ /* must be round extrema. */
+ do
+ {
+ p = p->next;
+
+ if ( !( p->flags & AF_FLAG_CONTROL ) &&
+ p->prev->y == p->y && p->next->y == p->y &&
+ p->y != min_y && p->y != max_y &&
+ p->prev->flags & AF_FLAG_CONTROL &&
+ p->next->flags & AF_FLAG_CONTROL )
+ {
+ /* This point could be a candidate. Find the next and previous */
+ /* on-curve points, and make sure they are both either above or */
+ /* below the point, then make the measurement. */
+ AF_Point prev_on = p->prev;
+ AF_Point next_on = p->next;
+
+ FT_Pos measurement;
+
+
+ while ( prev_on->flags & AF_FLAG_CONTROL )
+ prev_on = prev_on->prev;
+ while ( next_on->flags & AF_FLAG_CONTROL )
+ next_on = next_on->next;
+
+ if ( next_on->y > p->y && prev_on->y > p->y )
+ measurement = SUB_LONG( p->y, min_y );
+ else if ( next_on->y < p->y && prev_on->y < p->y )
+ measurement = SUB_LONG( max_y, p->y );
+ else
+ continue;
+
+ /* Ignore hits that are too near to a vertical extremum. */
+ if ( measurement < extremum_threshold )
+ continue;
+
+ if ( !measurement_taken || measurement < min_measurement )
+ {
+ measurement_taken = TRUE;
+ min_measurement = measurement;
+ }
+ }
+
+ } while ( p != first_point );
+
+ if ( !measurement_taken )
+ min_measurement = 0;
+
+ FT_TRACE4(( "af_latin_stretch_top_tilde: min measurement %ld\n",
+ min_measurement ));
+
+ /* To preserve the stretched shape we prevent that the tilde */
+ /* gets auto-hinted; we do this for all contours equal or */
+ /* above the vertical minimum of `tilde_contour`. */
+ af_touch_top_contours( hints, tilde_contour );
+
+ /* XXX This is an important element of the algorithm; */
+ /* we need a description. */
+ target_height = min_measurement + 64;
+ if ( height >= target_height )
+ return 0;
+
+ /* Do the scaling. */
+ p = first_point;
+ do
+ {
+ p = p->next;
+ /* We adjust the height of the diacritic only, which means */
+ /* we are never dealing with (valid) large numbers and can */
+ /* thus avoid `FT_MulFix`. */
+ p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y,
+ min_y ),
+ target_height ) / height,
+ min_y );
+
+ } while ( p != first_point );
+
+ return target_height - height;
+ }
+
+
+ static FT_Pos
+ af_latin_stretch_bottom_tilde( AF_GlyphHints hints,
+ FT_Int tilde_contour )
+ {
+ AF_Point p = hints->contours[tilde_contour];
+ AF_Point first_point = p;
+
+ FT_Pos min_y = hints->contour_y_minima[tilde_contour];
+ FT_Pos max_y = hints->contour_y_maxima[tilde_contour];
+
+ FT_Pos min_measurement = FT_LONG_MAX;
+ FT_Bool measurement_taken = FALSE;
+
+ FT_Pos height;
+ FT_Pos extremum_threshold;
+ FT_Pos target_height;
+
+
+ if ( min_y == max_y )
+ return 0;
+
+ FT_TRACE4(( "af_latin_stretch_bottom_tilde: min y: %ld, max y: %ld\n",
+ min_y, max_y ));
+
+ height = SUB_LONG( max_y, min_y );
+ extremum_threshold = height / 8;
+
+ do
+ {
+ p = p->next;
+
+ if ( !( p->flags & AF_FLAG_CONTROL ) &&
+ p->prev->y == p->y && p->next->y == p->y &&
+ p->y != min_y && p->y != max_y &&
+ p->prev->flags & AF_FLAG_CONTROL &&
+ p->next->flags & AF_FLAG_CONTROL )
+ {
+ AF_Point prev_on = p->prev;
+ AF_Point next_on = p->next;
+
+ FT_Pos measurement;
+
+
+ while ( prev_on->flags & AF_FLAG_CONTROL )
+ prev_on = prev_on->prev;
+ while ( next_on->flags & AF_FLAG_CONTROL )
+ next_on = next_on->next;
+
+ if ( next_on->y > p->y && prev_on->y > p->y )
+ measurement = SUB_LONG( p->y, min_y );
+ else if ( next_on->y < p->y && prev_on->y < p->y )
+ measurement = SUB_LONG( max_y, p->y );
+ else
+ continue;
+
+ if ( measurement < extremum_threshold )
+ continue;
+
+ if ( !measurement_taken || measurement < min_measurement )
+ {
+ measurement_taken = TRUE;
+ min_measurement = measurement;
+ }
+ }
+
+ } while ( p != first_point );
+
+ if ( !measurement_taken )
+ min_measurement = 0;
+
+ FT_TRACE4(( "af_latin_stretch_bottom_tilde: min measurement %ld\n",
+ min_measurement ));
+
+ af_touch_bottom_contours( hints, tilde_contour );
+
+ target_height = min_measurement + 64;
+ if ( height >= target_height )
+ return 0;
+
+ p = first_point;
+ do
+ {
+ p = p->next;
+ p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y,
+ max_y ),
+ target_height ) / height,
+ max_y );
+
+ } while ( p != first_point );
+
+ return target_height - height;
+ }
+
+
+ /*
+ As part of `af_latin_stretch_top_tilde`, normally all points in the
+ tilde are marked as touched, so the existing grid fitting will leave the
+ tilde misaligned with the grid.
+
+ This function moves the tilde contour down to be grid-fitted. We assume
+ that if moving the tilde down would cause it to touch or overlap another
+ countour, the vertical adjustment step will fix it.
+
+ Because the vertical adjustment step comes after all other grid-fitting
+ steps, the top edge of the contour under the tilde is usually aligned
+ with a horizontal grid line. The vertical gap enforced by the vertical
+ adjustment is exactly one pixel, so if the top edge of the contour below
+ the tilde is on a grid line, the resulting tilde contour will also be
+ grid-aligned.
+
+ But in cases where the gap is already big enough so that the vertical
+ adjustment does nothing, this function ensures that even without the
+ intervention of the vertical adjustment step, the tilde will be
+ grid-aligned.
+
+ Return the vertical alignment amount.
+ */
+ static FT_Pos
+ af_latin_align_top_tilde( AF_GlyphHints hints,
+ FT_Int tilde_contour )
+ {
+ AF_Point p = hints->contours[tilde_contour];
+ AF_Point first_point = p;
+
+ FT_Pos min_y = p->y;
+ FT_Pos max_y = p->y;
+
+ FT_Pos min_y_rounded;
+ FT_Pos delta;
+ FT_Pos height;
+
+
+ /* Find vertical extrema of the (now stretched) tilde contour. */
+ do
+ {
+ p = p->next;
+ if ( p->y < min_y )
+ min_y = p->y;
+ if ( p->y > max_y )
+ max_y = p->y;
+
+ } while ( p != first_point );
+
+ /* Align bottom of the tilde to the grid. */
+ min_y_rounded = FT_PIX_ROUND_LONG( min_y );
+ delta = SUB_LONG( min_y_rounded, min_y );
+ height = SUB_LONG( max_y, min_y );
+
+ /* If the tilde is less than 3 pixels tall, snap the center of it */
+ /* to the grid instead of the bottom to improve readability. */
+ if ( height < 64 * 3 )
+ delta += ( FT_PIX_ROUND( height ) - height ) / 2;
+
+ af_move_contour_vertically( first_point, delta );
+
+ return delta;
+ }
+
+
+ static FT_Pos
+ af_latin_align_bottom_tilde( AF_GlyphHints hints,
+ FT_Int tilde_contour )
+ {
+ AF_Point p = hints->contours[tilde_contour];
+ AF_Point first_point = p;
+
+ FT_Pos min_y = p->y;
+ FT_Pos max_y = p->y;
+
+ FT_Pos max_y_rounded;
+ FT_Pos delta;
+ FT_Pos height;
+
+
+ do
+ {
+ p = p->next;
+ if ( p->y < min_y )
+ min_y = p->y;
+ if ( p->y > max_y )
+ max_y = p->y;
+
+ } while ( p != first_point );
+
+ max_y_rounded = FT_PIX_ROUND_LONG( max_y );
+ delta = SUB_LONG( max_y_rounded, max_y );
+ height = SUB_LONG( max_y, min_y );
+
+ if ( height < 64 * 3 )
+ delta -= ( FT_PIX_ROUND( height ) - height ) / 2;
+
+ af_move_contour_vertically( first_point, delta );
+
+ return delta;
+ }
+
+
+ /* Return 1 if the given contour overlaps horizontally with the bounding */
+ /* box of all other contours combined. This is a helper for function */
+ /* `af_glyph_hints_apply_vertical_separation_adjustments`. */
+ static FT_Bool
+ af_check_contour_horizontal_overlap( AF_GlyphHints hints,
+ FT_Int contour_index )
+ {
+ FT_Pos contour_max_x = FT_LONG_MIN;
+ FT_Pos contour_min_x = FT_LONG_MAX;
+ FT_Pos others_max_x = FT_LONG_MIN;
+ FT_Pos others_min_x = FT_LONG_MAX;
+
+ FT_Int contour;
+
+ FT_Bool horizontal_overlap;
+
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ AF_Point first_point = hints->contours[contour];
+ AF_Point p = first_point;
+
+
+ /* Ignore dimensionless contours (i.e., contours with only one or */
+ /* two points). */
+ if ( first_point->next->next == first_point )
+ continue;
+
+ do
+ {
+ p = p->next;
+
+ if ( contour == contour_index )
+ {
+ if ( p->x < contour_min_x )
+ contour_min_x = p->x;
+ if ( p->x > contour_max_x )
+ contour_max_x = p->x;
+ }
+ else
+ {
+ if ( p->x < others_min_x )
+ others_min_x = p->x;
+ if ( p->x > others_max_x )
+ others_max_x = p->x;
+ }
+ } while ( p != first_point );
+ }
+
+ horizontal_overlap =
+ ( others_min_x <= contour_max_x && contour_max_x <= others_max_x ) ||
+ ( others_min_x <= contour_min_x && contour_min_x <= others_max_x ) ||
+ ( contour_max_x >= others_max_x && contour_min_x <= others_min_x );
+
+ return horizontal_overlap;
+ }
+
+
+ static void
+ af_glyph_hints_apply_vertical_separation_adjustments(
+ AF_GlyphHints hints,
+ AF_Dimension dim,
+ FT_UInt glyph_index,
+ FT_Pos accent_height_limit,
+ FT_Hash reverse_charmap )
+ {
+ FT_Bool adjust_top = FALSE;
+ FT_Bool adjust_below_top = FALSE;
+
+ FT_Bool adjust_bottom = FALSE;
+ FT_Bool adjust_above_bottom = FALSE;
+
+ size_t* val;
+ FT_UInt32 adj_type = AF_ADJUST_NONE;
+
+
+ FT_TRACE4(( "Entering"
+ " af_glyph_hints_apply_vertical_separation_adjustments\n" ));
+
+ if ( dim != AF_DIMENSION_VERT )
+ return;
+
+ val = ft_hash_num_lookup( (FT_Int)glyph_index, reverse_charmap );
+ if ( val )
+ {
+ FT_UInt codepoint = *val;
+
+
+ adj_type = af_adjustment_database_lookup( codepoint );
+
+ if ( adj_type )
+ {
+ adjust_top = !!( adj_type & AF_ADJUST_UP );
+ adjust_below_top = !!( adj_type & AF_ADJUST_UP2 );
+
+ adjust_bottom = !!( adj_type & AF_ADJUST_DOWN );
+ adjust_above_bottom = !!( adj_type & AF_ADJUST_DOWN2 );
+ }
+ }
+
+ if ( ( ( adjust_top || adjust_bottom ) &&
+ hints->num_contours >= 2 ) ||
+ ( ( adjust_below_top || adjust_above_bottom ) &&
+ hints->num_contours >= 3 ) )
+ {
+ /* Recompute vertical extrema, this time acting on already */
+ /* auto-hinted outlines. */
+ af_compute_vertical_extrema( hints );
+ }
+
+ if ( ( adjust_top && hints->num_contours >= 2 ) ||
+ ( adjust_below_top && hints->num_contours >= 3 ) )
+ {
+ FT_Int high_contour;
+ FT_Pos high_min_y;
+ FT_Pos high_max_y;
+ FT_Pos high_height;
+
+ FT_Int tilde_contour;
+ FT_Pos tilde_min_y;
+ FT_Pos tilde_max_y;
+ FT_Pos tilde_height;
+
+ FT_Int contour;
+ FT_Bool horizontal_overlap;
+
+ FT_Pos min_distance = 64;
+ FT_Pos adjustment_amount;
+ FT_Pos calculated_amount;
+ FT_Pos centering_adjustment = 0;
+ FT_Pos pos;
+
+ FT_Bool is_top_tilde = !!( adj_type & AF_ADJUST_TILDE_TOP );
+ FT_Bool is_below_top_tilde = !!( adj_type & AF_ADJUST_TILDE_TOP2 );
+
+
+ FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+ " Applying vertical adjustment: %s\n",
+ adjust_top ? "AF_ADJUST_TOP" : "AF_ADJUST_TOP2" ));
+
+ high_contour = adjust_below_top
+ ? af_find_second_highest_contour( hints )
+ : af_find_highest_contour( hints );
+
+ /* Check for a horizontal overlap between the high contour and the */
+ /* rest. If there is no overlap, do not adjust. */
+ horizontal_overlap =
+ af_check_contour_horizontal_overlap( hints, high_contour );
+ if ( !horizontal_overlap )
+ {
+ FT_TRACE4(( " High contour does not horizontally overlap"
+ " with other contours.\n"
+ " Skipping adjustment.\n" ));
+ return;
+ }
+
+ high_min_y = hints->contour_y_minima[high_contour];
+ high_max_y = hints->contour_y_maxima[high_contour];
+ high_height = SUB_LONG( high_max_y, high_min_y );
+
+ if ( high_height > accent_height_limit )
+ {
+ FT_TRACE4(( " High contour height (%.2f) exceeds accent height"
+ " limit (%.2f).\n"
+ " Skipping adjustment.\n",
+ (double)high_height / 64,
+ (double)accent_height_limit / 64 ));
+ return;
+ }
+
+ /* If the difference between the vertical minimum of the high */
+ /* contour and the vertical maximum of another contour is less */
+ /* than a pixel, shift up the high contour to make the distance */
+ /* one pixel. */
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos min_y;
+ FT_Pos max_y;
+ FT_Pos distance;
+
+
+ if ( contour == high_contour )
+ continue;
+
+ min_y = hints->contour_y_minima[contour];
+ max_y = hints->contour_y_maxima[contour];
+
+ /* We also check that the y minimum of the 'other' contour */
+ /* is below the high contour to avoid potential false hits */
+ /* with contours enclosed in the high one. */
+ distance = SUB_LONG( high_min_y, max_y );
+ if ( distance < 64 &&
+ distance < min_distance &&
+ min_y < high_min_y )
+ min_distance = distance;
+ }
+
+ adjustment_amount = 64 - min_distance;
+
+ if ( is_top_tilde || is_below_top_tilde )
+ {
+ tilde_contour = adjust_top
+ ? high_contour
+ : ( is_below_top_tilde
+ ? high_contour
+ : af_find_highest_contour( hints ) );
+
+ tilde_min_y = hints->contour_y_minima[tilde_contour];
+ tilde_max_y = hints->contour_y_maxima[tilde_contour];
+ tilde_height = SUB_LONG( tilde_max_y, tilde_min_y);
+
+ /* The vertical separation adjustment potentially undoes a */
+ /* tilde center alignment. If it would grid-align a tilde */
+ /* less than 3 pixels in height, shift additionally to */
+ /* re-center the tilde. */
+
+ pos = ADD_LONG( high_min_y, adjustment_amount );
+ if ( adjust_below_top && is_top_tilde )
+ pos += high_height;
+
+ if ( pos % 64 == 0 && tilde_height < 3 * 64 )
+ {
+ centering_adjustment = ( FT_PIX_ROUND( tilde_height ) -
+ tilde_height ) / 2;
+
+ FT_TRACE4(( " Additional tilde centering adjustment: %ld\n",
+ centering_adjustment ));
+ }
+ }
+
+ if ( ( adjust_top && is_top_tilde ) ||
+ ( adjust_below_top && is_below_top_tilde ) )
+ calculated_amount = adjustment_amount + centering_adjustment;
+ else
+ calculated_amount = adjustment_amount;
+
+ /* allow a delta of 2/64px to handle rounding differences */
+ FT_TRACE4(( " Calculated adjustment amount: %ld%s\n",
+ calculated_amount,
+ ( calculated_amount < -2 ||
+ ( adjustment_amount > 66 && calculated_amount > 66 ) )
+ ? " (out of range [-2;66], not adjusting)" : "" ));
+
+ if ( calculated_amount != 0 &&
+ calculated_amount >= -2 &&
+ ( calculated_amount <= 66 || adjustment_amount <= 66 ) )
+ {
+ /* Value 8 is heuristic. */
+ FT_Pos height_delta = high_height / 8;
+ FT_Pos min_y_limit = SUB_LONG( high_min_y, height_delta );
+
+
+ FT_TRACE4(( " Pushing high contour %ld units up\n",
+ calculated_amount ));
+
+ /* While we use only a single contour (the 'high' one) for */
+ /* computing `adjustment_amount`, we apply it to all contours */
+ /* that are (approximately) in the same vertical range or */
+ /* higher. This covers, for example, the inner contour of */
+ /* the Czech ring accent or the second acute accent in the */
+ /* Hungarian double acute accent. */
+ af_move_contours_up( hints, min_y_limit, adjustment_amount );
+
+ if ( adjust_below_top && is_top_tilde )
+ {
+ FT_TRACE4(( " Pushing top tilde %ld units up\n",
+ centering_adjustment ));
+
+ af_move_contours_up( hints,
+ ADD_LONG( min_y_limit, high_height ),
+ centering_adjustment );
+ }
+ }
+ }
+
+ if ( ( adjust_bottom && hints->num_contours >= 2 ) ||
+ ( adjust_above_bottom && hints->num_contours >= 3 ) )
+ {
+ FT_Int low_contour;
+ FT_Pos low_min_y;
+ FT_Pos low_max_y;
+ FT_Pos low_height;
+
+ FT_Int tilde_contour;
+ FT_Pos tilde_min_y;
+ FT_Pos tilde_max_y;
+ FT_Pos tilde_height;
+
+ FT_Int contour;
+ FT_Bool horizontal_overlap;
+
+ FT_Pos min_distance = 64;
+ FT_Pos adjustment_amount;
+ FT_Pos calculated_amount;
+ FT_Pos centering_adjustment = 0;
+ FT_Pos pos;
+
+ FT_Bool is_bottom_tilde =
+ !!( adj_type & AF_ADJUST_TILDE_BOTTOM );
+ FT_Bool is_above_bottom_tilde =
+ !!( adj_type & AF_ADJUST_TILDE_BOTTOM2 );
+
+
+ FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+ " Applying vertical adjustment: %s\n",
+ adjust_bottom ? "AF_ADJUST_DOWN": "AF_ADJUST_DOWN2" ));
+
+ low_contour = adjust_above_bottom
+ ? af_find_second_lowest_contour( hints )
+ : af_find_lowest_contour( hints );
+
+ horizontal_overlap =
+ af_check_contour_horizontal_overlap( hints, low_contour );
+ if ( !horizontal_overlap )
+ {
+ FT_TRACE4(( " Low contour does not horizontally overlap"
+ " with other contours.\n"
+ " Skipping adjustment.\n" ));
+ return;
+ }
+
+ low_min_y = hints->contour_y_minima[low_contour];
+ low_max_y = hints->contour_y_maxima[low_contour];
+ low_height = SUB_LONG( low_max_y, low_min_y );
+
+ if ( low_height > accent_height_limit )
+ {
+ FT_TRACE4(( " Low contour height (%.2f) exceeds accent height"
+ " limit (%.2f).\n"
+ " Skipping adjustment.\n",
+ (double)low_height / 64,
+ (double)accent_height_limit / 64 ));
+ return;
+ }
+
+ for ( contour = 0; contour < hints->num_contours; contour++ )
+ {
+ FT_Pos min_y;
+ FT_Pos max_y;
+ FT_Pos distance;
+
+
+ if ( contour == low_contour )
+ continue;
+
+ min_y = hints->contour_y_minima[contour];
+ max_y = hints->contour_y_maxima[contour];
+
+ distance = SUB_LONG( min_y, low_max_y );
+ if ( distance < 64 &&
+ distance < min_distance &&
+ max_y > low_max_y )
+ min_distance = distance;
+ }
+
+ adjustment_amount = 64 - min_distance;
+
+ if ( is_bottom_tilde || is_above_bottom_tilde )
+ {
+ tilde_contour = adjust_bottom
+ ? low_contour
+ : ( is_above_bottom_tilde
+ ? low_contour
+ : af_find_lowest_contour( hints ) );
+
+ tilde_min_y = hints->contour_y_minima[tilde_contour];
+ tilde_max_y = hints->contour_y_maxima[tilde_contour];
+ tilde_height = SUB_LONG( tilde_max_y, tilde_min_y );
+
+ pos = SUB_LONG( low_max_y, adjustment_amount );
+ if ( adjust_above_bottom && is_bottom_tilde )
+ pos -= low_height;
+
+ if ( pos % 64 == 0 && tilde_height < 3 * 64 )
+ {
+ centering_adjustment = ( FT_PIX_ROUND( tilde_height ) -
+ tilde_height ) / 2;
+
+ FT_TRACE4(( " Additional tilde centering adjustment: %ld\n",
+ centering_adjustment ));
+ }
+ }
+
+ if ( ( adjust_bottom && is_bottom_tilde ) ||
+ ( adjust_above_bottom && is_above_bottom_tilde ) )
+ calculated_amount = adjustment_amount + centering_adjustment;
+ else
+ calculated_amount = adjustment_amount;
+
+ FT_TRACE4(( " Calculated adjustment amount: %ld%s\n",
+ calculated_amount,
+ ( calculated_amount < -2 ||
+ ( adjustment_amount > 66 && calculated_amount > 66 ) )
+ ? " (out of range [-2;66], not adjusting)" : "" ));
+
+ if ( calculated_amount != 0 &&
+ calculated_amount >= -2 &&
+ ( calculated_amount <= 66 || adjustment_amount <= 66 ) )
+ {
+ FT_Pos height_delta = low_height / 8;
+ FT_Pos max_y_limit = ADD_LONG( low_max_y, height_delta );
+
+
+ FT_TRACE4(( " Pushing low contour %ld units down\n",
+ calculated_amount ));
+
+ af_move_contours_down( hints, max_y_limit, adjustment_amount );
+
+ if ( adjust_above_bottom && is_bottom_tilde )
+ {
+ FT_TRACE4(( " Pushing bottom tilde %ld units down\n",
+ centering_adjustment ));
+
+ af_move_contours_down( hints,
+ SUB_LONG( max_y_limit, low_height ),
+ centering_adjustment );
+ }
+ }
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( !( ( ( adjust_top || adjust_bottom ) &&
+ hints->num_contours >= 2 ) ||
+ ( ( adjust_below_top || adjust_above_bottom ) &&
+ hints->num_contours >= 3 ) ) )
+ FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+ " No vertical adjustment applied\n" ));
+#endif
+
+ FT_TRACE4(( "Exiting"
+ " af_glyph_hints_apply_vertical_separation_adjustments\n" ));
+ }
+
+
+#undef FT_COMPONENT
+#define FT_COMPONENT aflatin
+
+
+ /* Compute the snapped width of a given stem, ignoring very thin ones. */
+ /* There is a lot of voodoo in this function; changing the hard-coded */
+ /* parameters influence the whole hinting process. */
+
+ static FT_Pos
+ af_latin_compute_stem_width( AF_GlyphHints hints,
+ AF_Dimension dim,
+ FT_Pos width,
+ FT_Pos base_delta,
+ FT_UInt base_flags,
+ FT_UInt stem_flags )
+ {
+ AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics;
+ AF_LatinAxis axis = &metrics->axis[dim];
+ FT_Pos dist = width;
+ FT_Int sign = 0;
+ FT_Int vertical = ( dim == AF_DIMENSION_VERT );
+
+
+ if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
+ axis->extra_light )
+ return width;
+
+ if ( dist < 0 )
+ {
+ dist = -width;
+ sign = 1;
+ }
+
+ if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
+ ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
+ {
+ /* smooth hinting process: very lightly quantize the stem width */
+
+ /* leave the widths of serifs alone */
+ if ( ( stem_flags & AF_EDGE_SERIF ) &&
+ vertical &&
+ ( dist < 3 * 64 ) )
+ goto Done_Width;
+
+ else if ( base_flags & AF_EDGE_ROUND )
+ {
+ if ( dist < 80 )
+ dist = 64;
+ }
+ else if ( dist < 56 )
+ dist = 56;
+
+ if ( axis->width_count > 0 )
+ {
+ FT_Pos delta;
+
+
+ /* compare to standard width */
+ delta = dist - axis->widths[0].cur;
+
+ if ( delta < 0 )
+ delta = -delta;
+
+ if ( delta < 40 )
+ {
+ dist = axis->widths[0].cur;
+ if ( dist < 48 )
+ dist = 48;
+
+ goto Done_Width;
+ }
+
+ if ( dist < 3 * 64 )
+ {
+ delta = dist & 63;
+ dist &= -64;
+
+ if ( delta < 10 )
+ dist += delta;
+
+ else if ( delta < 32 )
+ dist += 10;
+
+ else if ( delta < 54 )
+ dist += 54;
+
+ else
+ dist += delta;
+ }
+ else
+ {
+ /* A stem's end position depends on two values: the start */
+ /* position and the stem length. The former gets usually */
+ /* rounded to the grid, while the latter gets rounded also if it */
+ /* exceeds a certain length (see below in this function). This */
+ /* `double rounding' can lead to a great difference to the */
+ /* original, unhinted position; this normally doesn't matter for */
+ /* large PPEM values, but for small sizes it can easily make */
+ /* outlines collide. For this reason, we adjust the stem length */
+ /* by a small amount depending on the PPEM value in case the */
+ /* former and latter rounding both point into the same */
+ /* direction. */
+
+ FT_Pos bdelta = 0;
+
+
+ if ( ( ( width > 0 ) && ( base_delta > 0 ) ) ||
+ ( ( width < 0 ) && ( base_delta < 0 ) ) )
+ {
+ FT_UInt ppem = metrics->root.scaler.face->size->metrics.x_ppem;
+
+
+ if ( ppem < 10 )
+ bdelta = base_delta;
+ else if ( ppem < 30 )
+ bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20;
+
+ if ( bdelta < 0 )
+ bdelta = -bdelta;
+ }
+
+ dist = ( dist - bdelta + 32 ) & ~63;
+ }
+ }
+ }
+ else
+ {
+ /* strong hinting process: snap the stem width to integer pixels */
+
+ FT_Pos org_dist = dist;
+
+
+ dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
+
+ if ( vertical )
+ {
+ /* in the case of vertical hinting, always round */
+ /* the stem heights to integer pixels */
+
+ if ( dist >= 64 )
+ dist = ( dist + 16 ) & ~63;
+ else
+ dist = 64;
+ }
+ else
+ {
+ if ( AF_LATIN_HINTS_DO_MONO( hints ) )
+ {
+ /* monochrome horizontal hinting: snap widths to integer pixels */
+ /* with a different threshold */
+
+ if ( dist < 64 )
+ dist = 64;
+ else
+ dist = ( dist + 32 ) & ~63;
+ }
+ else
+ {
+ /* for horizontal anti-aliased hinting, we adopt a more subtle */
+ /* approach: we strengthen small stems, round stems whose size */
+ /* is between 1 and 2 pixels to an integer, otherwise nothing */
+
+ if ( dist < 48 )
+ dist = ( dist + 64 ) >> 1;
+
+ else if ( dist < 128 )
+ {
+ /* We only round to an integer width if the corresponding */
+ /* distortion is less than 1/4 pixel. Otherwise this */
+ /* makes everything worse since the diagonals, which are */
+ /* not hinted, appear a lot bolder or thinner than the */
+ /* vertical stems. */
+
+ FT_Pos delta;
+
+
+ dist = ( dist + 22 ) & ~63;
+ delta = dist - org_dist;
+ if ( delta < 0 )
+ delta = -delta;
+
+ if ( delta >= 16 )
+ {
+ dist = org_dist;
+ if ( dist < 48 )
+ dist = ( dist + 64 ) >> 1;
+ }
+ }
+ else
+ /* round otherwise to prevent color fringes in LCD mode */
+ dist = ( dist + 32 ) & ~63;
+ }
+ }
+ }
+
+ Done_Width:
+ if ( sign )
+ dist = -dist;
+
+ return dist;
+ }
+
+
+ /* Align one stem edge relative to the previous stem edge. */
+
+ static void
+ af_latin_align_linked_edge( AF_GlyphHints hints,
+ AF_Dimension dim,
+ AF_Edge base_edge,
+ AF_Edge stem_edge )
+ {
+ FT_Pos dist, base_delta;
+ FT_Pos fitted_width;
+
+
+ dist = stem_edge->opos - base_edge->opos;
+ base_delta = base_edge->pos - base_edge->opos;
+
+ fitted_width = af_latin_compute_stem_width( hints, dim,
+ dist, base_delta,
+ base_edge->flags,
+ stem_edge->flags );
+
+
+ stem_edge->pos = base_edge->pos + fitted_width;
+
+ FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f,"
+ " dist was %.2f, now %.2f\n",
+ stem_edge - hints->axis[dim].edges,
+ (double)stem_edge->opos / 64, (double)stem_edge->pos / 64,
+ (double)dist / 64, (double)fitted_width / 64 ));
+ }
+
+
+ /* Shift the coordinates of the `serif' edge by the same amount */
+ /* as the corresponding `base' edge has been moved already. */
+
+ static void
+ af_latin_align_serif_edge( AF_GlyphHints hints,
+ AF_Edge base,
+ AF_Edge serif )
+ {
+ FT_UNUSED( hints );
+
+ serif->pos = base->pos + ( serif->opos - base->opos );
}
@@ -2998,13 +4220,15 @@
af_latin_hint_edges( AF_GlyphHints hints,
AF_Dimension dim )
{
- AF_AxisHints axis = &hints->axis[dim];
- AF_Edge edges = axis->edges;
- AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges );
- FT_PtrDist n_edges;
- AF_Edge edge;
- AF_Edge anchor = NULL;
- FT_Int has_serifs = 0;
+ AF_AxisHints axis = &hints->axis[dim];
+
+ AF_Edge edges = axis->edges;
+ AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges );
+ AF_Edge edge;
+ FT_PtrDist n_edges;
+
+ AF_Edge anchor = NULL;
+ FT_Bool has_non_stem_edges = 0;
AF_StyleClass style_class = hints->metrics->style_class;
AF_ScriptClass script_class = af_script_classes[style_class->script];
@@ -3131,7 +4355,7 @@
edge2 = edge->link;
if ( !edge2 )
{
- has_serifs++;
+ has_non_stem_edges = TRUE;
continue;
}
@@ -3408,7 +4632,7 @@
}
}
- if ( has_serifs || !anchor )
+ if ( has_non_stem_edges || !anchor )
{
/*
* now hint the remaining edges (serifs and single) in order
@@ -3426,9 +4650,75 @@
if ( edge->serif )
{
+ AF_Edge e, top, bottom;
+ FT_Pos min_pos, max_pos;
+
+
+ /* Check whether we have a real serif -- if there are */
+ /* other edges with overlapping (or enclosed) segments */
+ /* between the primary and serif edge, we have not. */
+ /* */
+ /* Such a situation might happen if an accent is very */
+ /* near to its base glyph (for example, Vietnamese */
+ /* uppercase letters with two accents in `arial.ttf`), */
+ /* and the segment detection algorithm classifies the */
+ /* top of the accent incorrectly as a serif. */
delta = edge->serif->opos - edge->opos;
if ( delta < 0 )
+ {
delta = -delta;
+
+ top = edge;
+ bottom = edge->serif;
+ }
+ else
+ {
+ top = edge->serif;
+ bottom = edge;
+ }
+
+ if ( delta < 64 + 32 )
+ {
+ /* take care of outline orientation while computing extrema */
+ min_pos = FT_MIN( FT_MIN( FT_MIN( top->first->first->v,
+ top->first->last->v ),
+ FT_MIN( top->last->first->v,
+ top->last->last->v ) ),
+ FT_MIN( FT_MIN( bottom->first->first->v,
+ bottom->first->last->v ),
+ FT_MIN( bottom->last->first->v,
+ bottom->last->last->v ) ) );
+ max_pos = FT_MAX( FT_MAX( FT_MAX( top->first->first->v,
+ top->first->last->v ),
+ FT_MAX( top->last->first->v,
+ top->last->last->v ) ),
+ FT_MAX( FT_MAX( bottom->first->first->v,
+ bottom->first->last->v ),
+ FT_MAX( bottom->last->first->v,
+ bottom->last->last->v ) ) );
+
+ for ( e = bottom + 1; e < top; e++ )
+ {
+ FT_Pos e_min = FT_MIN( FT_MIN( e->first->first->v,
+ e->first->last->v ),
+ FT_MIN( e->last->first->v,
+ e->last->last->v ) );
+ FT_Pos e_max = FT_MAX( FT_MAX( e->first->first->v,
+ e->first->last->v ),
+ FT_MAX( e->last->first->v,
+ e->last->last->v ) );
+
+ if ( !( ( e_min < min_pos && e_max < min_pos ) ||
+ ( e_min > max_pos && e_max > max_pos ) ) )
+ {
+ delta = 1000; /* not a real serif */
+ break;
+ }
+ }
+
+ if ( delta == 1000 )
+ continue;
+ }
}
if ( delta < 64 + 16 )
@@ -3562,6 +4852,8 @@
AF_LatinAxis axis;
+ FT_Pos accent_height_limit = 0;
+
error = af_glyph_hints_reload( hints, outline );
if ( error )
@@ -3581,11 +4873,172 @@
if ( AF_HINTS_DO_VERTICAL( hints ) )
{
+ size_t* val;
+
+ FT_Int top_tilde_contour = 0;
+ FT_Int bottom_tilde_contour = 0;
+
+ FT_Int below_top_tilde_contour = 0;
+ FT_Int above_bottom_tilde_contour = 0;
+
+ AF_LatinBlue capital_top_blue = NULL;
+ AF_LatinBlue capital_bottom_blue = NULL;
+
+ AF_LatinBlue small_top_blue = NULL;
+ AF_LatinBlue small_bottom_blue = NULL;
+
+ FT_Bool have_flags = FALSE;
+
+ FT_Bool is_top_tilde = FALSE;
+ FT_Bool is_bottom_tilde = FALSE;
+
+ FT_Bool is_below_top_tilde = FALSE;
+ FT_Bool is_above_bottom_tilde = FALSE;
+
+ FT_Bool ignore_capital_top = FALSE;
+ FT_Bool ignore_capital_bottom = FALSE;
+
+ FT_Bool ignore_small_top = FALSE;
+ FT_Bool ignore_small_bottom = FALSE;
+
+ FT_Bool do_height_check = TRUE;
+
+ FT_Pos limit;
+ FT_Pos y_offset;
+
+
+ val = ft_hash_num_lookup( (FT_Int)glyph_index,
+ metrics->root.reverse_charmap );
+ if ( val )
+ {
+ FT_UInt codepoint = *val;
+ FT_UInt32 adj_type = af_adjustment_database_lookup( codepoint );
+
+
+ if ( adj_type )
+ {
+ have_flags = !!adj_type;
+
+ is_top_tilde = !!( adj_type & AF_ADJUST_TILDE_TOP );
+ is_bottom_tilde = !!( adj_type & AF_ADJUST_TILDE_BOTTOM );
+
+ is_below_top_tilde = !!( adj_type & AF_ADJUST_TILDE_TOP2 );
+ is_above_bottom_tilde = !!( adj_type & AF_ADJUST_TILDE_BOTTOM2 );
+
+ ignore_capital_top = !!( adj_type & AF_IGNORE_CAPITAL_TOP );
+ ignore_capital_bottom = !!( adj_type & AF_IGNORE_CAPITAL_BOTTOM );
+
+ ignore_small_top = !!( adj_type & AF_IGNORE_SMALL_TOP );
+ ignore_small_bottom = !!( adj_type & AF_IGNORE_SMALL_BOTTOM );
+
+ do_height_check = !( adj_type & AF_ADJUST_NO_HEIGHT_CHECK );
+ }
+ }
+
+ if ( is_top_tilde || is_bottom_tilde ||
+ is_below_top_tilde || is_above_bottom_tilde )
+ af_compute_vertical_extrema( hints );
+
+ /* Process inner tilde glyphs first. */
+ if ( is_below_top_tilde )
+ {
+ below_top_tilde_contour = af_find_second_highest_contour( hints );
+
+ y_offset = af_latin_stretch_top_tilde(
+ hints, below_top_tilde_contour );
+ y_offset += af_latin_align_top_tilde(
+ hints, below_top_tilde_contour );
+
+ limit = hints->contour_y_minima[below_top_tilde_contour];
+ af_move_contours_up( hints, limit, y_offset );
+ }
+ if ( is_above_bottom_tilde )
+ {
+ above_bottom_tilde_contour = af_find_second_lowest_contour( hints );
+
+ y_offset = af_latin_stretch_bottom_tilde(
+ hints, above_bottom_tilde_contour );
+ y_offset -= af_latin_align_bottom_tilde(
+ hints, above_bottom_tilde_contour );
+
+ limit = hints->contour_y_maxima[above_bottom_tilde_contour];
+ af_move_contours_down( hints, limit, y_offset );
+ }
+
+ if ( is_top_tilde )
+ {
+ top_tilde_contour = af_find_highest_contour( hints );
+
+ (void)af_latin_stretch_top_tilde( hints, top_tilde_contour );
+ (void)af_latin_align_top_tilde( hints, top_tilde_contour );
+ }
+ if ( is_bottom_tilde )
+ {
+ bottom_tilde_contour = af_find_lowest_contour( hints );
+
+ (void)af_latin_stretch_bottom_tilde( hints, bottom_tilde_contour );
+ (void)af_latin_align_bottom_tilde( hints, bottom_tilde_contour );
+ }
+
axis = &metrics->axis[AF_DIMENSION_VERT];
error = af_latin_hints_detect_features( hints,
axis->width_count,
axis->widths,
AF_DIMENSION_VERT );
+
+ if ( have_flags )
+ {
+ af_latin_get_base_glyph_blues( hints,
+ TRUE,
+ &capital_top_blue,
+ &capital_bottom_blue );
+ af_latin_get_base_glyph_blues( hints,
+ FALSE,
+ &small_top_blue,
+ &small_bottom_blue );
+
+ if ( do_height_check )
+ {
+ /* Set a heuristic limit for the accent height so that */
+ /* `af_glyph_hints_apply_vertical_separation_adjustments` */
+ /* can correctly ignore the case where an accent is */
+ /* unexpectedly not the highest (or lowest) contour. */
+
+ /* Either 2/3 of the lowercase blue zone height... */
+ if ( small_top_blue && small_bottom_blue )
+ accent_height_limit = 2 * ( small_top_blue->shoot.cur -
+ small_bottom_blue->shoot.cur ) / 3;
+ /* or 1/2 of the uppercase blue zone height... */
+ else if ( capital_top_blue && capital_bottom_blue )
+ accent_height_limit = ( capital_top_blue->shoot.cur -
+ capital_bottom_blue->shoot.cur ) / 2;
+ /* or half of the standard PostScript ascender value (8/10) */
+ /* of the EM value, scaled. */
+ else
+ accent_height_limit = FT_MulFix( metrics->units_per_em * 4 / 10,
+ metrics->root.scaler.y_scale );
+ }
+ }
+
+ if ( capital_top_blue && capital_bottom_blue )
+ {
+ if ( ignore_capital_top )
+ af_latin_ignore_top( hints,
+ capital_top_blue, capital_bottom_blue );
+ if ( ignore_capital_bottom )
+ af_latin_ignore_bottom( hints,
+ capital_top_blue, capital_bottom_blue );
+ }
+ if ( small_top_blue && small_bottom_blue )
+ {
+ if ( ignore_small_top )
+ af_latin_ignore_top( hints,
+ small_top_blue, small_bottom_blue );
+ if ( ignore_small_bottom )
+ af_latin_ignore_bottom( hints,
+ small_top_blue, small_bottom_blue );
+ }
+
if ( error )
goto Exit;
@@ -3604,6 +5057,12 @@
af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );
af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
+ af_glyph_hints_apply_vertical_separation_adjustments(
+ hints,
+ (AF_Dimension)dim,
+ glyph_index,
+ accent_height_limit,
+ metrics->root.reverse_charmap );
}
}
@@ -3632,7 +5091,7 @@
(AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, /* style_metrics_init */
(AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, /* style_metrics_scale */
- (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */
+ (AF_WritingSystem_DoneMetricsFunc) af_latin_metrics_done, /* style_metrics_done */
(AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */
(AF_WritingSystem_InitHintsFunc) af_latin_hints_init, /* style_hints_init */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h
index 54e506150214..82b4b0d480d4 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h
@@ -5,7 +5,7 @@
* Auto-fitter hinting routines for latin writing system
* (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -61,17 +61,26 @@ FT_BEGIN_HEADER
( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
#define AF_LATIN_IS_LONG_BLUE( b ) \
( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
+#define AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( b ) \
+ ( (b)->properties & AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM )
+#define AF_LATIN_IS_SMALL_BOTTOM_BLUE( b ) \
+ ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM )
#define AF_LATIN_MAX_WIDTHS 16
-#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */
-#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */
-#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */
- /* blue zone */
-#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */
-#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */
- /* optimization */
+#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */
+#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */
+#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript */
+ /* top blue zone */
+#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have a neutral blue */
+ /* zone */
+#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustm. */
+ /* optimization */
+#define AF_LATIN_BLUE_BOTTOM ( 1U << 5 ) /* we have a capital */
+ /* letter bottom blue zone */
+#define AF_LATIN_BLUE_BOTTOM_SMALL ( 1U << 6 ) /* we have a small letter */
+ /* bottom blue zone */
typedef struct AF_LatinBlueRec_
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c
index af1d59a68969..4e2ac1f1ce3f 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c
@@ -4,7 +4,7 @@
*
* Auto-fitter glyph loading routines (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -524,16 +524,18 @@
bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
bbox.yMin = FT_PIX_FLOOR( bbox.yMin );
- bbox.xMax = FT_PIX_CEIL( bbox.xMax );
- bbox.yMax = FT_PIX_CEIL( bbox.yMax );
+ bbox.xMax = FT_PIX_CEIL_LONG( bbox.xMax );
+ bbox.yMax = FT_PIX_CEIL_LONG( bbox.yMax );
- slot->metrics.width = bbox.xMax - bbox.xMin;
- slot->metrics.height = bbox.yMax - bbox.yMin;
+ slot->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin );
+ slot->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin );
slot->metrics.horiBearingX = bbox.xMin;
slot->metrics.horiBearingY = bbox.yMax;
- slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x );
- slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y );
+ slot->metrics.vertBearingX = FT_PIX_FLOOR( ADD_LONG( bbox.xMin,
+ vvector.x ) );
+ slot->metrics.vertBearingY = FT_PIX_FLOOR( ADD_LONG( bbox.yMax,
+ vvector.y ) );
/* for mono-width fonts (like Andale, Courier, etc.) we need */
/* to keep the original rounded advance width; ditto for */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h
index 99f0e15f92b6..a04b4df0b3bd 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h
@@ -4,7 +4,7 @@
*
* Auto-fitter glyph loading routines (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c b/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c
index 726f6ca2b78b..22d85a889e80 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c
@@ -4,7 +4,7 @@
*
* Auto-fitter module implementation (body).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -146,7 +146,7 @@
if ( !af_style_classes[ss] )
{
- FT_TRACE2(( "af_property_set: Invalid value %d for property `%s'\n",
+ FT_TRACE2(( "af_property_set: Invalid value %u for property `%s'\n",
*fallback_script, property_name ));
return FT_THROW( Invalid_Argument );
}
@@ -412,6 +412,11 @@
module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ ) && \
+ defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+ ft_hb_funcs_init( module );
+#endif
+
return FT_Err_Ok;
}
@@ -421,6 +426,11 @@
{
FT_UNUSED( ft_module );
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ ) && \
+ defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+ ft_hb_funcs_done( (AF_Module)ft_module );
+#endif
+
#ifdef FT_DEBUG_AUTOFIT
if ( af_debug_hints_rec_->memory )
af_glyph_hints_done( af_debug_hints_rec_ );
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h b/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h
index 91a1abfef1fd..c62421ef696f 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h
@@ -4,7 +4,7 @@
*
* Auto-fitter module implementation (specification).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,7 @@
#include
#include
+#include "ft-hb.h"
FT_BEGIN_HEADER
@@ -40,6 +41,11 @@ FT_BEGIN_HEADER
FT_Bool no_stem_darkening;
FT_Int darken_params[8];
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ ) && \
+ defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+ ft_hb_funcs_t* hb_funcs;
+#endif
+
} AF_ModuleRec, *AF_Module;
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c b/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c
index 007b43281898..fd54948f3a5b 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c
@@ -4,7 +4,7 @@
*
* Auto-fitter Unicode script ranges (body).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -73,9 +73,11 @@
{
AF_UNIRANGE_REC( 0x0600, 0x06FF ), /* Arabic */
AF_UNIRANGE_REC( 0x0750, 0x07FF ), /* Arabic Supplement */
+ AF_UNIRANGE_REC( 0x0870, 0x089F ), /* Arabic Extended-B */
AF_UNIRANGE_REC( 0x08A0, 0x08FF ), /* Arabic Extended-A */
AF_UNIRANGE_REC( 0xFB50, 0xFDFF ), /* Arabic Presentation Forms-A */
AF_UNIRANGE_REC( 0xFE70, 0xFEFF ), /* Arabic Presentation Forms-B */
+ AF_UNIRANGE_REC( 0x10EC0, 0x10EFF ), /* Arabic Extended-C */
AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ), /* Arabic Mathematical Alphabetic Symbols */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -90,8 +92,9 @@
AF_UNIRANGE_REC( 0x06DF, 0x06E4 ),
AF_UNIRANGE_REC( 0x06E7, 0x06E8 ),
AF_UNIRANGE_REC( 0x06EA, 0x06ED ),
- AF_UNIRANGE_REC( 0x08D4, 0x08E1 ),
- AF_UNIRANGE_REC( 0x08D3, 0x08FF ),
+ AF_UNIRANGE_REC( 0x0897, 0x089F ),
+ AF_UNIRANGE_REC( 0x08CA, 0x08E1 ),
+ AF_UNIRANGE_REC( 0x08E3, 0x08FF ),
AF_UNIRANGE_REC( 0xFBB2, 0xFBC1 ),
AF_UNIRANGE_REC( 0xFE70, 0xFE70 ),
AF_UNIRANGE_REC( 0xFE72, 0xFE72 ),
@@ -101,6 +104,7 @@
AF_UNIRANGE_REC( 0xFE7A, 0xFE7A ),
AF_UNIRANGE_REC( 0xFE7C, 0xFE7C ),
AF_UNIRANGE_REC( 0xFE7E, 0xFE7E ),
+ AF_UNIRANGE_REC( 0x10EFD, 0x10EFF ),
AF_UNIRANGE_REC( 0, 0 )
};
@@ -198,8 +202,9 @@
const AF_Script_UniRangeRec af_cans_uniranges[] =
{
- AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */
- AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */
+ AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */
+ AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */
+ AF_UNIRANGE_REC( 0x11AB0, 0x11ABF ), /* Unified Canadian Aboriginal Syllabics Extended-A */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -259,6 +264,9 @@
};
+ /* TODO: Split off data for new 'cyrb' (subscript) and 'cyrp' */
+ /* (superscript) groups (mainly from the Extended-D block), */
+ /* in analogy to 'latb' and 'latp'? */
const AF_Script_UniRangeRec af_cyrl_uniranges[] =
{
AF_UNIRANGE_REC( 0x0400, 0x04FF ), /* Cyrillic */
@@ -266,6 +274,7 @@
AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), /* Cyrillic Extended-A */
AF_UNIRANGE_REC( 0xA640, 0xA69F ), /* Cyrillic Extended-B */
AF_UNIRANGE_REC( 0x1C80, 0x1C8F ), /* Cyrillic Extended-C */
+ AF_UNIRANGE_REC( 0x1E030, 0x1E08F ), /* Cyrillic Extended-D */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -285,15 +294,16 @@
const AF_Script_UniRangeRec af_deva_uniranges[] =
{
- AF_UNIRANGE_REC( 0x0900, 0x093B ), /* Devanagari */
+ AF_UNIRANGE_REC( 0x0900, 0x093B ), /* Devanagari */
/* omitting U+093C nukta */
- AF_UNIRANGE_REC( 0x093D, 0x0950 ), /* ... continued */
+ AF_UNIRANGE_REC( 0x093D, 0x0950 ), /* ... continued */
/* omitting U+0951 udatta, U+0952 anudatta */
- AF_UNIRANGE_REC( 0x0953, 0x0963 ), /* ... continued */
+ AF_UNIRANGE_REC( 0x0953, 0x0963 ), /* ... continued */
/* omitting U+0964 danda, U+0965 double danda */
- AF_UNIRANGE_REC( 0x0966, 0x097F ), /* ... continued */
- AF_UNIRANGE_REC( 0x20B9, 0x20B9 ), /* (new) Rupee sign */
- AF_UNIRANGE_REC( 0xA8E0, 0xA8FF ), /* Devanagari Extended */
+ AF_UNIRANGE_REC( 0x0966, 0x097F ), /* ... continued */
+ AF_UNIRANGE_REC( 0x20B9, 0x20B9 ), /* (new) Rupee sign */
+ AF_UNIRANGE_REC( 0xA8E0, 0xA8FF ), /* Devanagari Extended */
+ AF_UNIRANGE_REC( 0x11B00, 0x11B5F ), /* Devanagari Extended-A */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -329,6 +339,7 @@
AF_UNIRANGE_REC( 0x1380, 0x139F ), /* Ethiopic Supplement */
AF_UNIRANGE_REC( 0x2D80, 0x2DDF ), /* Ethiopic Extended */
AF_UNIRANGE_REC( 0xAB00, 0xAB2F ), /* Ethiopic Extended-A */
+ AF_UNIRANGE_REC( 0x1E7E0, 0x1E7FF ), /* Ethiopic Extended-B */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -534,7 +545,7 @@
{
AF_UNIRANGE_REC( 0x0EB1, 0x0EB1 ),
AF_UNIRANGE_REC( 0x0EB4, 0x0EBC ),
- AF_UNIRANGE_REC( 0x0EC8, 0x0ECD ),
+ AF_UNIRANGE_REC( 0x0EC8, 0x0ECE ),
AF_UNIRANGE_REC( 0, 0 )
};
@@ -567,12 +578,15 @@
AF_UNIRANGE_REC( 0x2C7E, 0x2C7F ), /* ... continued */
AF_UNIRANGE_REC( 0x2E00, 0x2E7F ), /* Supplemental Punctuation */
AF_UNIRANGE_REC( 0xA720, 0xA76F ), /* Latin Extended-D */
- AF_UNIRANGE_REC( 0xA771, 0xA7F7 ), /* ... continued */
+ AF_UNIRANGE_REC( 0xA771, 0xA7F0 ), /* ... continued */
+ AF_UNIRANGE_REC( 0xA7F2, 0xA7F7 ), /* ... continued */
AF_UNIRANGE_REC( 0xA7FA, 0xA7FF ), /* ... continued */
AF_UNIRANGE_REC( 0xAB30, 0xAB5B ), /* Latin Extended-E */
- AF_UNIRANGE_REC( 0xAB60, 0xAB6F ), /* ... continued */
+ AF_UNIRANGE_REC( 0xAB60, 0xAB68 ), /* ... continued */
+ AF_UNIRANGE_REC( 0xAB6A, 0xAB6F ), /* ... continued */
AF_UNIRANGE_REC( 0xFB00, 0xFB06 ), /* Alphab. Present. Forms (Latin Ligs) */
AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ), /* Mathematical Alphanumeric Symbols */
+ AF_UNIRANGE_REC( 0x1DF00, 0x1DFFF ), /* Latin Extended-G */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -588,7 +602,7 @@
AF_UNIRANGE_REC( 0x02B9, 0x02DF ),
AF_UNIRANGE_REC( 0x02E5, 0x02FF ),
AF_UNIRANGE_REC( 0x0300, 0x036F ),
- AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ),
+ AF_UNIRANGE_REC( 0x1AB0, 0x1AEB ),
AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ),
AF_UNIRANGE_REC( 0x2017, 0x2017 ),
AF_UNIRANGE_REC( 0x203E, 0x203E ),
@@ -625,8 +639,11 @@
AF_UNIRANGE_REC( 0x2070, 0x207F ), /* superscript digits and letters */
AF_UNIRANGE_REC( 0x2C7D, 0x2C7D ), /* modifier letter capital v */
AF_UNIRANGE_REC( 0xA770, 0xA770 ), /* modifier letter us */
+ AF_UNIRANGE_REC( 0xA7F1, 0xA7F1 ), /* modifier letter capital s */
AF_UNIRANGE_REC( 0xA7F8, 0xA7F9 ), /* more modifier letters */
AF_UNIRANGE_REC( 0xAB5C, 0xAB5F ), /* more modifier letters */
+ AF_UNIRANGE_REC( 0xAB69, 0xAB69 ), /* modifier letter small turned w */
+ AF_UNIRANGE_REC( 0x10780, 0x107FB ), /* Latin Extended-F */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -638,7 +655,8 @@
const AF_Script_UniRangeRec af_lisu_uniranges[] =
{
- AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */
+ AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */
+ AF_UNIRANGE_REC( 0x11FB0, 0x11FBF ), /* Lisu Supplement */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -696,6 +714,7 @@
AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */
AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */
AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */
+ AF_UNIRANGE_REC( 0x116D0, 0x116FF ), /* Myanmar Extended-C */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -836,6 +855,7 @@
const AF_Script_UniRangeRec af_sinh_nonbase_uniranges[] =
{
+ AF_UNIRANGE_REC( 0x0D81, 0x0D81 ),
AF_UNIRANGE_REC( 0x0DCA, 0x0DCA ),
AF_UNIRANGE_REC( 0x0DD2, 0x0DD6 ),
AF_UNIRANGE_REC( 0, 0 )
@@ -859,7 +879,8 @@
const AF_Script_UniRangeRec af_taml_uniranges[] =
{
- AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */
+ AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */
+ AF_UNIRANGE_REC( 0x11FC0, 0x11FFF ), /* Tamil Supplement */
AF_UNIRANGE_REC( 0, 0 )
};
@@ -899,6 +920,7 @@
{
AF_UNIRANGE_REC( 0x0C00, 0x0C00 ),
AF_UNIRANGE_REC( 0x0C04, 0x0C04 ),
+ AF_UNIRANGE_REC( 0x0C3C, 0x0C3C ),
AF_UNIRANGE_REC( 0x0C3E, 0x0C40 ),
AF_UNIRANGE_REC( 0x0C46, 0x0C56 ),
AF_UNIRANGE_REC( 0x0C62, 0x0C63 ),
@@ -992,6 +1014,7 @@
AF_UNIRANGE_REC( 0xA806, 0xA806 ),
AF_UNIRANGE_REC( 0xA80B, 0xA80B ),
AF_UNIRANGE_REC( 0xA825, 0xA826 ),
+ AF_UNIRANGE_REC( 0xA82C, 0xA82C ),
AF_UNIRANGE_REC( 0, 0 )
};
@@ -1048,15 +1071,21 @@
AF_UNIRANGE_REC( 0xFE10, 0xFE1F ), /* Vertical forms */
AF_UNIRANGE_REC( 0xFE30, 0xFE4F ), /* CJK Compatibility Forms */
AF_UNIRANGE_REC( 0xFF00, 0xFFEF ), /* Halfwidth and Fullwidth Forms */
+ AF_UNIRANGE_REC( 0x1AFF0, 0x1AFFF ), /* Kana Extended-B */
AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ), /* Kana Supplement */
AF_UNIRANGE_REC( 0x1B100, 0x1B12F ), /* Kana Extended-A */
+ AF_UNIRANGE_REC( 0x1B130, 0x1B16F ), /* Small Kana Extension */
AF_UNIRANGE_REC( 0x1D300, 0x1D35F ), /* Tai Xuan Hing Symbols */
AF_UNIRANGE_REC( 0x20000, 0x2A6DF ), /* CJK Unified Ideographs Extension B */
AF_UNIRANGE_REC( 0x2A700, 0x2B73F ), /* CJK Unified Ideographs Extension C */
AF_UNIRANGE_REC( 0x2B740, 0x2B81F ), /* CJK Unified Ideographs Extension D */
AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ), /* CJK Unified Ideographs Extension E */
AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ), /* CJK Unified Ideographs Extension F */
+ AF_UNIRANGE_REC( 0x2EBF0, 0x2EE5D ), /* CJK Unified Ideographs Extension I */
AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ), /* CJK Compatibility Ideographs Supplement */
+ AF_UNIRANGE_REC( 0x30000, 0x3134A ), /* CJK Unified Ideographs Extension G */
+ AF_UNIRANGE_REC( 0x31350, 0x323AF ), /* CJK Unified Ideographs Extension H */
+ AF_UNIRANGE_REC( 0x323B0, 0x33479 ), /* CJK Unified Ideographs Extension J */
AF_UNIRANGE_REC( 0, 0 )
};
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h b/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h
index 813b3ee78ef6..fa00eb750469 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h
@@ -4,7 +4,7 @@
*
* Auto-fitter Unicode script ranges (specification).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h b/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h
index 0a83d771501f..5c4cbbcb922a 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h
@@ -4,7 +4,7 @@
*
* Auto-fitter scripts (specification only).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c b/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c
index df0f46ada898..f3c0744fd9d6 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c
@@ -4,7 +4,7 @@
*
* HarfBuzz interface for accessing OpenType features (body).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -22,8 +22,8 @@
#include "aftypes.h"
#include "afshaper.h"
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
/**************************************************************************
*
@@ -89,17 +89,18 @@
#define SCRIPT( s, S, d, h, H, ss ) h,
- static const hb_script_t scripts[] =
+ FT_LOCAL_ARRAY_DEF( hb_script_t )
+ af_hb_scripts[] =
{
#include "afscript.h"
};
- FT_Error
- af_shaper_get_coverage( AF_FaceGlobals globals,
- AF_StyleClass style_class,
- FT_UShort* gstyles,
- FT_Bool default_script )
+ static FT_Error
+ af_shaper_get_coverage_hb( AF_FaceGlobals globals,
+ AF_StyleClass style_class,
+ FT_UShort* gstyles,
+ FT_Bool default_script )
{
hb_face_t* face;
@@ -124,10 +125,10 @@
if ( !globals || !style_class || !gstyles )
return FT_THROW( Invalid_Argument );
- face = hb_font_get_face( globals->hb_font );
+ face = hb( font_get_face )( globals->hb_font );
coverage_tags = coverages[style_class->coverage];
- script = scripts[style_class->script];
+ script = af_hb_scripts[style_class->script];
/* Convert a HarfBuzz script tag into the corresponding OpenType */
/* tag or tags -- some Indic scripts like Devanagari have an old */
@@ -137,19 +138,19 @@
hb_tag_t tags[3];
- hb_ot_tags_from_script_and_language( script,
- HB_LANGUAGE_INVALID,
- &tags_count,
- tags,
- NULL,
- NULL );
+ hb( ot_tags_from_script_and_language )( script,
+ HB_LANGUAGE_INVALID,
+ &tags_count,
+ tags,
+ NULL,
+ NULL );
script_tags[0] = tags_count > 0 ? tags[0] : HB_TAG_NONE;
script_tags[1] = tags_count > 1 ? tags[1] : HB_TAG_NONE;
script_tags[2] = tags_count > 2 ? tags[2] : HB_TAG_NONE;
}
- /* If the second tag is HB_OT_TAG_DEFAULT_SCRIPT, change that to */
- /* HB_TAG_NONE except for the default script. */
+ /* If the second tag is HB_OT_TAG_DEFAULT_SCRIPT, change that to */
+ /* HB_TAG_NONE except for the default script. */
if ( default_script )
{
if ( script_tags[0] == HB_TAG_NONE )
@@ -170,15 +171,15 @@
goto Exit;
}
- gsub_lookups = hb_set_create();
- hb_ot_layout_collect_lookups( face,
- HB_OT_TAG_GSUB,
- script_tags,
- NULL,
- coverage_tags,
- gsub_lookups );
+ gsub_lookups = hb( set_create )();
+ hb( ot_layout_collect_lookups )( face,
+ HB_OT_TAG_GSUB,
+ script_tags,
+ NULL,
+ coverage_tags,
+ gsub_lookups );
- if ( hb_set_is_empty( gsub_lookups ) )
+ if ( hb( set_is_empty )( gsub_lookups ) )
goto Exit; /* nothing to do */
FT_TRACE4(( "GSUB lookups (style `%s'):\n",
@@ -189,22 +190,22 @@
count = 0;
#endif
- gsub_glyphs = hb_set_create();
- for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); )
+ gsub_glyphs = hb( set_create )();
+ for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_lookups, &idx ); )
{
#ifdef FT_DEBUG_LEVEL_TRACE
- FT_TRACE4(( " %d", idx ));
+ FT_TRACE4(( " %u", idx ));
count++;
#endif
/* get output coverage of GSUB feature */
- hb_ot_layout_lookup_collect_glyphs( face,
- HB_OT_TAG_GSUB,
- idx,
- NULL,
- NULL,
- NULL,
- gsub_glyphs );
+ hb( ot_layout_lookup_collect_glyphs )( face,
+ HB_OT_TAG_GSUB,
+ idx,
+ NULL,
+ NULL,
+ NULL,
+ gsub_glyphs );
}
#ifdef FT_DEBUG_LEVEL_TRACE
@@ -218,34 +219,34 @@
af_style_names[style_class->style] ));
FT_TRACE4(( " " ));
- gpos_lookups = hb_set_create();
- hb_ot_layout_collect_lookups( face,
- HB_OT_TAG_GPOS,
- script_tags,
- NULL,
- coverage_tags,
- gpos_lookups );
+ gpos_lookups = hb( set_create )();
+ hb( ot_layout_collect_lookups )( face,
+ HB_OT_TAG_GPOS,
+ script_tags,
+ NULL,
+ coverage_tags,
+ gpos_lookups );
#ifdef FT_DEBUG_LEVEL_TRACE
count = 0;
#endif
- gpos_glyphs = hb_set_create();
- for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); )
+ gpos_glyphs = hb( set_create )();
+ for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gpos_lookups, &idx ); )
{
#ifdef FT_DEBUG_LEVEL_TRACE
- FT_TRACE4(( " %d", idx ));
+ FT_TRACE4(( " %u", idx ));
count++;
#endif
/* get input coverage of GPOS feature */
- hb_ot_layout_lookup_collect_glyphs( face,
- HB_OT_TAG_GPOS,
- idx,
- NULL,
- gpos_glyphs,
- NULL,
- NULL );
+ hb( ot_layout_lookup_collect_glyphs )( face,
+ HB_OT_TAG_GPOS,
+ idx,
+ NULL,
+ gpos_glyphs,
+ NULL,
+ NULL );
}
#ifdef FT_DEBUG_LEVEL_TRACE
@@ -281,14 +282,14 @@
GET_UTF8_CHAR( ch, p );
- for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups,
- &idx ); )
+ for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_lookups,
+ &idx ); )
{
hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch );
- if ( hb_ot_layout_lookup_would_substitute( face, idx,
- &gidx, 1, 1 ) )
+ if ( hb( ot_layout_lookup_would_substitute )( face, idx,
+ &gidx, 1, 1 ) )
{
found = 1;
break;
@@ -352,14 +353,14 @@
*
*/
if ( style_class->coverage != AF_COVERAGE_DEFAULT )
- hb_set_subtract( gsub_glyphs, gpos_glyphs );
+ hb( set_subtract )( gsub_glyphs, gpos_glyphs );
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" ));
count = 0;
#endif
- for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); )
+ for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_glyphs, &idx ); )
{
#ifdef FT_DEBUG_LEVEL_TRACE
if ( !( count % 10 ) )
@@ -368,7 +369,7 @@
FT_TRACE4(( " " ));
}
- FT_TRACE4(( " %d", idx ));
+ FT_TRACE4(( " %u", idx ));
count++;
#endif
@@ -397,10 +398,10 @@
#endif
Exit:
- hb_set_destroy( gsub_lookups );
- hb_set_destroy( gsub_glyphs );
- hb_set_destroy( gpos_lookups );
- hb_set_destroy( gpos_glyphs );
+ hb( set_destroy )( gsub_lookups );
+ hb( set_destroy )( gsub_glyphs );
+ hb( set_destroy )( gpos_lookups );
+ hb( set_destroy )( gpos_glyphs );
return FT_Err_Ok;
}
@@ -437,31 +438,33 @@
};
- void*
- af_shaper_buf_create( FT_Face face )
+ static void*
+ af_shaper_buf_create_hb( AF_FaceGlobals globals )
{
- FT_UNUSED( face );
+ FT_UNUSED( globals );
- return (void*)hb_buffer_create();
+ return (void*)hb( buffer_create )();
}
- void
- af_shaper_buf_destroy( FT_Face face,
- void* buf )
+ static void
+ af_shaper_buf_destroy_hb( AF_FaceGlobals globals,
+ void* buf )
{
- FT_UNUSED( face );
+ FT_UNUSED( globals );
- hb_buffer_destroy( (hb_buffer_t*)buf );
+ hb( buffer_destroy )( (hb_buffer_t*)buf );
}
- const char*
- af_shaper_get_cluster( const char* p,
- AF_StyleMetrics metrics,
- void* buf_,
- unsigned int* count )
+ static const char*
+ af_shaper_get_cluster_hb( const char* p,
+ AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int* count )
{
+ AF_FaceGlobals globals = metrics->globals;
+
AF_StyleClass style_class;
const hb_feature_t* feature;
FT_Int upem;
@@ -472,6 +475,8 @@
hb_font_t* font;
hb_codepoint_t dummy;
+ FT_UNUSED( globals );
+
upem = (FT_Int)metrics->globals->face->units_per_EM;
style_class = metrics->style_class;
@@ -480,7 +485,7 @@
font = metrics->globals->hb_font;
/* we shape at a size of units per EM; this means font units */
- hb_font_set_scale( font, upem, upem );
+ hb( font_set_scale )( font, upem, upem );
while ( *p == ' ' )
p++;
@@ -492,15 +497,15 @@
len = (int)( q - p );
/* feed character(s) to the HarfBuzz buffer */
- hb_buffer_clear_contents( buf );
- hb_buffer_add_utf8( buf, p, len, 0, len );
+ hb( buffer_clear_contents )( buf );
+ hb( buffer_add_utf8 )( buf, p, len, 0, len );
/* we let HarfBuzz guess the script and writing direction */
- hb_buffer_guess_segment_properties( buf );
+ hb( buffer_guess_segment_properties )( buf );
/* shape buffer, which means conversion from character codes to */
/* glyph indices, possibly applying a feature */
- hb_shape( font, buf, feature, feature ? 1 : 0 );
+ hb( shape )( font, buf, feature, feature ? 1 : 0 );
if ( feature )
{
@@ -517,13 +522,13 @@
/* glyph indices; otherwise the affected glyph or glyphs aren't */
/* available at all in the feature */
- hb_buffer_clear_contents( hb_buf );
- hb_buffer_add_utf8( hb_buf, p, len, 0, len );
- hb_buffer_guess_segment_properties( hb_buf );
- hb_shape( font, hb_buf, NULL, 0 );
+ hb( buffer_clear_contents )( hb_buf );
+ hb( buffer_add_utf8 )( hb_buf, p, len, 0, len );
+ hb( buffer_guess_segment_properties )( hb_buf );
+ hb( shape )( font, hb_buf, NULL, 0 );
- ginfo = hb_buffer_get_glyph_infos( buf, &gcount );
- hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount );
+ ginfo = hb( buffer_get_glyph_infos )( buf, &gcount );
+ hb_ginfo = hb( buffer_get_glyph_infos )( hb_buf, &hb_gcount );
if ( gcount == hb_gcount )
{
@@ -537,12 +542,12 @@
if ( i == gcount )
{
/* both buffers have identical glyph indices */
- hb_buffer_clear_contents( buf );
+ hb( buffer_clear_contents )( buf );
}
}
}
- *count = hb_buffer_get_length( buf );
+ *count = hb( buffer_get_length )( buf );
#ifdef FT_DEBUG_LEVEL_TRACE
if ( feature && *count > 1 )
@@ -554,23 +559,25 @@
}
- FT_ULong
- af_shaper_get_elem( AF_StyleMetrics metrics,
- void* buf_,
- unsigned int idx,
- FT_Long* advance,
- FT_Long* y_offset )
+ static FT_ULong
+ af_shaper_get_elem_hb( AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int idx,
+ FT_Long* advance,
+ FT_Long* y_offset )
{
+ AF_FaceGlobals globals = metrics->globals;
+
hb_buffer_t* buf = (hb_buffer_t*)buf_;
hb_glyph_info_t* ginfo;
hb_glyph_position_t* gpos;
unsigned int gcount;
- FT_UNUSED( metrics );
+ FT_UNUSED( globals );
- ginfo = hb_buffer_get_glyph_infos( buf, &gcount );
- gpos = hb_buffer_get_glyph_positions( buf, &gcount );
+ ginfo = hb( buffer_get_glyph_infos )( buf, &gcount );
+ gpos = hb( buffer_get_glyph_positions )( buf, &gcount );
if ( idx >= gcount )
return 0;
@@ -584,14 +591,14 @@
}
-#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
- FT_Error
- af_shaper_get_coverage( AF_FaceGlobals globals,
- AF_StyleClass style_class,
- FT_UShort* gstyles,
- FT_Bool default_script )
+ static FT_Error
+ af_shaper_get_coverage_nohb( AF_FaceGlobals globals,
+ AF_StyleClass style_class,
+ FT_UShort* gstyles,
+ FT_Bool default_script )
{
FT_UNUSED( globals );
FT_UNUSED( style_class );
@@ -602,29 +609,29 @@
}
- void*
- af_shaper_buf_create( FT_Face face )
+ static void*
+ af_shaper_buf_create_nohb( AF_FaceGlobals globals )
{
- FT_UNUSED( face );
+ FT_UNUSED( globals );
return NULL;
}
- void
- af_shaper_buf_destroy( FT_Face face,
- void* buf )
+ static void
+ af_shaper_buf_destroy_nohb( AF_FaceGlobals globals,
+ void* buf )
{
- FT_UNUSED( face );
+ FT_UNUSED( globals );
FT_UNUSED( buf );
}
- const char*
- af_shaper_get_cluster( const char* p,
- AF_StyleMetrics metrics,
- void* buf_,
- unsigned int* count )
+ static const char*
+ af_shaper_get_cluster_nohb( const char* p,
+ AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int* count )
{
FT_Face face = metrics->globals->face;
FT_ULong ch, dummy = 0;
@@ -656,12 +663,12 @@
}
- FT_ULong
- af_shaper_get_elem( AF_StyleMetrics metrics,
- void* buf_,
- unsigned int idx,
- FT_Long* advance,
- FT_Long* y_offset )
+ static FT_ULong
+ af_shaper_get_elem_nohb( AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int idx,
+ FT_Long* advance,
+ FT_Long* y_offset )
{
FT_Face face = metrics->globals->face;
FT_ULong glyph_index = *(FT_ULong*)buf_;
@@ -684,7 +691,90 @@
}
-#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
+ /********************************************************************/
+
+ FT_Error
+ af_shaper_get_coverage( AF_FaceGlobals globals,
+ AF_StyleClass style_class,
+ FT_UShort* gstyles,
+ FT_Bool default_script )
+ {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ if ( ft_hb_enabled( globals ) )
+ return af_shaper_get_coverage_hb( globals,
+ style_class,
+ gstyles,
+ default_script );
+ else
+#endif
+ return af_shaper_get_coverage_nohb( globals,
+ style_class,
+ gstyles,
+ default_script );
+ }
+
+
+ void*
+ af_shaper_buf_create( AF_FaceGlobals globals )
+ {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ if ( ft_hb_enabled( globals ) )
+ return af_shaper_buf_create_hb( globals );
+ else
+#endif
+ return af_shaper_buf_create_nohb( globals );
+ }
+
+
+ void
+ af_shaper_buf_destroy( AF_FaceGlobals globals,
+ void* buf )
+ {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ if ( ft_hb_enabled( globals ) )
+ af_shaper_buf_destroy_hb( globals, buf );
+ else
+#endif
+ af_shaper_buf_destroy_nohb( globals, buf );
+ }
+
+
+ const char*
+ af_shaper_get_cluster( const char* p,
+ AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int* count )
+ {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ if ( ft_hb_enabled( metrics->globals ) )
+ return af_shaper_get_cluster_hb( p, metrics, buf_, count );
+ else
+#endif
+ return af_shaper_get_cluster_nohb( p, metrics, buf_, count );
+ }
+
+
+ FT_ULong
+ af_shaper_get_elem( AF_StyleMetrics metrics,
+ void* buf_,
+ unsigned int idx,
+ FT_Long* advance,
+ FT_Long* y_offset )
+ {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ if ( ft_hb_enabled( metrics->globals ) )
+ return af_shaper_get_elem_hb( metrics,
+ buf_,
+ idx,
+ advance,
+ y_offset );
+#endif
+ return af_shaper_get_elem_nohb( metrics,
+ buf_,
+ idx,
+ advance,
+ y_offset );
+ }
/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h b/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h
index 2eb03bb5d988..757368fc9c0f 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h
@@ -4,7 +4,7 @@
*
* HarfBuzz interface for accessing OpenType features (specification).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -23,17 +23,14 @@
#include
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-
-#include
-#include
-#include "ft-hb.h"
+FT_BEGIN_HEADER
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ FT_LOCAL_ARRAY( hb_script_t )
+ af_hb_scripts[];
#endif
-FT_BEGIN_HEADER
-
FT_Error
af_shaper_get_coverage( AF_FaceGlobals globals,
AF_StyleClass style_class,
@@ -42,11 +39,11 @@ FT_BEGIN_HEADER
void*
- af_shaper_buf_create( FT_Face face );
+ af_shaper_buf_create( AF_FaceGlobals globals );
void
- af_shaper_buf_destroy( FT_Face face,
- void* buf );
+ af_shaper_buf_destroy( AF_FaceGlobals globals,
+ void* buf );
const char*
af_shaper_get_cluster( const char* p,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h b/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h
index 7a33f37a8568..206232efe250 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h
@@ -4,7 +4,7 @@
*
* Auto-fitter styles (specification only).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -50,36 +50,36 @@
AF_COVERAGE_ ## C )
#undef META_STYLE_LATIN
-#define META_STYLE_LATIN( s, S, ds ) \
- STYLE_LATIN( s, S, c2cp, C2CP, ds, \
+#define META_STYLE_LATIN( s, S, ds ) \
+ STYLE_LATIN( s, S, c2cp, C2CP, ds, \
"petite capitals from capitals", \
- PETITE_CAPITALS_FROM_CAPITALS ) \
- STYLE_LATIN( s, S, c2sc, C2SC, ds, \
+ PETITE_CAPITALS_FROM_CAPITALS ) \
+ STYLE_LATIN( s, S, c2sc, C2SC, ds, \
"small capitals from capitals", \
- SMALL_CAPITALS_FROM_CAPITALS ) \
- STYLE_LATIN( s, S, ordn, ORDN, ds, \
- "ordinals", \
- ORDINALS ) \
- STYLE_LATIN( s, S, pcap, PCAP, ds, \
- "petite capitals", \
- PETITE_CAPITALS ) \
- STYLE_LATIN( s, S, sinf, SINF, ds, \
- "scientific inferiors", \
- SCIENTIFIC_INFERIORS ) \
- STYLE_LATIN( s, S, smcp, SMCP, ds, \
- "small capitals", \
- SMALL_CAPITALS ) \
- STYLE_LATIN( s, S, subs, SUBS, ds, \
- "subscript", \
- SUBSCRIPT ) \
- STYLE_LATIN( s, S, sups, SUPS, ds, \
- "superscript", \
- SUPERSCRIPT ) \
- STYLE_LATIN( s, S, titl, TITL, ds, \
- "titling", \
- TITLING ) \
- STYLE_LATIN( s, S, dflt, DFLT, ds, \
- "default", \
+ SMALL_CAPITALS_FROM_CAPITALS ) \
+ STYLE_LATIN( s, S, ordn, ORDN, ds, \
+ "ordinals", \
+ ORDINALS ) \
+ STYLE_LATIN( s, S, pcap, PCAP, ds, \
+ "petite capitals", \
+ PETITE_CAPITALS ) \
+ STYLE_LATIN( s, S, sinf, SINF, ds, \
+ "scientific inferiors", \
+ SCIENTIFIC_INFERIORS ) \
+ STYLE_LATIN( s, S, smcp, SMCP, ds, \
+ "small capitals", \
+ SMALL_CAPITALS ) \
+ STYLE_LATIN( s, S, subs, SUBS, ds, \
+ "subscript", \
+ SUBSCRIPT ) \
+ STYLE_LATIN( s, S, sups, SUPS, ds, \
+ "superscript", \
+ SUPERSCRIPT ) \
+ STYLE_LATIN( s, S, titl, TITL, ds, \
+ "titling", \
+ TITLING ) \
+ STYLE_LATIN( s, S, dflt, DFLT, ds, \
+ "default", \
DEFAULT )
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h b/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h
index 27e4185e9f85..959640a12ec2 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h
@@ -4,7 +4,7 @@
*
* Auto-fitter types (specification only).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -35,6 +35,7 @@
#include
#include
+#include
#include
#include
@@ -406,6 +407,7 @@ extern void* af_debug_hints_;
typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
+
/* This is the main structure that combines everything. Autofit modules */
/* specific to writing systems derive their structures from it, for */
/* example `AF_LatinMetrics'. */
@@ -418,6 +420,8 @@ extern void* af_debug_hints_;
AF_FaceGlobals globals; /* to access properties */
+ FT_Hash reverse_charmap;
+
} AF_StyleMetricsRec;
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h b/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h
index b78745af74e9..12fa7a27a2b5 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h
@@ -4,7 +4,7 @@
*
* Auto-fitter writing system declarations (specification only).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h b/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h
index c86d609a3523..1752697b375a 100644
--- a/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h
@@ -4,7 +4,7 @@
*
* Auto-fitter writing systems iterator (specification only).
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c b/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c
new file mode 100644
index 000000000000..3c145d046403
--- /dev/null
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c
@@ -0,0 +1,197 @@
+/****************************************************************************
+ *
+ * ft-hb.c
+ *
+ * FreeType-HarfBuzz bridge (body).
+ *
+ * Copyright (C) 2025 by
+ * Behdad Esfahbod.
+ *
+ * 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.
+ *
+ */
+
+
+#if !defined( _WIN32 ) && !defined( _GNU_SOURCE )
+# define _GNU_SOURCE 1 /* for RTLD_DEFAULT */
+#endif
+
+#include
+#include
+
+#include "afglobal.h"
+
+#include "ft-hb.h"
+
+
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ ) && \
+ defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+
+#ifndef FT_LIBHARFBUZZ
+# ifdef _WIN32
+# define FT_LIBHARFBUZZ "libharfbuzz-0.dll"
+# else
+# ifdef __APPLE__
+# define FT_LIBHARFBUZZ "libharfbuzz.0.dylib"
+# else
+# define FT_LIBHARFBUZZ "libharfbuzz.so.0"
+# endif
+# endif
+#endif
+
+#ifdef _WIN32
+
+# include
+
+#else /* !_WIN32 */
+
+# include
+
+ /* The GCC pragma suppresses the warning "ISO C forbids */
+ /* assignment between function pointer and 'void *'", which */
+ /* inevitably gets emitted with `-Wpedantic`; see the man */
+ /* page of function `dlsym` for more information. */
+# if defined( __GNUC__ )
+# pragma GCC diagnostic push
+# ifndef __cplusplus
+# pragma GCC diagnostic ignored "-Wpedantic"
+# endif
+# endif
+
+#endif /* !_WIN32 */
+
+
+ FT_LOCAL_DEF( void )
+ ft_hb_funcs_init( struct AF_ModuleRec_ *af_module )
+ {
+ FT_Memory memory = af_module->root.memory;
+ FT_Error error;
+
+ ft_hb_funcs_t *funcs = NULL;
+ ft_hb_version_atleast_func_t version_atleast = NULL;
+
+#ifdef _WIN32
+ HANDLE lib;
+# define DLSYM( lib, name ) \
+ (ft_ ## name ## _func_t)GetProcAddress( lib, #name )
+#else
+ void *lib;
+# define DLSYM( lib, name ) \
+ (ft_ ## name ## _func_t)dlsym( lib, #name )
+#endif
+
+
+ af_module->hb_funcs = NULL;
+
+ if ( FT_NEW( funcs ) )
+ return;
+ FT_ZERO( funcs );
+
+#ifdef _WIN32
+
+ lib = LoadLibraryA( FT_LIBHARFBUZZ );
+ if ( !lib )
+ goto Fail;
+ version_atleast = DLSYM( lib, hb_version_atleast );
+
+#else /* !_WIN32 */
+
+# ifdef RTLD_DEFAULT
+# define FT_RTLD_FLAGS RTLD_LAZY | RTLD_GLOBAL
+ lib = RTLD_DEFAULT;
+ version_atleast = DLSYM( lib, hb_version_atleast );
+# else
+# define FT_RTLD_FLAGS RTLD_LAZY
+# endif
+
+ if ( !version_atleast )
+ {
+ /* Load the HarfBuzz library.
+ *
+ * We never close the library, since we opened it with RTLD_GLOBAL.
+ * This is important for the case where we are using HarfBuzz as a
+ * shared library, and we want to use the symbols from the library in
+ * other shared libraries or clients. HarfBuzz holds onto global
+ * variables, and closing the library will cause them to be
+ * invalidated.
+ */
+ lib = dlopen( FT_LIBHARFBUZZ, FT_RTLD_FLAGS );
+ if ( !lib )
+ goto Fail;
+ version_atleast = DLSYM( lib, hb_version_atleast );
+ }
+
+#endif /* !_WIN32 */
+
+ if ( !version_atleast )
+ goto Fail;
+
+ /* Load all symbols we use. */
+#define HB_EXTERN( ret, name, args ) \
+ { \
+ funcs->name = DLSYM( lib, name ); \
+ if ( !funcs->name ) \
+ goto Fail; \
+ }
+#include "ft-hb-decls.h"
+#undef HB_EXTERN
+
+#undef DLSYM
+
+ af_module->hb_funcs = funcs;
+ return;
+
+ Fail:
+ if ( funcs )
+ FT_FREE( funcs );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ft_hb_funcs_done( struct AF_ModuleRec_ *af_module )
+ {
+ FT_Memory memory = af_module->root.memory;
+
+
+ if ( af_module->hb_funcs )
+ {
+ FT_FREE( af_module->hb_funcs );
+ af_module->hb_funcs = NULL;
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ ft_hb_enabled( struct AF_FaceGlobalsRec_ *globals )
+ {
+ return globals->module->hb_funcs != NULL;
+ }
+
+#ifndef _WIN32
+# if defined( __GNUC__ )
+# pragma GCC diagnostic pop
+# endif
+#endif
+
+#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+ FT_LOCAL_DEF( FT_Bool )
+ ft_hb_enabled( struct AF_FaceGlobalsRec_ *globals )
+ {
+ FT_UNUSED( globals );
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+ return TRUE;
+#else
+ return FALSE;
+#endif
+ }
+
+#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+
+/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h b/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h
new file mode 100644
index 000000000000..95914deb8d36
--- /dev/null
+++ b/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+ *
+ * ft-hb.h
+ *
+ * FreeType-HarfBuzz bridge (specification).
+ *
+ * Copyright (C) 2025 by
+ * Behdad Esfahbod.
+ *
+ * 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 FT_HB_H
+#define FT_HB_H
+
+#include
+#include
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+# include "ft-hb-types.h"
+
+# ifdef FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC
+
+# define HB_EXTERN( ret, name, args ) \
+ typedef ret (*ft_ ## name ## _func_t) args;
+# include "ft-hb-decls.h"
+# undef HB_EXTERN
+
+ typedef struct ft_hb_funcs_t
+ {
+# define HB_EXTERN( ret, name, args ) \
+ ft_ ## name ## _func_t name;
+# include "ft-hb-decls.h"
+# undef HB_EXTERN
+ } ft_hb_funcs_t;
+
+ struct AF_ModuleRec_;
+
+ FT_LOCAL( void )
+ ft_hb_funcs_init( struct AF_ModuleRec_ *af_module );
+
+ FT_LOCAL( void )
+ ft_hb_funcs_done( struct AF_ModuleRec_ *af_module );
+
+# define hb( x ) globals->module->hb_funcs->hb_ ## x
+
+# else /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+# define HB_EXTERN( ret, name, args ) \
+ ret name args;
+# include "ft-hb-decls.h"
+# undef HB_EXTERN
+
+# define hb( x ) hb_ ## x
+
+# endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+
+ struct AF_FaceGlobalsRec_;
+
+ FT_LOCAL( FT_Bool )
+ ft_hb_enabled( struct AF_FaceGlobalsRec_ *globals );
+
+
+FT_END_HEADER
+
+#endif /* FT_HB_H */
+
+
+/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c b/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c
index 717f7d08b354..7b965c62d584 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c
@@ -4,7 +4,7 @@
*
* Quick computation of advance widths (body).
*
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -20,6 +20,7 @@
#include
#include
+#include
static FT_Error
@@ -47,11 +48,43 @@
/* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */
for ( nn = 0; nn < count; nn++ )
- advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+ advances[nn] = FT_MulFix( 1024 * advances[nn], scale );
return FT_Err_Ok;
}
+ /* loading (and hinting) to calculate the advances is slow */
+ /* unless TrueType hdmx table is provided as an accelerator */
+ static FT_Error
+ ft_load_advances( FT_Face face,
+ FT_UInt gindex,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed *padvances )
+ {
+ FT_UInt nn;
+ FT_Error error = FT_Err_Ok;
+ FT_Pos factor = flags & FT_LOAD_NO_SCALE ? 1 : 1024;
+ FT_Pos* advance = flags & FT_LOAD_VERTICAL_LAYOUT
+ ? &face->glyph->advance.y
+ : &face->glyph->advance.x;
+
+
+ flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = FT_Load_Glyph( face, gindex + nn, flags );
+ if ( error )
+ break;
+
+ /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
+ padvances[nn] = *advance * factor;
+ }
+
+ return error;
+ }
+
/* at the moment, we can perform fast advance retrieval only in */
/* the following cases: */
@@ -102,7 +135,10 @@
return error;
}
- return FT_Get_Advances( face, gindex, 1, flags, padvance );
+ if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+ return FT_THROW( Unimplemented_Feature );
+
+ return ft_load_advances( face, gindex, 1, flags, padvance );
}
@@ -115,12 +151,9 @@
FT_Int32 flags,
FT_Fixed *padvances )
{
- FT_Error error = FT_Err_Ok;
-
FT_Face_GetAdvancesFunc func;
- FT_UInt num, end, nn;
- FT_Int factor;
+ FT_UInt num, end;
if ( !face )
@@ -140,6 +173,9 @@
func = face->driver->clazz->get_advances;
if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
{
+ FT_Error error;
+
+
error = func( face, start, count, flags, padvances );
if ( !error )
return ft_face_scale_advances_( face, padvances, count, flags );
@@ -148,26 +184,10 @@
return error;
}
- error = FT_Err_Ok;
-
if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
return FT_THROW( Unimplemented_Feature );
- flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
- factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024;
- for ( nn = 0; nn < count; nn++ )
- {
- error = FT_Load_Glyph( face, start + nn, flags );
- if ( error )
- break;
-
- /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
- padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
- ? face->glyph->advance.y * factor
- : face->glyph->advance.x * factor;
- }
-
- return error;
+ return ft_load_advances( face, start, count, flags, padvances );
}
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftbase.h b/src/java.desktop/share/native/libfreetype/src/base/ftbase.h
index 1d98b26dd510..66f091165fe4 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftbase.h
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftbase.h
@@ -4,7 +4,7 @@
*
* Private functions used in the `base' module (specification).
*
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
*
* This file is part of the FreeType project, and may only be used,
@@ -34,7 +34,7 @@ FT_BEGIN_HEADER
#ifdef FT_CONFIG_OPTION_MAC_FONTS
/* MacOS resource fork cannot exceed 16MB at least for Carbon code; */
- /* see https://support.microsoft.com/en-us/kb/130437 */
+ /* see https://jeffpar.github.io/kbarchive/kb/130/Q130437/ */
#define FT_MAC_RFORK_MAX_LEN 0x00FFFFFFUL
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c b/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c
index d6aa5d56df87..feccdee5dd78 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c
@@ -4,7 +4,7 @@
*
* FreeType bbox computation (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c b/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c
index 4be145679fd5..364f881e4355 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c
@@ -4,7 +4,7 @@
*
* FreeType utility functions for bitmaps (body).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -876,13 +876,13 @@
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( "FT_Bitmap_Blend:\n" ));
- FT_TRACE5(( " source bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+ FT_TRACE5(( " source bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
source_llx / 64, source_lly / 64,
source_urx / 64, source_ury / 64,
source_->width, source_->rows ));
if ( target->width && target->rows )
- FT_TRACE5(( " target bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+ FT_TRACE5(( " target bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
target_llx / 64, target_lly / 64,
target_urx / 64, target_ury / 64,
target->width, target->rows ));
@@ -890,7 +890,7 @@
FT_TRACE5(( " target bitmap: empty\n" ));
if ( final_width && final_rows )
- FT_TRACE5(( " final bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+ FT_TRACE5(( " final bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
final_llx / 64, final_lly / 64,
final_urx / 64, final_ury / 64,
final_width, final_rows ));
@@ -922,14 +922,7 @@
target->pitch = (int)final_width * 4;
target->num_grays = 256;
- if ( FT_LONG_MAX / target->pitch < (int)target->rows )
- {
- FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
- final_width, final_rows ));
- return FT_THROW( Invalid_Argument );
- }
-
- if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) )
+ if ( FT_ALLOC_MULT( target->buffer, target->rows, target->pitch ) )
return error;
free_target_bitmap_on_error = 1;
@@ -950,16 +943,9 @@
new_pitch = (int)final_width * 4;
- if ( FT_LONG_MAX / new_pitch < (int)final_rows )
- {
- FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
- final_width, final_rows ));
- return FT_THROW( Invalid_Argument );
- }
-
/* TODO: provide an in-buffer solution for large bitmaps */
/* to avoid allocation of a new buffer */
- if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) )
+ if ( FT_ALLOC_MULT( buffer, final_rows, new_pitch ) )
goto Error;
/* copy data to new buffer */
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c b/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c
index 92de09ed8770..7d6e12e2543e 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c
@@ -4,7 +4,7 @@
*
* Arithmetic computations (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -38,24 +38,11 @@
#include
#include
-
-#ifdef FT_MULFIX_ASSEMBLER
-#undef FT_MulFix
+ /* cancel inlining macro from internal/ftcalc.h */
+#ifdef FT_MulFix
+# undef FT_MulFix
#endif
-/* we need to emulate a 64-bit data type if a real one isn't available */
-
-#ifndef FT_INT64
-
- typedef struct FT_Int64_
- {
- FT_UInt32 lo;
- FT_UInt32 hi;
-
- } FT_Int64;
-
-#endif /* !FT_INT64 */
-
/**************************************************************************
*
@@ -88,7 +75,7 @@
FT_EXPORT_DEF( FT_Fixed )
FT_RoundFix( FT_Fixed a )
{
- return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL;
+ return ADD_LONG( a, 0x8000L - ( a < 0 ) ) & ~0xFFFFL;
}
@@ -97,7 +84,7 @@
FT_EXPORT_DEF( FT_Fixed )
FT_CeilFix( FT_Fixed a )
{
- return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL;
+ return ADD_LONG( a, 0xFFFFL ) & ~0xFFFFL;
}
@@ -225,18 +212,18 @@
FT_MulFix( FT_Long a_,
FT_Long b_ )
{
-#ifdef FT_MULFIX_ASSEMBLER
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
- return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ );
+ return FT_MulFix_64( a_, b_ );
#else
- FT_Int64 ab = (FT_Int64)a_ * (FT_Int64)b_;
+ FT_Int64 ab = MUL_INT64( a_, b_ );
/* this requires arithmetic right shift of signed numbers */
- return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 );
+ return (FT_Long)( ( ab + 0x8000L + ( ab >> 63 ) ) >> 16 );
-#endif /* FT_MULFIX_ASSEMBLER */
+#endif /* FT_CONFIG_OPTION_INLINE_MULFIX */
}
@@ -975,43 +962,36 @@
#else
- FT_Int result;
+ FT_Int64 z1, z2;
+ FT_Int result;
- if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L &&
- ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L )
+ if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 92681UL )
{
- FT_Long z1 = MUL_LONG( in_x, out_y );
- FT_Long z2 = MUL_LONG( in_y, out_x );
-
-
- if ( z1 > z2 )
- result = +1;
- else if ( z1 < z2 )
- result = -1;
- else
- result = 0;
+ z1.lo = (FT_UInt32)in_x * (FT_UInt32)out_y;
+ z1.hi = (FT_UInt32)( (FT_Int32)z1.lo >> 31 ); /* sign-expansion */
}
- else /* products might overflow 32 bits */
- {
- FT_Int64 z1, z2;
-
-
- /* XXX: this function does not allow 64-bit arguments */
+ else
ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 );
- ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
- if ( z1.hi > z2.hi )
- result = +1;
- else if ( z1.hi < z2.hi )
- result = -1;
- else if ( z1.lo > z2.lo )
- result = +1;
- else if ( z1.lo < z2.lo )
- result = -1;
- else
- result = 0;
+ if ( (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 92681UL )
+ {
+ z2.lo = (FT_UInt32)in_y * (FT_UInt32)out_x;
+ z2.hi = (FT_UInt32)( (FT_Int32)z2.lo >> 31 ); /* sign-expansion */
}
+ else
+ ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
+
+ if ( (FT_Int32)z1.hi > (FT_Int32)z2.hi )
+ result = +1;
+ else if ( (FT_Int32)z1.hi < (FT_Int32)z2.hi )
+ result = -1;
+ else if ( z1.lo > z2.lo )
+ result = +1;
+ else if ( z1.lo < z2.lo )
+ result = -1;
+ else
+ result = 0;
/* XXX: only the sign of return value, +1/0/-1 must be used */
return result;
@@ -1065,62 +1045,4 @@
}
- FT_BASE_DEF( FT_Int32 )
- FT_MulAddFix( FT_Fixed* s,
- FT_Int32* f,
- FT_UInt count )
- {
- FT_UInt i;
- FT_Int64 temp;
-
-
-#ifdef FT_INT64
- temp = 0;
-
- for ( i = 0; i < count; ++i )
- temp += (FT_Int64)s[i] * f[i];
-
- return (FT_Int32)( ( 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;
-
-
- FT_MOVE_SIGN( FT_UInt32, s[i], scalar, sign );
- FT_MOVE_SIGN( FT_UInt32, 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 );
- }
-
- /* Shift and round value. */
- return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) )
- + ( 1 & ( temp.lo >> 15 ) ) );
-
-
-#endif /* !FT_INT64 */
-
- }
-
-
/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftcid.c b/src/java.desktop/share/native/libfreetype/src/base/ftcid.c
index 4f2deb19a053..35cd0fcd2be7 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftcid.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftcid.c
@@ -4,7 +4,7 @@
*
* FreeType API for accessing CID font information.
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* Derek Clegg and Michael Toftdal.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c b/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c
index c6bf2a3cd1a4..90b02b7d2de9 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c
@@ -4,7 +4,7 @@
*
* FreeType's glyph color management (body).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -56,9 +56,7 @@
FT_Color* *apalette )
{
FT_Error error;
-
- TT_Face ttface;
- SFNT_Service sfnt;
+ TT_Face ttface = (TT_Face)face;
if ( !face )
@@ -72,14 +70,17 @@
return FT_Err_Ok;
}
- ttface = (TT_Face)face;
- sfnt = (SFNT_Service)ttface->sfnt;
+ if ( palette_index != ttface->palette_index )
+ {
+ SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
- error = sfnt->set_palette( ttface, palette_index );
- if ( error )
- return error;
- ttface->palette_index = palette_index;
+ error = sfnt->set_palette( ttface, palette_index );
+ if ( error )
+ return error;
+
+ ttface->palette_index = palette_index;
+ }
if ( apalette )
*apalette = ttface->palette;
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c b/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c
index 902a5dc8bbce..7f54e759b162 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c
@@ -4,7 +4,7 @@
*
* Memory debugger (body).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -139,7 +139,6 @@
} FT_MemTableRec;
-#define FT_MEM_SIZE_MIN 7
#define FT_MEM_SIZE_MAX 13845163
#define FT_FILENAME( x ) ( (x) ? (x) : "unknown file" )
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c b/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c
index 11307eaace4e..c615f29e521d 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c
@@ -4,7 +4,7 @@
*
* Debugging and logging component (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -64,7 +64,7 @@
* with the actual log message if set to true.
*
* 5. The flag `ft_timestamp_flag` prints time along with the actual log
- * message if set to ture.
+ * message if set to true.
*
* 6. `ft_have_newline_char` is used to differentiate between a log
* message with and without a trailing newline character.
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c b/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c
index 77b4089e7e27..7f4f14ffdb07 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c
@@ -4,7 +4,7 @@
*
* FreeType utility file for font formats (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c b/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c
index 1565c3b7e25a..3a95752ffaa8 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c
@@ -4,7 +4,7 @@
*
* FreeType utility file to access FSType data (body).
*
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c b/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c
index c63d30e978c6..2202240b57eb 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c
@@ -4,7 +4,7 @@
*
* Access of TrueType's `gasp' table (body).
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c b/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c
index 484d98f1722a..47781bc4d5cb 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c
@@ -4,7 +4,7 @@
*
* The FreeType glyph loader (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c b/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c
index 1b5849f99afa..6138cfeec2cc 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c
@@ -4,7 +4,7 @@
*
* FreeType convenience functions to handle glyphs (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -62,7 +62,7 @@
FT_GlyphSlot slot )
{
FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
- FT_Error error = FT_Err_Ok;
+ FT_Error error;
FT_Library library = FT_GLYPH( glyph )->library;
@@ -75,17 +75,8 @@
glyph->left = slot->bitmap_left;
glyph->top = slot->bitmap_top;
- /* do lazy copying whenever possible */
- if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
- {
- glyph->bitmap = slot->bitmap;
- slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
- }
- else
- {
- FT_Bitmap_Init( &glyph->bitmap );
- error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
- }
+ FT_Bitmap_Init( &glyph->bitmap );
+ error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
Exit:
return error;
diff --git a/src/java.desktop/share/native/libfreetype/src/base/fthash.c b/src/java.desktop/share/native/libfreetype/src/base/fthash.c
index 313bbbb4b27e..ab248ace8bd0 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/fthash.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/fthash.c
@@ -41,6 +41,7 @@
#include
#include
+#include
#define INITIAL_HT_SIZE 241
@@ -233,7 +234,8 @@
hash_insert( FT_Hashkey key,
size_t data,
FT_Hash hash,
- FT_Memory memory )
+ FT_Memory memory,
+ FT_Bool overwrite )
{
FT_Hashnode nn;
FT_Hashnode* bp = hash_bucket( key, hash );
@@ -259,7 +261,7 @@
hash->used++;
}
- else
+ else if ( overwrite )
nn->data = data;
Exit:
@@ -278,7 +280,7 @@
hk.str = key;
- return hash_insert( hk, data, hash, memory );
+ return hash_insert( hk, data, hash, memory, TRUE );
}
@@ -293,7 +295,37 @@
hk.num = num;
- return hash_insert( hk, data, hash, memory );
+ return hash_insert( hk, data, hash, memory, TRUE );
+ }
+
+
+ FT_Error
+ ft_hash_str_insert_no_overwrite( const char* key,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory )
+ {
+ FT_Hashkey hk;
+
+
+ hk.str = key;
+
+ return hash_insert( hk, data, hash, memory, FALSE );
+ }
+
+
+ FT_Error
+ ft_hash_num_insert_no_overwrite( FT_Int num,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory )
+ {
+ FT_Hashkey hk;
+
+
+ hk.num = num;
+
+ return hash_insert( hk, data, hash, memory, FALSE );
}
@@ -335,4 +367,68 @@
}
+ FT_Bool
+ ft_hash_num_iterator( FT_UInt *idx,
+ FT_Int *key,
+ size_t *value,
+ FT_Hash hash )
+ {
+ FT_Hashnode nn = NULL;
+
+
+ while ( 1 )
+ {
+ if ( *idx >= hash->size )
+ return 0;
+
+ nn = hash->table[*idx];
+ if ( nn )
+ break;
+
+ (*idx)++;
+ }
+
+ if ( key )
+ *key = nn->key.num;
+ if ( value )
+ *value = nn->data;
+
+ (*idx)++;
+
+ return 1;
+ }
+
+
+ FT_Bool
+ ft_hash_str_iterator( FT_UInt *idx,
+ const char* *key,
+ size_t *value,
+ FT_Hash hash )
+ {
+ FT_Hashnode nn = NULL;
+
+
+ while ( 1 )
+ {
+ if ( *idx >= hash->size )
+ return 0;
+
+ nn = hash->table[*idx];
+ if ( nn )
+ break;
+
+ (*idx)++;
+ }
+
+ if ( key )
+ *key = nn->key.str;
+ if ( value )
+ *value = nn->data;
+
+ (*idx)++;
+
+ return 1;
+ }
+
+
/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftinit.c b/src/java.desktop/share/native/libfreetype/src/base/ftinit.c
index 9a6c00e13efa..37d7f87bcb95 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftinit.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftinit.c
@@ -4,7 +4,7 @@
*
* FreeType initialization layer (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c b/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c
index 1e69d4da70f5..51c6fd48a1b5 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c
@@ -4,7 +4,7 @@
*
* FreeType API for color filtering of subpixel bitmap glyphs (body).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -25,264 +25,27 @@
#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-/* define USE_LEGACY to implement the legacy filter */
-#define USE_LEGACY
-
-#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
-
-
- /* add padding according to filter weights */
+ /* add padding sufficient for a 5-tap filter, */
+ /* which is 2/3 of a pixel */
FT_BASE_DEF( void )
ft_lcd_padding( FT_BBox* cbox,
FT_GlyphSlot slot,
FT_Render_Mode mode )
{
- FT_Byte* lcd_weights;
- FT_Bitmap_LcdFilterFunc lcd_filter_func;
-
-
- /* Per-face LCD filtering takes priority if set up. */
- if ( slot->face && slot->face->internal->lcd_filter_func )
- {
- lcd_weights = slot->face->internal->lcd_weights;
- lcd_filter_func = slot->face->internal->lcd_filter_func;
- }
- else
- {
- lcd_weights = slot->library->lcd_weights;
- lcd_filter_func = slot->library->lcd_filter_func;
- }
-
- if ( lcd_filter_func == ft_lcd_filter_fir )
- {
- if ( mode == FT_RENDER_MODE_LCD )
- {
- cbox->xMin -= lcd_weights[0] ? 43 :
- lcd_weights[1] ? 22 : 0;
- cbox->xMax += lcd_weights[4] ? 43 :
- lcd_weights[3] ? 22 : 0;
- }
- else if ( mode == FT_RENDER_MODE_LCD_V )
- {
- cbox->yMin -= lcd_weights[0] ? 43 :
- lcd_weights[1] ? 22 : 0;
- cbox->yMax += lcd_weights[4] ? 43 :
- lcd_weights[3] ? 22 : 0;
- }
- }
- }
-
-
- /* FIR filter used by the default and light filters */
- FT_BASE_DEF( void )
- ft_lcd_filter_fir( FT_Bitmap* bitmap,
- FT_LcdFiveTapFilter weights )
- {
- FT_UInt width = (FT_UInt)bitmap->width;
- FT_UInt height = (FT_UInt)bitmap->rows;
- FT_Int pitch = bitmap->pitch;
- FT_Byte* origin = bitmap->buffer;
- FT_Byte mode = bitmap->pixel_mode;
-
-
- /* take care of bitmap flow */
- if ( pitch > 0 && height > 0 )
- origin += pitch * (FT_Int)( height - 1 );
-
- /* horizontal in-place FIR filter */
- if ( mode == FT_PIXEL_MODE_LCD && width >= 2 )
- {
- FT_Byte* line = origin;
-
-
- /* `fir' must be at least 32 bit wide, since the sum of */
- /* the values in `weights' can exceed 0xFF */
-
- for ( ; height > 0; height--, line -= pitch )
- {
- FT_UInt fir[5];
- FT_UInt val, xx;
-
-
- val = line[0];
- fir[2] = weights[2] * val;
- fir[3] = weights[3] * val;
- fir[4] = weights[4] * val;
-
- val = line[1];
- fir[1] = fir[2] + weights[1] * val;
- fir[2] = fir[3] + weights[2] * val;
- fir[3] = fir[4] + weights[3] * val;
- fir[4] = weights[4] * val;
-
- for ( xx = 2; xx < width; xx++ )
- {
- val = line[xx];
- fir[0] = fir[1] + weights[0] * val;
- fir[1] = fir[2] + weights[1] * val;
- fir[2] = fir[3] + weights[2] * val;
- fir[3] = fir[4] + weights[3] * val;
- fir[4] = weights[4] * val;
-
- line[xx - 2] = FT_SHIFTCLAMP( fir[0] );
- }
-
- line[xx - 2] = FT_SHIFTCLAMP( fir[1] );
- line[xx - 1] = FT_SHIFTCLAMP( fir[2] );
- }
- }
-
- /* vertical in-place FIR filter */
- else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 2 )
- {
- FT_Byte* column = origin;
-
-
- for ( ; width > 0; width--, column++ )
- {
- FT_Byte* col = column;
- FT_UInt fir[5];
- FT_UInt val, yy;
-
-
- val = col[0];
- fir[2] = weights[2] * val;
- fir[3] = weights[3] * val;
- fir[4] = weights[4] * val;
- col -= pitch;
-
- val = col[0];
- fir[1] = fir[2] + weights[1] * val;
- fir[2] = fir[3] + weights[2] * val;
- fir[3] = fir[4] + weights[3] * val;
- fir[4] = weights[4] * val;
- col -= pitch;
-
- for ( yy = 2; yy < height; yy++, col -= pitch )
- {
- val = col[0];
- fir[0] = fir[1] + weights[0] * val;
- fir[1] = fir[2] + weights[1] * val;
- fir[2] = fir[3] + weights[2] * val;
- fir[3] = fir[4] + weights[3] * val;
- fir[4] = weights[4] * val;
-
- col[pitch * 2] = FT_SHIFTCLAMP( fir[0] );
- }
-
- col[pitch * 2] = FT_SHIFTCLAMP( fir[1] );
- col[pitch] = FT_SHIFTCLAMP( fir[2] );
- }
- }
- }
-
+ FT_UNUSED( slot );
-#ifdef USE_LEGACY
-
- /* intra-pixel filter used by the legacy filter */
- static void
- _ft_lcd_filter_legacy( FT_Bitmap* bitmap,
- FT_Byte* weights )
- {
- FT_UInt width = (FT_UInt)bitmap->width;
- FT_UInt height = (FT_UInt)bitmap->rows;
- FT_Int pitch = bitmap->pitch;
- FT_Byte* origin = bitmap->buffer;
- FT_Byte mode = bitmap->pixel_mode;
-
- static const unsigned int filters[3][3] =
- {
- { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
- { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
- { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
- };
-
- FT_UNUSED( weights );
-
-
- /* take care of bitmap flow */
- if ( pitch > 0 && height > 0 )
- origin += pitch * (FT_Int)( height - 1 );
-
- /* horizontal in-place intra-pixel filter */
- if ( mode == FT_PIXEL_MODE_LCD && width >= 3 )
+ if ( mode == FT_RENDER_MODE_LCD )
{
- FT_Byte* line = origin;
-
-
- for ( ; height > 0; height--, line -= pitch )
- {
- FT_UInt xx;
-
-
- for ( xx = 0; xx < width; xx += 3 )
- {
- FT_UInt r, g, b;
- FT_UInt p;
-
-
- p = line[xx];
- r = filters[0][0] * p;
- g = filters[0][1] * p;
- b = filters[0][2] * p;
-
- p = line[xx + 1];
- r += filters[1][0] * p;
- g += filters[1][1] * p;
- b += filters[1][2] * p;
-
- p = line[xx + 2];
- r += filters[2][0] * p;
- g += filters[2][1] * p;
- b += filters[2][2] * p;
-
- line[xx] = (FT_Byte)( r / 65536 );
- line[xx + 1] = (FT_Byte)( g / 65536 );
- line[xx + 2] = (FT_Byte)( b / 65536 );
- }
- }
+ cbox->xMin -= 43;
+ cbox->xMax += 43;
}
- else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 3 )
+ else if ( mode == FT_RENDER_MODE_LCD_V )
{
- FT_Byte* column = origin;
-
-
- for ( ; width > 0; width--, column++ )
- {
- FT_Byte* col = column - 2 * pitch;
-
-
- for ( ; height > 0; height -= 3, col -= 3 * pitch )
- {
- FT_UInt r, g, b;
- FT_UInt p;
-
-
- p = col[0];
- r = filters[0][0] * p;
- g = filters[0][1] * p;
- b = filters[0][2] * p;
-
- p = col[pitch];
- r += filters[1][0] * p;
- g += filters[1][1] * p;
- b += filters[1][2] * p;
-
- p = col[pitch * 2];
- r += filters[2][0] * p;
- g += filters[2][1] * p;
- b += filters[2][2] * p;
-
- col[0] = (FT_Byte)( r / 65536 );
- col[pitch] = (FT_Byte)( g / 65536 );
- col[pitch * 2] = (FT_Byte)( b / 65536 );
- }
- }
+ cbox->yMin -= 43;
+ cbox->yMax += 43;
}
}
-#endif /* USE_LEGACY */
-
/* documentation in ftlcdfil.h */
@@ -297,7 +60,6 @@
return FT_THROW( Invalid_Argument );
ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS );
- library->lcd_filter_func = ft_lcd_filter_fir;
return FT_Err_Ok;
}
@@ -321,32 +83,23 @@
switch ( filter )
{
case FT_LCD_FILTER_NONE:
- library->lcd_filter_func = NULL;
+ ft_memset( library->lcd_weights,
+ 0,
+ FT_LCD_FILTER_FIVE_TAPS );
break;
case FT_LCD_FILTER_DEFAULT:
ft_memcpy( library->lcd_weights,
default_weights,
FT_LCD_FILTER_FIVE_TAPS );
- library->lcd_filter_func = ft_lcd_filter_fir;
break;
case FT_LCD_FILTER_LIGHT:
ft_memcpy( library->lcd_weights,
light_weights,
FT_LCD_FILTER_FIVE_TAPS );
- library->lcd_filter_func = ft_lcd_filter_fir;
break;
-#ifdef USE_LEGACY
-
- case FT_LCD_FILTER_LEGACY:
- case FT_LCD_FILTER_LEGACY1:
- library->lcd_filter_func = _ft_lcd_filter_legacy;
- break;
-
-#endif
-
default:
return FT_THROW( Invalid_Argument );
}
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftmac.c b/src/java.desktop/share/native/libfreetype/src/base/ftmac.c
index e8e35627b50c..37d97be18385 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftmac.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftmac.c
@@ -8,7 +8,7 @@
* This file is for Mac OS X only; see builds/mac/ftoldmac.c for
* classic platforms built by MPW.
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftmm.c b/src/java.desktop/share/native/libfreetype/src/base/ftmm.c
index cc4ca22fba3b..9e67001406ca 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftmm.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftmm.c
@@ -4,7 +4,7 @@
*
* Multiple Master font support (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -292,6 +292,9 @@
if ( num_coords && !coords )
return FT_THROW( Invalid_Argument );
+ if ( !num_coords && !FT_IS_VARIATION( face ) )
+ return FT_Err_Ok; /* nothing to be done */
+
error = ft_face_get_mm_service( face, &service_mm );
if ( !error )
{
@@ -299,15 +302,21 @@
if ( service_mm->set_var_design )
error = service_mm->set_var_design( face, num_coords, coords );
- if ( !error || error == -1 )
+ if ( !error || error == -1 || error == -2 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
- if ( num_coords )
- face->face_flags |= FT_FACE_FLAG_VARIATION;
- else
- face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+ if ( error != -1 )
+ {
+ if ( error == -2 ) /* -2 means is_variable. */
+ {
+ face->face_flags |= FT_FACE_FLAG_VARIATION;
+ error = FT_Err_Ok;
+ }
+ else
+ face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+ }
if ( service_mm->construct_ps_name )
{
@@ -474,15 +483,21 @@
if ( service_mm->set_mm_blend )
error = service_mm->set_mm_blend( face, num_coords, coords );
- if ( !error || error == -1 )
+ if ( !error || error == -1 || error == -2 )
{
FT_Bool is_variation_old = FT_IS_VARIATION( face );
- if ( num_coords )
- face->face_flags |= FT_FACE_FLAG_VARIATION;
- else
- face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+ if ( error != -1 )
+ {
+ if ( error == -2 ) /* -2 means is_variable. */
+ {
+ face->face_flags |= FT_FACE_FLAG_VARIATION;
+ error = FT_Err_Ok;
+ }
+ else
+ face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+ }
if ( service_mm->construct_ps_name )
{
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c b/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c
index 9b97820c379e..323dd5efac2c 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c
@@ -4,7 +4,7 @@
*
* The FreeType private base classes (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -524,12 +524,28 @@
bitmap->rows = (unsigned int)height;
bitmap->pitch = pitch;
- if ( pbox.xMin < -0x8000 || pbox.xMax > 0x7FFF ||
- pbox.yMin < -0x8000 || pbox.yMax > 0x7FFF )
+ /* Flag the bounding box size unsuitable for rendering. */
+ /* FT_Renderer modules should check the return value. */
+ /* The limit is based on the ppem value when available. */
{
- FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n",
- pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax ));
- return 1;
+ FT_Face face = slot->face;
+ FT_Pos xlim = 0x8000;
+ FT_Pos ylim = 0x8000;
+
+
+ if ( face )
+ {
+ xlim = FT_MIN( xlim, 10 * face->size->metrics.x_ppem );
+ ylim = FT_MIN( ylim, 10 * face->size->metrics.y_ppem );
+ }
+
+ if ( pbox.xMin < -xlim || pbox.xMax >= xlim ||
+ pbox.yMin < -ylim || pbox.yMax >= ylim )
+ {
+ FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n",
+ pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax ));
+ return 1;
+ }
}
return 0;
@@ -549,8 +565,7 @@
FT_BASE_DEF( FT_Error )
- ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
- FT_ULong size )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot )
{
FT_Memory memory = FT_FACE_MEMORY( slot->face );
FT_Error error;
@@ -561,7 +576,10 @@
else
slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
- FT_MEM_ALLOC( slot->bitmap.buffer, size );
+ /* dimensions must be preset */
+ FT_MEM_ALLOC_MULT( slot->bitmap.buffer,
+ slot->bitmap.rows,
+ slot->bitmap.pitch );
return error;
}
@@ -905,7 +923,6 @@
FT_Library library;
FT_Bool autohint = FALSE;
FT_Module hinter;
- TT_Face ttface = (TT_Face)face;
if ( !face || !face->size || !face->glyph )
@@ -983,6 +1000,7 @@
{
FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
FT_Bool is_light_type1;
+ TT_Face ttface = (TT_Face)face;
/* only the new Adobe engine (for both CFF and Type 1) is `light'; */
@@ -994,8 +1012,7 @@
/* the check for `num_locations' assures that we actually */
/* test for instructions in a TTF and not in a CFF-based OTF */
/* */
- /* since `maxSizeOfInstructions' might be unreliable, we */
- /* check the size of the `fpgm' and `prep' tables, too -- */
+ /* we check the size of the `fpgm' and `prep' tables, too -- */
/* the assumption is that there don't exist real TTFs where */
/* both `fpgm' and `prep' tables are missing */
if ( ( mode == FT_RENDER_MODE_LIGHT &&
@@ -1003,9 +1020,8 @@
!is_light_type1 ) ) ||
( FT_IS_SFNT( face ) &&
ttface->num_locations &&
- ttface->max_profile.maxSizeOfInstructions == 0 &&
ttface->font_program_size == 0 &&
- ttface->cvt_program_size == 0 ) )
+ ttface->cvt_program_size <= 7 ) )
autohint = TRUE;
}
}
@@ -1172,9 +1188,9 @@
}
#ifdef FT_DEBUG_LEVEL_TRACE
- FT_TRACE5(( "FT_Load_Glyph: index %d, flags 0x%x\n",
+ FT_TRACE5(( "FT_Load_Glyph: index %u, flags 0x%x\n",
glyph_index, load_flags ));
- FT_TRACE5(( " bitmap %dx%d %s, %s (mode %d)\n",
+ FT_TRACE5(( " bitmap %ux%u %s, %s (mode %d)\n",
slot->bitmap.width,
slot->bitmap.rows,
slot->outline.points ?
@@ -1253,14 +1269,14 @@
FT_Driver driver = (FT_Driver)driver_;
- /* finalize client-specific data */
- if ( size->generic.finalizer )
- size->generic.finalizer( size );
-
/* finalize format-specific stuff */
if ( driver->clazz->done_size )
driver->clazz->done_size( size );
+ /* finalize client-specific data */
+ if ( size->generic.finalizer )
+ size->generic.finalizer( size );
+
FT_FREE( size->internal );
FT_FREE( size );
}
@@ -1322,10 +1338,6 @@
driver );
face->size = NULL;
- /* now discard client data */
- if ( face->generic.finalizer )
- face->generic.finalizer( face );
-
/* discard charmaps */
destroy_charmaps( face, memory );
@@ -1340,6 +1352,10 @@
face->stream = NULL;
+ /* now discard client data */
+ if ( face->generic.finalizer )
+ face->generic.finalizer( face );
+
/* get rid of it */
if ( face->internal )
{
@@ -1359,21 +1375,9 @@
}
- /**************************************************************************
- *
- * @Function:
- * find_unicode_charmap
- *
- * @Description:
- * This function finds a Unicode charmap, if there is one.
- * And if there is more than one, it tries to favour the more
- * extensive one, i.e., one that supports UCS-4 against those which
- * are limited to the BMP (said UCS-2 encoding.)
- *
- * This function is called from open_face() (just below), and also
- * from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).
- */
- static FT_Error
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Error )
find_unicode_charmap( FT_Face face )
{
FT_CharMap* first;
@@ -1427,7 +1431,10 @@
if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
cur[0]->encoding_id == TT_MS_ID_UCS_4 ) ||
( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
- cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) )
+ cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ||
+ ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+ cur[0]->encoding_id == TT_APPLE_ID_FULL_UNICODE &&
+ FT_Get_CMap_Format( cur[0] ) == 13 ) )
{
face->charmap = cur[0];
return FT_Err_Ok;
@@ -2125,7 +2132,7 @@
if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
goto Exit2;
- FT_TRACE3(( " Load POST fragment #%d (%ld byte) to buffer"
+ FT_TRACE3(( " Load POST fragment #%d (%lu byte) to buffer"
" %p + 0x%08lx\n",
i, rlen, (void*)pfb_data, pfb_pos ));
@@ -2398,7 +2405,7 @@
is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
if ( is_darwin_vfs && vfs_rfork_has_no_font )
{
- FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+ FT_TRACE3(( "Skip rule %u: darwin vfs resource fork"
" is already checked and"
" no font is found\n",
i ));
@@ -2407,7 +2414,7 @@
if ( errors[i] )
{
- FT_TRACE3(( "Error 0x%x has occurred in rule %d\n",
+ FT_TRACE3(( "Error 0x%x has occurred in rule %u\n",
errors[i], i ));
continue;
}
@@ -2415,7 +2422,7 @@
args2.flags = FT_OPEN_PATHNAME;
args2.pathname = file_names[i] ? file_names[i] : args->pathname;
- FT_TRACE3(( "Try rule %d: %s (offset=%ld) ...",
+ FT_TRACE3(( "Try rule %u: %s (offset=%ld) ...",
i, args2.pathname, offsets[i] ));
error = FT_Stream_New( library, &args2, &stream2 );
@@ -2812,11 +2819,6 @@
internal->refcount = 1;
internal->no_stem_darkening = -1;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
- /* Per-face filtering can only be set up by FT_Face_Properties */
- internal->lcd_filter_func = NULL;
-#endif
}
if ( aface )
@@ -4046,18 +4048,8 @@
}
else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS )
{
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
- if ( properties->data )
- {
- ft_memcpy( face->internal->lcd_weights,
- properties->data,
- FT_LCD_FILTER_FIVE_TAPS );
- face->internal->lcd_filter_func = ft_lcd_filter_fir;
- }
-#else
error = FT_THROW( Unimplemented_Feature );
goto Exit;
-#endif
}
else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED )
{
@@ -5044,9 +5036,9 @@
static void
Destroy_Module( FT_Module module )
{
- FT_Memory memory = module->memory;
- FT_Module_Class* clazz = module->clazz;
- FT_Library library = module->library;
+ const FT_Module_Class* clazz = module->clazz;
+ FT_Library library = module->library;
+ FT_Memory memory = module->memory;
if ( library && library->auto_hinter == module )
@@ -5125,9 +5117,9 @@
goto Exit;
/* base initialization */
+ module->clazz = clazz;
module->library = library;
module->memory = memory;
- module->clazz = (FT_Module_Class*)clazz;
/* check whether the module is a renderer - this must be performed */
/* before the normal module initialization */
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c b/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c
index ef699b3c7cd3..8a15b03eb83a 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c
@@ -4,7 +4,7 @@
*
* FreeType outline management (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c b/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c
index 2055757e023c..664bc34deea3 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c
@@ -5,7 +5,7 @@
* FreeType API for checking patented TrueType bytecode instructions
* (body). Obsolete, retained for backward compatibility.
*
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
* David Turner.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c b/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c
index 37a6cee6cc9a..0631cd63f62d 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c
@@ -5,7 +5,7 @@
* Get and set properties of PostScript drivers (body).
* See `ftdriver.h' for available properties.
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c b/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c
index dc9b043d8bb5..1e241f4f95bd 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c
@@ -4,7 +4,7 @@
*
* Embedded resource forks accessor (body).
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* Masatake YAMATO and Redhat K.K.
*
* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are
@@ -269,14 +269,8 @@
* According to Inside Macintosh: More Macintosh Toolbox,
* "Resource IDs" (1-46), there are some reserved IDs.
* However, FreeType2 is not a font synthesizer, no need
- * to check the acceptable resource ID.
+ * to check the acceptable resource ID or its attributes.
*/
- if ( temp < 0 )
- {
- error = FT_THROW( Invalid_Table );
- goto Exit;
- }
-
ref[j].offset = temp & 0xFFFFFFL;
FT_TRACE3(( " [%d]:"
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c b/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c
index f7231fd61ccd..34a67a148fc0 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c
@@ -7,7 +7,7 @@
*
* This is _not_ used to retrieve glyph names!
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftstream.c b/src/java.desktop/share/native/libfreetype/src/base/ftstream.c
index 667222461282..c04a0506def6 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftstream.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftstream.c
@@ -4,7 +4,7 @@
*
* I/O stream support (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -242,7 +242,7 @@
FT_ULong read_bytes;
- FT_TRACE7(( "FT_Stream_EnterFrame: %ld bytes\n", count ));
+ FT_TRACE7(( "FT_Stream_EnterFrame: %lu bytes\n", count ));
/* check for nested frame access */
FT_ASSERT( stream && stream->cursor == 0 );
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c b/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c
index 64f46ce43e76..591f18eaa832 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c
@@ -4,7 +4,7 @@
*
* FreeType path stroker (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -1070,7 +1070,7 @@
if ( theta == FT_ANGLE_PI2 )
theta = -rotate;
- phi = stroker->angle_in + theta + rotate;
+ phi = stroker->angle_in + theta + rotate;
FT_Vector_From_Polar( &sigma, stroker->miter_limit, theta );
@@ -1371,7 +1371,7 @@
arc[1] = *control;
arc[2] = stroker->center;
- while ( arc >= bez_stack )
+ do
{
FT_Angle angle_in, angle_out;
@@ -1524,10 +1524,12 @@
}
}
- arc -= 2;
-
stroker->angle_in = angle_out;
- }
+
+ if ( arc == bez_stack )
+ break;
+ arc -= 2;
+ } while ( 1 );
stroker->center = *to;
stroker->line_length = 0;
@@ -1577,7 +1579,7 @@
arc[2] = *control1;
arc[3] = stroker->center;
- while ( arc >= bez_stack )
+ do
{
FT_Angle angle_in, angle_mid, angle_out;
@@ -1741,10 +1743,12 @@
}
}
- arc -= 3;
-
stroker->angle_in = angle_out;
- }
+
+ if ( arc == bez_stack )
+ break;
+ arc -= 3;
+ } while ( 1 );
stroker->center = *to;
stroker->line_length = 0;
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c b/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c
index ec05bce33a9a..08bc17422021 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c
@@ -4,7 +4,7 @@
*
* FreeType synthesizing code for emboldening and slanting (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -141,7 +141,7 @@
/*
* XXX: overflow check for 16-bit system, for compatibility
* with FT_GlyphSlot_Embolden() since FreeType 2.1.10.
- * unfortunately, this function return no informations
+ * unfortunately, this function returns no information
* about the cause of error.
*/
if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c b/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c
index eee3642334f6..186119d5581d 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c
@@ -4,7 +4,7 @@
*
* ANSI-specific FreeType low-level system interface (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -280,7 +280,7 @@
stream->close = ft_ansi_stream_close;
FT_TRACE1(( "FT_Stream_Open:" ));
- FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n",
+ FT_TRACE1(( " opened `%s' (%lu bytes) successfully\n",
filepathname, stream->size ));
return FT_Err_Ok;
diff --git a/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c b/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c
index 4b1aced1cbab..29eff639c51c 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c
@@ -4,7 +4,7 @@
*
* FreeType trigonometric functions (body).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/fttype1.c b/src/java.desktop/share/native/libfreetype/src/base/fttype1.c
index cedf7c405054..77978df674da 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/fttype1.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/fttype1.c
@@ -4,7 +4,7 @@
*
* FreeType utility file for PS names support (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/base/ftutil.c b/src/java.desktop/share/native/libfreetype/src/base/ftutil.c
index b13512f87042..f83c43948936 100644
--- a/src/java.desktop/share/native/libfreetype/src/base/ftutil.c
+++ b/src/java.desktop/share/native/libfreetype/src/base/ftutil.c
@@ -4,7 +4,7 @@
*
* FreeType utility file for memory and list management (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -424,11 +424,10 @@
while ( cur )
{
FT_ListNode next = cur->next;
- void* data = cur->data;
if ( destroy )
- destroy( memory, data, user );
+ destroy( memory, cur->data, user );
FT_FREE( cur );
cur = next;
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c b/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c
index ea5f8ed28851..cb69abdb90ff 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c
@@ -4,7 +4,7 @@
*
* CFF character mapping table (cmap) support (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h b/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h
index 1dd8700cd8ba..60e16d948753 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h
@@ -4,7 +4,7 @@
*
* CFF character mapping table (cmap) support (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c
index f6ebdb3810a2..44ff44aecbd9 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c
@@ -4,7 +4,7 @@
*
* OpenType font driver implementation (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
*
* This file is part of the FreeType project, and may only be used,
@@ -121,7 +121,20 @@
kerning->y = 0;
if ( sfnt )
- kerning->x = sfnt->get_kerning( cffface, left_glyph, right_glyph );
+ {
+ /* Use 'kern' table if available since that can be faster; otherwise */
+ /* use GPOS kerning pairs if available. */
+ if ( cffface->kern_avail_bits )
+ kerning->x = sfnt->get_kerning( cffface,
+ left_glyph,
+ right_glyph );
+#ifdef TT_CONFIG_OPTION_GPOS_KERNING
+ else if ( cffface->num_gpos_lookups_kerning )
+ kerning->x = sfnt->get_gpos_kerning( cffface,
+ left_glyph,
+ right_glyph );
+#endif
+ }
return FT_Err_Ok;
}
@@ -168,25 +181,7 @@
CFF_Size cffsize = (CFF_Size)size;
- if ( !cffslot )
- return FT_THROW( Invalid_Slot_Handle );
-
- FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index ));
-
- /* check whether we want a scaled outline or bitmap */
- if ( !cffsize )
- load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
- /* reset the size object if necessary */
- if ( load_flags & FT_LOAD_NO_SCALE )
- size = NULL;
-
- if ( size )
- {
- /* these two objects must have the same parent */
- if ( size->face != slot->face )
- return FT_THROW( Invalid_Face_Handle );
- }
+ FT_TRACE1(( "cff_glyph_load: glyph index %u\n", glyph_index ));
/* now load the glyph outline if necessary */
error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags );
@@ -205,105 +200,70 @@
FT_Int32 flags,
FT_Fixed* advances )
{
- FT_UInt nn;
- FT_Error error = FT_Err_Ok;
- FT_GlyphSlot slot = face->glyph;
+ CFF_Face cffface = (CFF_Face)face;
+ FT_Bool horz;
+ FT_UInt nn;
- if ( FT_IS_SFNT( face ) )
+ if ( !FT_IS_SFNT( face ) )
+ return FT_THROW( Unimplemented_Feature );
+
+ horz = !( flags & FT_LOAD_VERTICAL_LAYOUT );
+
+ if ( horz )
{
/* OpenType 1.7 mandates that the data from `hmtx' table be used; */
/* it is no longer necessary that those values are identical to */
/* the values in the `CFF' table */
+ if ( !cffface->horizontal.number_Of_HMetrics )
+ return FT_THROW( Unimplemented_Feature );
- CFF_Face cffface = (CFF_Face)face;
- FT_Short dummy;
-
-
- if ( flags & FT_LOAD_VERTICAL_LAYOUT )
- {
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- /* no fast retrieval for blended MM fonts without VVAR table */
- if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
- !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
- return FT_THROW( Unimplemented_Feature );
+ /* no fast retrieval for blended MM fonts without HVAR table */
+ if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+ !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+ return FT_THROW( Unimplemented_Feature );
#endif
+ }
+ else /* vertical */
+ {
+ /* check whether we have data from the `vmtx' table at all; */
+ /* otherwise we extract the info from the CFF glyphstrings */
+ /* (instead of synthesizing a global value using the `OS/2' */
+ /* table) */
+ if ( !cffface->vertical_info )
+ return FT_THROW( Unimplemented_Feature );
- /* check whether we have data from the `vmtx' table at all; */
- /* otherwise we extract the info from the CFF glyphstrings */
- /* (instead of synthesizing a global value using the `OS/2' */
- /* table) */
- if ( !cffface->vertical_info )
- goto Missing_Table;
-
- for ( nn = 0; nn < count; nn++ )
- {
- FT_UShort ah;
-
-
- ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
- 1,
- start + nn,
- &dummy,
- &ah );
-
- FT_TRACE5(( " idx %d: advance height %d font unit%s\n",
- start + nn,
- ah,
- ah == 1 ? "" : "s" ));
- advances[nn] = ah;
- }
- }
- else
- {
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- /* no fast retrieval for blended MM fonts without HVAR table */
- if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
- !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
- return FT_THROW( Unimplemented_Feature );
+ /* no fast retrieval for blended MM fonts without VVAR table */
+ if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+ !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+ return FT_THROW( Unimplemented_Feature );
#endif
-
- /* check whether we have data from the `hmtx' table at all */
- if ( !cffface->horizontal.number_Of_HMetrics )
- goto Missing_Table;
-
- for ( nn = 0; nn < count; nn++ )
- {
- FT_UShort aw;
-
-
- ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
- 0,
- start + nn,
- &dummy,
- &aw );
-
- FT_TRACE5(( " idx %d: advance width %d font unit%s\n",
- start + nn,
- aw,
- aw == 1 ? "" : "s" ));
- advances[nn] = aw;
- }
- }
-
- return error;
}
- Missing_Table:
- flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
-
+ /* proceed to fast advances */
for ( nn = 0; nn < count; nn++ )
{
- error = cff_glyph_load( slot, face->size, start + nn, flags );
- if ( error )
- break;
-
- advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
- ? slot->linearVertAdvance
- : slot->linearHoriAdvance;
+ FT_UShort aw;
+ FT_Short dummy;
+
+
+ ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
+ !horz,
+ start + nn,
+ &dummy,
+ &aw );
+
+ FT_TRACE5(( " idx %u: advance %s %d font unit%s\n",
+ start + nn,
+ horz ? "width" : "height",
+ aw,
+ aw == 1 ? "" : "s" ));
+ advances[nn] = aw;
}
- return error;
+ return FT_Err_Ok;
}
@@ -496,8 +456,8 @@
dict->weight );
font_info->italic_angle = dict->italic_angle;
font_info->is_fixed_pitch = dict->is_fixed_pitch;
- font_info->underline_position = (FT_Short)dict->underline_position;
- font_info->underline_thickness = (FT_UShort)dict->underline_thickness;
+ font_info->underline_position = dict->underline_position;
+ font_info->underline_thickness = dict->underline_thickness;
cff->font_info = font_info;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h
index fd5bc37ecd42..52a1e727a6af 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h
@@ -4,7 +4,7 @@
*
* High-level OpenType driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h b/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h
index 128adc3b716b..7491886c7be8 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h
@@ -4,7 +4,7 @@
*
* CFF error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c b/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c
index cbb071abdfeb..e8bab3c1e334 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c
@@ -4,7 +4,7 @@
*
* OpenType Glyph Loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -238,24 +238,12 @@
else if ( glyph_index >= cff->num_glyphs )
return FT_THROW( Invalid_Argument );
- if ( load_flags & FT_LOAD_NO_RECURSE )
- load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
- glyph->x_scale = 0x10000L;
- glyph->y_scale = 0x10000L;
- if ( size )
- {
- glyph->x_scale = size->root.metrics.x_scale;
- glyph->y_scale = size->root.metrics.y_scale;
- }
-
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/* try to load embedded bitmap if any */
/* */
/* XXX: The convention should be emphasized in */
/* the documents because it can be confusing. */
- if ( size )
{
CFF_Face cff_face = (CFF_Face)size->root.face;
SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt;
@@ -284,9 +272,6 @@
FT_Short dummy;
- glyph->root.outline.n_points = 0;
- glyph->root.outline.n_contours = 0;
-
glyph->root.metrics.width = (FT_Pos)metrics.width * 64;
glyph->root.metrics.height = (FT_Pos)metrics.height * 64;
@@ -423,6 +408,25 @@
#endif /* FT_CONFIG_OPTION_SVG */
+ /* top-level code ensures that FT_LOAD_NO_HINTING is set */
+ /* if FT_LOAD_NO_SCALE is active */
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+ scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
+
+ glyph->hint = hinting;
+ glyph->scaled = scaled;
+
+ if ( scaled )
+ {
+ glyph->x_scale = size->root.metrics.x_scale;
+ glyph->y_scale = size->root.metrics.y_scale;
+ }
+ else
+ {
+ glyph->x_scale = 0x10000L;
+ glyph->y_scale = 0x10000L;
+ }
+
/* if we have a CID subfont, use its matrix (which has already */
/* been multiplied with the root matrix) */
@@ -457,18 +461,6 @@
font_offset = cff->top_font.font_dict.font_offset;
}
- glyph->root.outline.n_points = 0;
- glyph->root.outline.n_contours = 0;
-
- /* top-level code ensures that FT_LOAD_NO_HINTING is set */
- /* if FT_LOAD_NO_SCALE is active */
- hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
- scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
-
- glyph->hint = hinting;
- glyph->scaled = scaled;
- glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */
-
{
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face );
@@ -602,10 +594,8 @@
{
/* Now, set the metrics -- this is rather simple, as */
/* the left side bearing is the xMin, and the top side */
- /* bearing the yMax. */
-
- /* For composite glyphs, return only left side bearing and */
- /* advance width. */
+ /* bearing the yMax. For composite glyphs, return only */
+ /* left side bearing and advance width. */
if ( load_flags & FT_LOAD_NO_RECURSE )
{
FT_Slot_Internal internal = glyph->root.internal;
@@ -624,6 +614,12 @@
FT_Bool has_vertical_info;
+ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+ glyph->root.outline.flags = FT_OUTLINE_REVERSE_FILL;
+ if ( size && size->root.metrics.y_ppem < 24 )
+ glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
if ( face->horizontal.number_Of_HMetrics )
{
FT_Short horiBearingX = 0;
@@ -677,14 +673,6 @@
glyph->root.linearVertAdvance = metrics->vertAdvance;
- glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
-
- glyph->root.outline.flags = 0;
- if ( size && size->root.metrics.y_ppem < 24 )
- glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
- glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
/* apply the font matrix, if any */
if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
font_matrix.xy != 0 || font_matrix.yx != 0 )
@@ -707,7 +695,7 @@
metrics->vertAdvance += font_offset.y;
}
- if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+ if ( scaled || force_scaling )
{
/* scale the outline and the metrics */
FT_Int n;
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h b/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h
index 346d4b11c31a..662bb7cff53f 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h
@@ -4,7 +4,7 @@
*
* OpenType Glyph Loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffload.c b/src/java.desktop/share/native/libfreetype/src/cff/cffload.c
index 979fd45f6ca8..39d662eb4345 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffload.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffload.c
@@ -4,7 +4,7 @@
*
* OpenType and CFF data/program tables loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -442,7 +442,7 @@
if ( cur_offset != 0 )
{
FT_TRACE0(( "cff_index_get_pointers:"
- " invalid first offset value %ld set to zero\n",
+ " invalid first offset value %lu set to zero\n",
cur_offset ));
cur_offset = 0;
}
@@ -559,8 +559,8 @@
idx->data_offset > stream->size - off2 + 1 )
{
FT_ERROR(( "cff_index_access_element:"
- " offset to next entry (%ld)"
- " exceeds the end of stream (%ld)\n",
+ " offset to next entry (%lu)"
+ " exceeds the end of stream (%lu)\n",
off2, stream->size - idx->data_offset + 1 ));
off2 = stream->size - idx->data_offset + 1;
}
@@ -982,7 +982,7 @@
if ( glyph_sid > 0xFFFFL - nleft )
{
FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
- " nleft=%d -> %ld\n", nleft, 0xFFFFL - glyph_sid ));
+ " nleft=%u -> %ld\n", nleft, 0xFFFFL - glyph_sid ));
nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
}
@@ -1315,7 +1315,7 @@
if ( numOperands > count )
{
- FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n",
+ FT_TRACE4(( " cff_blend_doBlend: Stack underflow %u argument%s\n",
count,
count == 1 ? "" : "s" ));
@@ -1466,7 +1466,7 @@
if ( master == 0 )
{
blend->BV[master] = FT_FIXED_ONE;
- FT_TRACE4(( " build blend vector len %d\n", len ));
+ FT_TRACE4(( " build blend vector len %u\n", len ));
FT_TRACE4(( " [ %f ", blend->BV[master] / 65536.0 ));
continue;
}
@@ -2014,8 +2014,8 @@
/* set defaults */
FT_ZERO( top );
- top->underline_position = -( 100L << 16 );
- top->underline_thickness = 50L << 16;
+ top->underline_position = -100;
+ top->underline_thickness = 50;
top->charstring_type = 2;
top->font_matrix.xx = 0x10000L;
top->font_matrix.yy = 0x10000L;
@@ -2341,7 +2341,7 @@
if ( face_index > 0 && subfont_index >= font->name_index.count )
{
FT_ERROR(( "cff_font_load:"
- " invalid subfont index for pure CFF font (%d)\n",
+ " invalid subfont index for pure CFF font (%u)\n",
subfont_index ));
error = FT_THROW( Invalid_Argument );
goto Exit;
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffload.h b/src/java.desktop/share/native/libfreetype/src/cff/cffload.h
index 022092454218..fdc132c8f3f9 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffload.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffload.h
@@ -4,7 +4,7 @@
*
* OpenType & CFF data/program tables loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c
index 7c6713739a12..9e00943a95df 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c
@@ -4,7 +4,7 @@
*
* OpenType objects manager (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -537,8 +537,8 @@
sfnt_format = 1;
- /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
- /* font; in the latter case it doesn't have a `head' table */
+ /* the font may be OpenType/CFF, SVG CEF, or sfnt/CFF; a `head' table */
+ /* implies OpenType/CFF, otherwise just look for an optional cmap */
error = face->goto_table( face, TTAG_head, stream, 0 );
if ( !error )
{
@@ -554,7 +554,9 @@
{
/* load the `cmap' table explicitly */
error = sfnt->load_cmap( face, stream );
- if ( error )
+
+ /* this may fail because CID-keyed fonts don't have a cmap */
+ if ( FT_ERR_NEQ( error, Table_Missing ) && FT_ERR_NEQ( error, Ok ) )
goto Exit;
}
@@ -651,7 +653,7 @@
{
s = cff_index_get_sid_string( cff, idx );
if ( s )
- FT_TRACE4(( " %5d %s\n", idx, s ));
+ FT_TRACE4(( " %5u %s\n", idx, s ));
}
/* In Multiple Master CFFs, two SIDs hold the Normalize Design */
@@ -666,7 +668,7 @@
FT_PtrDist l;
- FT_TRACE4(( " %5d ", idx + 390 ));
+ FT_TRACE4(( " %5u ", idx + 390 ));
for ( l = 0; l < s1len; l++ )
FT_TRACE4(( "%c", s1[l] ));
FT_TRACE4(( "\n" ));
@@ -681,7 +683,7 @@
FT_PtrDist l;
- FT_TRACE4(( " %5d ", cff->num_strings + 390 ));
+ FT_TRACE4(( " %5u ", cff->num_strings + 390 ));
for ( l = 0; l < s1len; l++ )
FT_TRACE4(( "%c", s1[l] ));
FT_TRACE4(( "\n" ));
@@ -844,10 +846,8 @@
cffface->height = (FT_Short)( cffface->ascender -
cffface->descender );
- cffface->underline_position =
- (FT_Short)( dict->underline_position >> 16 );
- cffface->underline_thickness =
- (FT_Short)( dict->underline_thickness >> 16 );
+ cffface->underline_position = (FT_Short)dict->underline_position;
+ cffface->underline_thickness = (FT_Short)dict->underline_thickness;
/* retrieve font family & style name */
if ( dict->family_name )
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h
index 91ad83b1cd0c..982dcd64dd03 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h
@@ -4,7 +4,7 @@
*
* OpenType objects manager (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c b/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c
index 92a69c3b5165..864b2490b3b4 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c
@@ -4,7 +4,7 @@
*
* CFF token stream parser (body)
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -892,7 +892,7 @@
dict->cid_supplement ));
error = FT_Err_Ok;
- FT_TRACE4(( " %d %d %ld\n",
+ FT_TRACE4(( " %u %u %ld\n",
dict->cid_registry,
dict->cid_ordering,
dict->cid_supplement ));
@@ -929,7 +929,7 @@
priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ );
- FT_TRACE4(( " %d\n", priv->vsindex ));
+ FT_TRACE4(( " %u\n", priv->vsindex ));
error = FT_Err_Ok;
@@ -979,7 +979,7 @@
goto Exit;
}
- FT_TRACE4(( " %d value%s blended\n",
+ FT_TRACE4(( " %u value%s blended\n",
numBlends,
numBlends == 1 ? "" : "s" ));
@@ -1014,7 +1014,7 @@
if ( dict->maxstack < CFF2_DEFAULT_STACK )
dict->maxstack = CFF2_DEFAULT_STACK;
- FT_TRACE4(( " %d\n", dict->maxstack ));
+ FT_TRACE4(( " %u\n", dict->maxstack ));
Exit:
return error;
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h b/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h
index ca6b18af6aa3..47cceb1a4a07 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h
@@ -4,7 +4,7 @@
*
* CFF token stream parser (specification)
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h b/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h
index da45faa7f4ee..a7ee1cb3fe76 100644
--- a/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h
+++ b/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h
@@ -4,7 +4,7 @@
*
* CFF token definitions (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -30,8 +30,8 @@
CFF_FIELD_STRING ( 4, weight, "Weight" )
CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" )
CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" )
- CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" )
- CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" )
+ CFF_FIELD_NUM ( 0x103, underline_position, "UnderlinePosition" )
+ CFF_FIELD_NUM ( 0x104, underline_thickness, "UnderlineThickness" )
CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" )
CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" )
CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" )
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h b/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h
index c439a8c4a0b3..1591979d370c 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h
@@ -4,7 +4,7 @@
*
* CID error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c b/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c
index 7b571322d456..249ede5757d9 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c
@@ -4,7 +4,7 @@
*
* CID-keyed Type1 Glyph Loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -103,20 +103,20 @@
if ( ( cid->fd_bytes == 1 && fd_select == 0xFFU ) ||
( cid->fd_bytes == 2 && fd_select == 0xFFFFU ) )
{
- FT_TRACE1(( "cid_load_glyph: fail for glyph index %d:\n",
+ FT_TRACE1(( "cid_load_glyph: fail for glyph index %u:\n",
glyph_index ));
- FT_TRACE1(( " FD number %ld is the maximum\n",
+ FT_TRACE1(( " FD number %lu is the maximum\n",
fd_select ));
- FT_TRACE1(( " integer fitting into %d byte%s\n",
+ FT_TRACE1(( " integer fitting into %u byte%s\n",
cid->fd_bytes, cid->fd_bytes == 1 ? "" : "s" ));
}
else
{
- FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+ FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
glyph_index ));
- FT_TRACE0(( " FD number %ld is larger\n",
+ FT_TRACE0(( " FD number %lu is larger\n",
fd_select ));
- FT_TRACE0(( " than number of dictionaries (%d)\n",
+ FT_TRACE0(( " than number of dictionaries (%u)\n",
cid->num_dicts ));
}
@@ -125,7 +125,7 @@
}
else if ( off2 > stream->size )
{
- FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+ FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
glyph_index ));
FT_TRACE0(( " end of the glyph data\n" ));
FT_TRACE0(( " is beyond the data stream\n" ));
@@ -135,7 +135,7 @@
}
else if ( off1 > off2 )
{
- FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+ FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
glyph_index ));
FT_TRACE0(( " the end position of glyph data\n" ));
FT_TRACE0(( " is set before the start position\n" ));
@@ -252,8 +252,8 @@
cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0;
if ( cs_offset > glyph_length )
{
- FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%d, "
- "offset to the charstring is beyond glyph length\n",
+ FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%u,"
+ " offset to the charstring is beyond glyph length\n",
glyph_index ));
error = FT_THROW( Invalid_Offset );
goto Exit;
@@ -452,16 +452,12 @@
glyph->x_scale = cidsize->metrics.x_scale;
glyph->y_scale = cidsize->metrics.y_scale;
- cidglyph->outline.n_points = 0;
- cidglyph->outline.n_contours = 0;
-
hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 &&
( load_flags & FT_LOAD_NO_HINTING ) == 0 );
scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
glyph->hint = hinting;
glyph->scaled = scaled;
- cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
error = psaux->t1_decoder_funcs->init( &decoder,
cidglyph->face,
@@ -501,12 +497,8 @@
/* now set the metrics -- this is rather simple, as */
/* the left side bearing is the xMin, and the top side */
- /* bearing the yMax */
- cidglyph->outline.flags &= FT_OUTLINE_OWNER;
- cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
- /* for composite glyphs, return only left side bearing and */
- /* advance width */
+ /* bearing the yMax; for composite glyphs, return only */
+ /* left side bearing and advance width */
if ( load_flags & FT_LOAD_NO_RECURSE )
{
FT_Slot_Internal internal = cidglyph->internal;
@@ -527,6 +519,13 @@
FT_Glyph_Metrics* metrics = &cidglyph->metrics;
+ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+ cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+ if ( cidsize->metrics.y_ppem < 24 )
+ cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
/* copy the _unscaled_ advance width */
metrics->horiAdvance =
FIXED_TO_INT( decoder.builder.advance.x );
@@ -539,11 +538,6 @@
face->cid.font_bbox.yMin ) >> 16;
cidglyph->linearVertAdvance = metrics->vertAdvance;
- cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
- if ( cidsize->metrics.y_ppem < 24 )
- cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
/* apply the font matrix, if any */
if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
font_matrix.xy != 0 || font_matrix.yx != 0 )
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h b/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h
index 9fdc9db58923..cef96073ded4 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h
@@ -4,7 +4,7 @@
*
* OpenType Glyph Loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidload.c b/src/java.desktop/share/native/libfreetype/src/cid/cidload.c
index 722f5a34ddf9..bb1bf13e2219 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidload.c
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidload.c
@@ -4,7 +4,7 @@
*
* CID-keyed Type1 font loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidload.h b/src/java.desktop/share/native/libfreetype/src/cid/cidload.h
index 7f030b32df73..659dd0e378ca 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidload.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidload.h
@@ -4,7 +4,7 @@
*
* CID-keyed Type1 font loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c b/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c
index 8d337c411283..634bbf2f135e 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c
@@ -4,7 +4,7 @@
*
* CID objects manager (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h b/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h
index d371cbe99542..800268efa2f3 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h
@@ -4,7 +4,7 @@
*
* CID objects manager (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c b/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c
index 73a3ade893be..4d1ba335960a 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c
@@ -4,7 +4,7 @@
*
* CID-keyed Type1 parser (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h b/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h
index 0f5baddcb926..6ae2e542394c 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h
@@ -4,7 +4,7 @@
*
* CID-keyed Type1 parser (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c b/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c
index 4be8a5c00d51..a3a587c57bfb 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c
@@ -4,7 +4,7 @@
*
* CID driver interface (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h b/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h
index 7ddce431c5b1..55d0b8a0d9b5 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h
@@ -4,7 +4,7 @@
*
* High-level CID driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h b/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h
index 160897d14472..d40ebfab86df 100644
--- a/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h
+++ b/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h
@@ -4,7 +4,7 @@
*
* CID token definitions (specification only).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -47,7 +47,7 @@
T1_FIELD_STRING( "FullName", full_name, 0 )
T1_FIELD_STRING( "FamilyName", family_name, 0 )
T1_FIELD_STRING( "Weight", weight, 0 )
- T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 )
+ T1_FIELD_FIXED ( "ItalicAngle", italic_angle, 0 )
T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 )
T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 )
T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 )
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c b/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c
index e2f6a8e5adb9..b813efde4eb3 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c
@@ -4,7 +4,7 @@
*
* AFM parser (body).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h b/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h
index b7766372821a..add8597717d1 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h
@@ -4,7 +4,7 @@
*
* AFM parser (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c b/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c
index 9556e11a5861..17bdd23c7d46 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c
@@ -4,7 +4,7 @@
*
* PostScript CFF (Type 2) decoding routines (body).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -2141,7 +2141,7 @@
decoder->locals_bias );
- FT_TRACE4(( " callsubr (idx %d, entering level %td)\n",
+ FT_TRACE4(( " callsubr (idx %u, entering level %td)\n",
idx,
zone - decoder->zones + 1 ));
@@ -2185,7 +2185,7 @@
decoder->globals_bias );
- FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n",
+ FT_TRACE4(( " callgsubr (idx %u, entering level %td)\n",
idx,
zone - decoder->zones + 1 ));
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h b/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h
index 038f7235c3d6..e72ec043baaa 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h
@@ -4,7 +4,7 @@
*
* PostScript CFF (Type 2) decoding routines (specification).
*
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h b/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h
index 18428c40d5a4..0d7fe2b6121a 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h
@@ -4,7 +4,7 @@
*
* PS auxiliary module error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c b/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c
index 6826f9d8d3ed..942804190c52 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c
@@ -4,7 +4,7 @@
*
* FreeType auxiliary PostScript module implementation (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h b/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h
index 82d7e348af81..4a5ebc1b6079 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h
@@ -4,7 +4,7 @@
*
* FreeType auxiliary PostScript module implementation (specification).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -46,9 +46,6 @@ FT_BEGIN_HEADER
const CFF_Decoder_FuncsRec cff_decoder_funcs;
- FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class;
-
-
FT_DECLARE_MODULE( psaux_module_class )
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c b/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c
index 56c0ecd1d7f2..4567d3f3c069 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c
@@ -4,7 +4,7 @@
*
* Some convenience conversions (body).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h b/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h
index 91fcd15a1c96..63735af411f2 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h
@@ -4,7 +4,7 @@
*
* Some convenience conversions (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c b/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c
index 7572e225e377..7e3475e6f589 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c
@@ -618,7 +618,7 @@
/* Our copy of it does not change that requirement. */
cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
- charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+ charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
/* catch errors so far */
if ( *error )
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c b/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c
index eca465f009e9..8159fd6ef159 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c
@@ -4,7 +4,7 @@
*
* Auxiliary functions for PostScript fonts (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -460,6 +460,9 @@
case '%':
skip_comment( &cur, limit );
break;
+
+ default:
+ break;
}
}
@@ -1145,7 +1148,7 @@
FT_ERROR(( "ps_parser_load_field:"
" expected a name or string\n" ));
FT_ERROR(( " "
- " but found token of type %d instead\n",
+ " but found token of type %u instead\n",
token.type ));
error = FT_THROW( Invalid_File_Format );
goto Exit;
@@ -1225,7 +1228,7 @@
if ( result < 0 || (FT_UInt)result < max_objects )
{
FT_ERROR(( "ps_parser_load_field:"
- " expected %d integer%s in the %s subarray\n",
+ " expected %u integer%s in the %s subarray\n",
max_objects, max_objects > 1 ? "s" : "",
i == 0 ? "first"
: ( i == 1 ? "second"
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h b/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h
index 345fc8a73356..277aa1247c50 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h
@@ -4,7 +4,7 @@
*
* Auxiliary functions for PostScript fonts (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c b/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c
index 5681c3bd0fdb..66493b68123b 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c
@@ -4,7 +4,7 @@
*
* Type 1 character map support (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h b/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h
index 445e6a2784f5..114bfbb04103 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h
@@ -4,7 +4,7 @@
*
* Type 1 character map support (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c b/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c
index c74baa8038f3..c3fb343d4c9b 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c
@@ -4,7 +4,7 @@
*
* PostScript Type 1 decoding routines (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -1633,7 +1633,7 @@
default:
FT_ERROR(( "t1_decoder_parse_charstrings:"
- " unhandled opcode %d\n", op ));
+ " unhandled opcode %u\n", op ));
goto Syntax_Error;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h b/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h
index 16203b8f734f..7b913f55dff7 100644
--- a/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h
+++ b/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h
@@ -4,7 +4,7 @@
*
* PostScript Type 1 decoding routines (specification).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c
index 967767b34857..e053dba17b24 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c
@@ -4,7 +4,7 @@
*
* PostScript hinting algorithm (body).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
@@ -35,10 +35,6 @@
#endif
-#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */
- /* and similar glyphs */
-
-
/*************************************************************************/
/*************************************************************************/
/***** *****/
@@ -100,7 +96,7 @@
if ( idx >= table->max_hints )
{
- FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+ FT_TRACE0(( "psh_hint_table_record: invalid hint index %u\n", idx ));
return;
}
@@ -920,117 +916,6 @@
#define psh_corner_orientation ft_corner_orientation
-#ifdef COMPUTE_INFLEXS
-
- /* compute all inflex points in a given glyph */
- static void
- psh_glyph_compute_inflections( PSH_Glyph glyph )
- {
- FT_UInt n;
-
-
- for ( n = 0; n < glyph->num_contours; n++ )
- {
- PSH_Point first, start, end, before, after;
- FT_Pos in_x, in_y, out_x, out_y;
- FT_Int orient_prev, orient_cur;
- FT_Int finished = 0;
-
-
- /* we need at least 4 points to create an inflection point */
- if ( glyph->contours[n].count < 4 )
- continue;
-
- /* compute first segment in contour */
- first = glyph->contours[n].start;
-
- start = end = first;
- do
- {
- end = end->next;
- if ( end == first )
- goto Skip;
-
- in_x = end->org_u - start->org_u;
- in_y = end->org_v - start->org_v;
-
- } while ( in_x == 0 && in_y == 0 );
-
- /* extend the segment start whenever possible */
- before = start;
- do
- {
- do
- {
- start = before;
- before = before->prev;
- if ( before == first )
- goto Skip;
-
- out_x = start->org_u - before->org_u;
- out_y = start->org_v - before->org_v;
-
- } while ( out_x == 0 && out_y == 0 );
-
- orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
- } while ( orient_prev == 0 );
-
- first = start;
- in_x = out_x;
- in_y = out_y;
-
- /* now, process all segments in the contour */
- do
- {
- /* first, extend current segment's end whenever possible */
- after = end;
- do
- {
- do
- {
- end = after;
- after = after->next;
- if ( after == first )
- finished = 1;
-
- out_x = after->org_u - end->org_u;
- out_y = after->org_v - end->org_v;
-
- } while ( out_x == 0 && out_y == 0 );
-
- orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
- } while ( orient_cur == 0 );
-
- if ( ( orient_cur ^ orient_prev ) < 0 )
- {
- do
- {
- psh_point_set_inflex( start );
- start = start->next;
- }
- while ( start != end );
-
- psh_point_set_inflex( start );
- }
-
- start = end;
- end = after;
- orient_prev = orient_cur;
- in_x = out_x;
- in_y = out_y;
-
- } while ( !finished );
-
- Skip:
- ;
- }
- }
-
-#endif /* COMPUTE_INFLEXS */
-
-
static void
psh_glyph_done( PSH_Glyph glyph )
{
@@ -1258,11 +1143,6 @@
glyph->outline = outline;
glyph->globals = globals;
-#ifdef COMPUTE_INFLEXS
- psh_glyph_load_points( glyph, 0 );
- psh_glyph_compute_inflections( glyph );
-#endif /* COMPUTE_INFLEXS */
-
/* now deal with hints tables */
error = psh_hint_table_init( &glyph->hint_tables [0],
&ps_hints->dimension[0].hints,
@@ -1285,122 +1165,47 @@
}
- /* compute all extrema in a glyph for a given dimension */
+ /* compute all extreme and inflection points */
+ /* in a glyph for a given dimension */
static void
psh_glyph_compute_extrema( PSH_Glyph glyph )
{
FT_UInt n;
- /* first of all, compute all local extrema */
for ( n = 0; n < glyph->num_contours; n++ )
{
- PSH_Point first = glyph->contours[n].start;
- PSH_Point point, before, after;
+ PSH_Point first, point, before, after;
- if ( glyph->contours[n].count == 0 )
+ /* we need at least 3 points to create an extremum */
+ if ( glyph->contours[n].count < 3 )
continue;
- point = first;
- before = point;
+ first = glyph->contours[n].start;
+ point = first->prev;
+ after = first;
do
{
- before = before->prev;
- if ( before == first )
- goto Skip;
-
- } while ( before->org_u == point->org_u );
-
- first = point = before->next;
-
- for (;;)
- {
- after = point;
- do
- {
- after = after->next;
- if ( after == first )
- goto Next;
-
- } while ( after->org_u == point->org_u );
-
- if ( before->org_u < point->org_u )
- {
- if ( after->org_u < point->org_u )
- {
- /* local maximum */
- goto Extremum;
- }
- }
- else /* before->org_u > point->org_u */
- {
- if ( after->org_u > point->org_u )
- {
- /* local minimum */
- Extremum:
- do
- {
- psh_point_set_extremum( point );
- point = point->next;
-
- } while ( point != after );
- }
- }
-
- before = after->prev;
+ before = point;
point = after;
+ after = point->next;
- } /* for */
-
- Next:
- ;
- }
-
- /* for each extremum, determine its direction along the */
- /* orthogonal axis */
- for ( n = 0; n < glyph->num_points; n++ )
- {
- PSH_Point point, before, after;
-
-
- point = &glyph->points[n];
- before = point;
- after = point;
-
- if ( psh_point_is_extremum( point ) )
- {
- do
- {
- before = before->prev;
- if ( before == point )
- goto Skip;
-
- } while ( before->org_v == point->org_v );
-
- do
- {
- after = after->next;
- if ( after == point )
- goto Skip;
+ if ( ( before->org_u < point->org_u && point->org_u < after->org_u ) ||
+ ( before->org_u > point->org_u && point->org_u > after->org_u ) )
+ continue;
- } while ( after->org_v == point->org_v );
- }
+ /* otherwise this is either extremum or inflection point */
+ psh_point_set_extremum( point );
- if ( before->org_v < point->org_v &&
- after->org_v > point->org_v )
- {
- psh_point_set_positive( point );
- }
- else if ( before->org_v > point->org_v &&
- after->org_v < point->org_v )
- {
- psh_point_set_negative( point );
- }
+ /* also note its direction */
+ if ( before->org_v < after->org_v )
+ psh_point_set_positive( point );
+ else if ( before->org_v > after->org_v )
+ psh_point_set_negative( point );
- Skip:
- ;
+ } while ( after != first );
}
}
@@ -1836,8 +1641,7 @@
point->dir_in != point->dir_out )
continue;
- if ( !psh_point_is_extremum( point ) &&
- !psh_point_is_inflex( point ) )
+ if ( !psh_point_is_extremum( point ) )
continue;
point->flags &= ~PSH_POINT_SMOOTH;
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h
index fb362f061b6e..f4aa85405598 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h
@@ -4,7 +4,7 @@
*
* PostScript hinting algorithm (specification).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c
index 435f45838ffd..a772b66f3097 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c
@@ -5,7 +5,7 @@
* PostScript hinter global hinting management (body).
* Inspired by the new auto-hinter module.
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
@@ -376,36 +376,24 @@
/* not. We simply need to compare the vertical scale */
/* parameter to the raw bluescale value. Here is why: */
/* */
- /* We need to suppress overshoots for all pointsizes. */
- /* At 300dpi that satisfies: */
+ /* The specs explain how the bluescale is calculated */
+ /* from the desired maximum rounded pointsize at 300 dpi */
+ /* and assuming upem of 1000. */
/* */
- /* pointsize < 240*bluescale + 0.49 */
+ /* bluescale = ( pointsize - 0.49 ) / 240 */
/* */
- /* This corresponds to: */
+ /* For unrounded pointsize in general terms */
/* */
- /* pixelsize < 1000*bluescale + 49/24 */
+ /* bluescale = ( pointsize * dpi / 72 ) / upem */
/* */
- /* scale*EM_Size < 1000*bluescale + 49/24 */
+ /* which is */
/* */
- /* However, for normal Type 1 fonts, EM_Size is 1000! */
- /* We thus only check: */
+ /* bluescale = pixelsize / upem */
/* */
- /* scale < bluescale + 49/24000 */
+ /* Therefore, the bluescale value can be used directly */
+ /* as a scale limit, now that it is in comparable units */
/* */
- /* which we shorten to */
- /* */
- /* "scale < bluescale" */
- /* */
- /* Note that `blue_scale' is stored 1000 times its real */
- /* value, and that `scale' converts from font units to */
- /* fractional pixels. */
- /* */
-
- /* 1000 / 64 = 125 / 8 */
- if ( scale >= 0x20C49BAL )
- blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
- else
- blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+ blues->no_overshoots = FT_BOOL( scale < blues->blue_scale );
/* */
/* The blue threshold is the font units distance under */
@@ -420,8 +408,8 @@
FT_Int threshold = blues->blue_shift;
- while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
- threshold--;
+ if ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+ threshold = 32 * 0x10000L / scale;
blues->blue_threshold = threshold;
}
@@ -708,7 +696,6 @@
/* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
{
- FT_Fixed max_scale;
FT_Short max_height = 1;
@@ -725,11 +712,12 @@
priv->family_other_blues,
max_height );
- /* BlueScale is scaled 1000 times */
- max_scale = FT_DivFix( 1000, max_height );
- globals->blues.blue_scale = priv->blue_scale < max_scale
- ? priv->blue_scale
- : max_scale;
+ /* restrict BlueScale value that is amplified 1000-fold and */
+ /* rescale it to be comparable to the metrics scale */
+ if ( FT_MulFix( max_height, priv->blue_scale ) < 1000 )
+ globals->blues.blue_scale = priv->blue_scale * 8 / 125;
+ else
+ globals->blues.blue_scale = 64 * 0x10000L / max_height;
}
globals->blues.blue_shift = priv->blue_shift;
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h
index c5a5c9131680..555e99facb2d 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h
@@ -4,7 +4,7 @@
*
* PostScript hinter global hinting management.
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c
index 9965d5b16bf1..c9f4a94fe98a 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c
@@ -4,7 +4,7 @@
*
* FreeType PostScript hinter module implementation (body).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h b/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h
index 62ac0a60fdce..de9c398e9fb0 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h
@@ -4,7 +4,7 @@
*
* PostScript hinter module interface (specification).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h b/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h
index e9641340e530..7076664ddde9 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h
@@ -4,7 +4,7 @@
*
* PS Hinter error codes (specification only).
*
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c b/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c
index 0b2b549fc296..13754313fbb2 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c
@@ -4,7 +4,7 @@
*
* FreeType PostScript hints recorder (body).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -467,7 +467,7 @@
table->num_masks--;
}
else
- FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+ FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%u,%u)\n",
index1, index2 ));
Exit:
@@ -817,7 +817,7 @@
/* limit "dimension" to 0..1 */
if ( dimension > 1 )
{
- FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+ FT_TRACE0(( "ps_hints_stem: invalid dimension (%u) used\n",
dimension ));
dimension = ( dimension != 0 );
}
@@ -870,7 +870,7 @@
/* limit "dimension" to 0..1 */
if ( dimension > 1 )
{
- FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+ FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%u) used\n",
dimension ));
dimension = ( dimension != 0 );
}
@@ -976,7 +976,7 @@
if ( bit_count != count1 + count2 )
{
FT_TRACE0(( "ps_hints_t2mask:"
- " called with invalid bitcount %d (instead of %d)\n",
+ " called with invalid bitcount %u (instead of %u)\n",
bit_count, count1 + count2 ));
/* simply ignore the operator */
@@ -1022,7 +1022,7 @@
if ( bit_count != count1 + count2 )
{
FT_TRACE0(( "ps_hints_t2counter:"
- " called with invalid bitcount %d (instead of %d)\n",
+ " called with invalid bitcount %u (instead of %u)\n",
bit_count, count1 + count2 ));
/* simply ignore the operator */
diff --git a/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h b/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h
index 7e375af7ba87..a79069f98d2f 100644
--- a/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h
+++ b/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h
@@ -4,7 +4,7 @@
*
* Postscript (Type1/Type2) hints recorder (specification).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c b/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c
index 35d054d1cfb6..c5d71edad881 100644
--- a/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c
+++ b/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c
@@ -4,7 +4,7 @@
*
* psnames module implementation (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h b/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h
index 770458316b1e..482fd0a36d18 100644
--- a/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h
+++ b/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h
@@ -4,7 +4,7 @@
*
* High-level psnames module interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h b/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h
index e123eb65e393..17987f9cd4f6 100644
--- a/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h
+++ b/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h
@@ -4,7 +4,7 @@
*
* PS names module error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h b/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h
index 2a941b046096..65ce6c0b47f1 100644
--- a/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h
+++ b/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h
@@ -4,7 +4,7 @@
*
* PostScript glyph names.
*
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h b/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h
index 943f2aa0a50a..9d97223e94ee 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h
+++ b/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h
@@ -5,7 +5,7 @@
* Miscellaneous macros for stand-alone rasterizer (specification
* only).
*
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c b/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c
index e4b7b937d5a8..807d444e7aa4 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c
+++ b/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c
@@ -4,7 +4,7 @@
*
* The FreeType glyph rasterizer (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -251,7 +251,11 @@
/* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
/* for clipping computations. It simply uses the FT_MulDiv() function */
/* defined in `ftcalc.h'. */
-#define SMulDiv_No_Round FT_MulDiv_No_Round
+#ifdef FT_INT64
+#define SMulDiv( a, b, c ) (Long)( (FT_Int64)(a) * (b) / (c) )
+#else
+#define SMulDiv FT_MulDiv_No_Round
+#endif
/* The rasterizer is a very general purpose component; please leave */
/* the following redefinitions there (you never know your target */
@@ -653,7 +657,7 @@
ras.cProfile->height = 0;
}
- ras.cProfile->flags = ras.dropOutControl;
+ ras.cProfile->flags = ras.dropOutControl;
switch ( aState )
{
@@ -967,14 +971,14 @@
goto Fin;
}
- Ix = SMulDiv_No_Round( e - y1, Dx, Dy );
+ Ix = SMulDiv( e - y1, Dx, Dy );
x1 += Ix;
*top++ = x1;
if ( --size )
{
Ax = Dx * ( e - y1 ) - Dy * Ix; /* remainder */
- Ix = FMulDiv( ras.precision, Dx, Dy );
+ Ix = SMulDiv( ras.precision, Dx, Dy );
Rx = Dx * ras.precision - Dy * Ix; /* remainder */
Dx = 1;
@@ -1090,8 +1094,8 @@
PLong top;
- y1 = arc[degree].y;
- y2 = arc[0].y;
+ y1 = arc[degree].y;
+ y2 = arc[0].y;
if ( y2 < miny || y1 > maxy )
return SUCCESS;
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h b/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h
index ad9cb1b9fe0d..64499bf955bf 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h
+++ b/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h
@@ -4,7 +4,7 @@
*
* The FreeType glyph rasterizer (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c b/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c
index fd9f174f2e1f..3fa008704e54 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c
+++ b/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c
@@ -4,7 +4,7 @@
*
* The FreeType glyph rasterizer interface (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h b/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h
index cf3e73c0a248..d838a942b049 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h
+++ b/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h
@@ -4,7 +4,7 @@
*
* The FreeType glyph rasterizer interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h b/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h
index 326d42e0438e..39d82a8051aa 100644
--- a/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h
+++ b/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h
@@ -4,7 +4,7 @@
*
* monochrome renderer error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c
index 76181568af9f..24fb34555988 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c
@@ -4,7 +4,7 @@
*
* PNG Bitmap glyph support.
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* Google, Inc.
* Written by Stuart Gill and Behdad Esfahbod.
*
@@ -420,10 +420,7 @@
if ( populate_map_and_metrics )
{
/* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */
- FT_ULong size = map->rows * (FT_ULong)map->pitch;
-
-
- error = ft_glyphslot_alloc_bitmap( slot, size );
+ error = ft_glyphslot_alloc_bitmap( slot );
if ( error )
goto DestroyExit;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h
index 6e7a5c08e712..c59199e60dfe 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h
@@ -4,7 +4,7 @@
*
* PNG Bitmap glyph support.
*
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
* Google, Inc.
* Written by Stuart Gill and Behdad Esfahbod.
*
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c
index 81072207b490..32291e23e368 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c
@@ -4,7 +4,7 @@
*
* High-level SFNT driver interface (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -895,7 +895,7 @@
FT_TRACE0(( "sfnt_get_var_ps_name:"
" Shortening variation PS name prefix\n" ));
FT_TRACE0(( " "
- " to %d characters\n", len ));
+ " to %u characters\n", len ));
}
face->var_postscript_prefix = result;
@@ -1142,12 +1142,7 @@
FT_Error error;
- /* XXX: I don't know whether this is correct, since
- * tt_face_find_bdf_prop only returns something correct if we have
- * previously selected a size that is listed in the BDF table.
- * Should we change the BDF table format to include single offsets
- * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
- */
+ /* We expect that a bitmap strike has been selected. */
error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry );
if ( !error )
{
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h
index 6f71489fdc17..be4e33166c1c 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h
@@ -4,7 +4,7 @@
*
* High-level SFNT driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h b/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h
index d3ca1d9aa8b3..2da4ac776b07 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h
@@ -4,7 +4,7 @@
*
* SFNT error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c
index 6ee4e5e939b4..6af35787e85e 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c
@@ -4,7 +4,7 @@
*
* SFNT object management (base).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -579,6 +579,9 @@
if ( face_instance_index < 0 && face_index > 0 )
face_index--;
+ /* Note that `face_index` is also used to enumerate elements */
+ /* of containers like a Mac Resource; this means we must */
+ /* check whether we actually have a TTC. */
if ( face_index >= face->ttc_header.count )
{
if ( face_instance_index >= 0 )
@@ -1127,9 +1130,9 @@
flags |= FT_FACE_FLAG_VERTICAL;
/* kerning available ? */
- if ( TT_FACE_HAS_KERNING( face )
+ if ( face->kern_avail_bits
#ifdef TT_CONFIG_OPTION_GPOS_KERNING
- || face->gpos_kerning_available
+ || face->num_gpos_lookups_kerning
#endif
)
flags |= FT_FACE_FLAG_KERNING;
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h b/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h
index 90847d957322..8c38b7279501 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h
@@ -4,7 +4,7 @@
*
* SFNT object management (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c
index 14514bf9574c..015c7b78b4d6 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c
@@ -4,7 +4,7 @@
*
* WOFF format management (base).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h
index a04735ffe280..df7ace5c2094 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h
@@ -4,7 +4,7 @@
*
* WOFFF format management (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c
index 589b3e0c6b77..41c233597b8e 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c
@@ -4,7 +4,7 @@
*
* WOFF2 format management (base).
*
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
* Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -902,7 +902,7 @@
substreams[i].offset = pos + offset;
substreams[i].size = substream_size;
- FT_TRACE5(( " Substream %d: offset = %lu; size = %lu;\n",
+ FT_TRACE5(( " Substream %u: offset = %lu; size = %lu;\n",
i, substreams[i].offset, substreams[i].size ));
offset += substream_size;
}
@@ -1043,7 +1043,6 @@
FT_ULong total_n_points = 0;
FT_UShort n_points_contour;
FT_UInt j;
- FT_ULong flag_size;
FT_ULong triplet_size;
FT_ULong triplet_bytes_used;
FT_Bool have_overlap = FALSE;
@@ -1088,8 +1087,8 @@
}
substreams[N_POINTS_STREAM].offset = FT_STREAM_POS();
- flag_size = total_n_points;
- if ( flag_size > substreams[FLAG_STREAM].size )
+ points_size += total_n_points;
+ if ( points_size > substreams[FLAG_STREAM].size )
goto Fail;
flags_buf = stream->base + substreams[FLAG_STREAM].offset;
@@ -1106,8 +1105,7 @@
triplet_bytes_used = 0;
/* Create array to store point information. */
- points_size = total_n_points;
- if ( FT_QNEW_ARRAY( points, points_size ) )
+ if ( FT_QNEW_ARRAY( points, total_n_points ) )
goto Fail;
if ( triplet_decode( flags_buf,
@@ -1118,7 +1116,7 @@
&triplet_bytes_used ) )
goto Fail;
- substreams[FLAG_STREAM].offset += flag_size;
+ substreams[FLAG_STREAM].offset += total_n_points;
substreams[GLYPH_STREAM].offset += triplet_bytes_used;
if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) ||
@@ -1592,7 +1590,7 @@
WOFF2_TableRec table = *( indices[nn] );
- FT_TRACE3(( "Seeking to %ld with table size %ld.\n",
+ FT_TRACE3(( "Seeking to %lu with table size %lu.\n",
table.src_offset, table.src_length ));
FT_TRACE3(( "Table tag: %c%c%c%c.\n",
(FT_Char)( table.Tag >> 24 ),
@@ -1943,7 +1941,7 @@
src_offset += table->TransformLength;
table->dst_offset = 0;
- FT_TRACE2(( " %c%c%c%c %08d %08d %08ld %08ld %08ld\n",
+ FT_TRACE2(( " %c%c%c%c %08d %08d %08lu %08lu %08lu\n",
(FT_Char)( table->Tag >> 24 ),
(FT_Char)( table->Tag >> 16 ),
(FT_Char)( table->Tag >> 8 ),
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h
index f41140648dc4..588761d0c8ea 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h
@@ -4,7 +4,7 @@
*
* WOFFF2 format management (specification).
*
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
* Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c
index 28f4d1173c06..91b02344224e 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c
@@ -4,7 +4,7 @@
*
* TrueType character mapping table (cmap) support (body).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -179,7 +179,7 @@
cmap_info->format = 0;
- cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+ cmap_info->language = TT_PEEK_USHORT( p );
return FT_Err_Ok;
}
@@ -596,7 +596,7 @@
cmap_info->format = 2;
- cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+ cmap_info->language = TT_PEEK_USHORT( p );
return FT_Err_Ok;
}
@@ -1539,7 +1539,7 @@
cmap_info->format = 4;
- cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+ cmap_info->language = TT_PEEK_USHORT( p );
return FT_Err_Ok;
}
@@ -1712,7 +1712,7 @@
cmap_info->format = 6;
- cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+ cmap_info->language = TT_PEEK_USHORT( p );
return FT_Err_Ok;
}
@@ -2009,7 +2009,7 @@
cmap_info->format = 8;
- cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+ cmap_info->language = TT_PEEK_ULONG( p );
return FT_Err_Ok;
}
@@ -2184,7 +2184,7 @@
cmap_info->format = 10;
- cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+ cmap_info->language = TT_PEEK_ULONG( p );
return FT_Err_Ok;
}
@@ -2528,7 +2528,7 @@
cmap_info->format = 12;
- cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+ cmap_info->language = TT_PEEK_ULONG( p );
return FT_Err_Ok;
}
@@ -2844,7 +2844,7 @@
cmap_info->format = 13;
- cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+ cmap_info->language = TT_PEEK_ULONG( p );
return FT_Err_Ok;
}
@@ -3792,7 +3792,7 @@
return FT_THROW( Invalid_Table );
/* Version 1.8.3 of the OpenType specification contains the following */
- /* (https://docs.microsoft.com/en-us/typography/opentype/spec/cmap): */
+ /* (https://learn.microsoft.com/typography/opentype/spec/cmap): */
/* */
/* The 'cmap' table version number remains at 0x0000 for fonts that */
/* make use of the newer subtable formats. */
@@ -3803,7 +3803,7 @@
p += 2;
num_cmaps = TT_NEXT_USHORT( p );
- FT_TRACE4(( "tt_face_build_cmaps: %d cmaps\n", num_cmaps ));
+ FT_TRACE4(( "tt_face_build_cmaps: %u cmaps\n", num_cmaps ));
limit = table + face->cmap_size;
for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h
index e2c5e72bf029..645e9e37e0c6 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h
@@ -4,7 +4,7 @@
*
* TrueType character mapping table (cmap) support (specification).
*
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h
index 370898363f34..65807bb7378a 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h
@@ -4,7 +4,7 @@
*
* TT CMAP classes definitions (specification only).
*
- * Copyright (C) 2009-2024 by
+ * Copyright (C) 2009-2025 by
* Oran Agra and Mickey Gabel.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c
index b37658dde9ec..7929b7aaf4c8 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c
@@ -4,7 +4,7 @@
*
* TrueType and OpenType colored glyph layer support (body).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
*
* Originally written by Shao Yu Zhang .
@@ -51,7 +51,7 @@
#define COLOR_STOP_SIZE 6U
#define VAR_IDX_BASE_SIZE 4U
#define LAYER_SIZE 4U
-/* https://docs.microsoft.com/en-us/typography/opentype/spec/colr#colr-header */
+/* https://learn.microsoft.com/typography/opentype/spec/colr#colr-header */
/* 3 * uint16 + 2 * Offset32 */
#define COLRV0_HEADER_SIZE 14U
/* COLRV0_HEADER_SIZE + 5 * Offset32 */
@@ -1749,7 +1749,6 @@
FT_UInt x, y;
FT_Byte b, g, r, alpha;
- FT_ULong size;
FT_Byte* src;
FT_Byte* dst;
@@ -1767,13 +1766,9 @@
dstSlot->bitmap.pitch = (int)dstSlot->bitmap.width * 4;
dstSlot->bitmap.num_grays = 256;
- size = dstSlot->bitmap.rows * (unsigned int)dstSlot->bitmap.pitch;
-
- error = ft_glyphslot_alloc_bitmap( dstSlot, size );
+ error = ft_glyphslot_alloc_bitmap( dstSlot );
if ( error )
return error;
-
- FT_MEM_ZERO( dstSlot->bitmap.buffer, size );
}
else
{
@@ -1805,8 +1800,7 @@
FT_Byte* q;
- size = rows * pitch;
- if ( FT_ALLOC( buf, size ) )
+ if ( FT_ALLOC_MULT( buf, rows, pitch ) )
return error;
p = dstSlot->bitmap.buffer;
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h
index 30031464c737..3913acc74d59 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h
@@ -4,7 +4,7 @@
*
* TrueType and OpenType colored glyph layer support (specification).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* Originally written by Shao Yu Zhang .
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c
index 997eb869ffca..6d1208f6af24 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c
@@ -4,7 +4,7 @@
*
* TrueType and OpenType color palette support (body).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* Originally written by Shao Yu Zhang .
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h
index bb301ae88b6a..a0b4c9d927fa 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h
@@ -4,7 +4,7 @@
*
* TrueType and OpenType color palette support (specification).
*
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* Originally written by Shao Yu Zhang .
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c
index f0411366af49..76618b0d3bb7 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c
@@ -2,10 +2,9 @@
*
* ttkern.c
*
- * Load the basic TrueType kerning table. This doesn't handle
- * kerning data within the GPOS table at the moment.
+ * Routines to parse and access the 'kern' table for kerning (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h
index a54e51df12d9..e0075dce61d6 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h
@@ -2,10 +2,10 @@
*
* ttkern.h
*
- * Load the basic TrueType kerning table. This doesn't handle
- * kerning data within the GPOS table at the moment.
+ * Routines to parse and access the 'kern' table for kerning
+ * (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -40,8 +40,6 @@ FT_BEGIN_HEADER
FT_UInt left_glyph,
FT_UInt right_glyph );
-#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 )
-
FT_END_HEADER
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c
index c3a5fae2cb9b..0c257ce4d314 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c
@@ -5,7 +5,7 @@
* Load the basic TrueType tables, i.e., tables that can be either in
* TTF or OTF fonts (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -535,7 +535,8 @@
* The tag of table to load. Use the value 0 if you want
* to access the whole font file, else set this parameter
* to a valid TrueType table tag that you can forge with
- * the MAKE_TT_TAG macro.
+ * the MAKE_TT_TAG macro. Use value 1 to access the table
+ * directory.
*
* offset ::
* The starting offset in the table (or the file if
@@ -577,7 +578,29 @@
FT_ULong size;
- if ( tag != 0 )
+ if ( tag == 0 )
+ {
+ /* The whole font file. */
+ size = face->root.stream->size;
+ }
+ else if ( tag == 1 )
+ {
+ /* The currently selected font's table directory. */
+ /* */
+ /* Note that `face_index` is also used to enumerate elements */
+ /* of containers like a Mac Resource; this means we must */
+ /* check whether we actually have a TTC (with multiple table */
+ /* directories). */
+ FT_Long idx = face->root.face_index & 0xFFFF;
+
+
+ if ( idx >= face->ttc_header.count )
+ idx = 0;
+
+ offset += face->ttc_header.offsets[idx];
+ size = 4 + 8 + 16 * face->num_tables;
+ }
+ else
{
/* look for tag in font directory */
table = tt_face_lookup_table( face, tag );
@@ -590,9 +613,6 @@
offset += table->Offset;
size = table->Length;
}
- else
- /* tag == 0 -- the user wants to access the font file directly */
- size = face->root.stream->size;
if ( length && *length == 0 )
{
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h
index 2b1d62d9bd9d..e3666c901b14 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h
@@ -5,7 +5,7 @@
* Load the basic TrueType tables, i.e., tables that can be either in
* TTF or OTF fonts (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c
index 278841185636..541d84474708 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c
@@ -4,7 +4,7 @@
*
* Load the metrics tables common to TTF and OTF fonts (body).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -306,7 +306,7 @@
}
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- if ( var && face->blend )
+ if ( var && FT_IS_VARIATION( &face->root ) )
{
FT_Face f = FT_FACE( face );
FT_Int a = (FT_Int)*aadvance;
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h
index 34b3c0e18f2d..1ee84507f153 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h
@@ -4,7 +4,7 @@
*
* Load the metrics tables common to TTF and OTF fonts (specification).
*
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c
index 5698a62c8d1f..4246b6c8eff1 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c
@@ -5,7 +5,7 @@
* PostScript name table processing for TrueType and OpenType fonts
* (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h
index 150db6c3981e..a11b66968547 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h
@@ -5,7 +5,7 @@
* PostScript name table processing for TrueType and OpenType fonts
* (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c
index cb3a8abf1821..34e45619817c 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c
@@ -4,7 +4,7 @@
*
* TrueType and OpenType embedded bitmap support (body).
*
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* Copyright 2013 by Google, Inc.
@@ -342,7 +342,7 @@
FT_TRACE2(( "tt_face_load_strike_metrics:"
" sanitizing invalid ascender and descender\n" ));
FT_TRACE2(( " "
- " values for strike %ld (%dppem, %dppem)\n",
+ " values for strike %lu (%dppem, %dppem)\n",
strike_index,
metrics->x_ppem, metrics->y_ppem ));
@@ -547,7 +547,6 @@
FT_Error error = FT_Err_Ok;
FT_UInt width, height;
FT_Bitmap* map = decoder->bitmap;
- FT_ULong size;
if ( !decoder->metrics_loaded )
@@ -599,17 +598,11 @@
goto Exit;
}
- size = map->rows * (FT_ULong)map->pitch;
-
- /* check that there is no empty image */
- if ( size == 0 )
- goto Exit; /* exit successfully! */
-
if ( metrics_only )
goto Exit; /* only metrics are requested */
- error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
- if ( error )
+ error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph );
+ if ( error || !map->buffer )
goto Exit;
decoder->bitmap_allocated = 1;
@@ -993,7 +986,7 @@
goto Fail;
}
- FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n",
+ FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %u component%s\n",
num_components,
num_components == 1 ? "" : "s" ));
@@ -1419,7 +1412,7 @@
image_start = image_offset + image_start;
FT_TRACE3(( "tt_sbit_decoder_load_image:"
- " found sbit (format %d) for glyph index %d\n",
+ " found sbit (format %u) for glyph index %u\n",
image_format, glyph_index ));
return tt_sbit_decoder_load_bitmap( decoder,
@@ -1438,13 +1431,13 @@
if ( recurse_count )
{
FT_TRACE4(( "tt_sbit_decoder_load_image:"
- " missing subglyph sbit with glyph index %d\n",
+ " missing subglyph sbit with glyph index %u\n",
glyph_index ));
return FT_THROW( Invalid_Composite );
}
FT_TRACE4(( "tt_sbit_decoder_load_image:"
- " no sbit found for glyph index %d\n", glyph_index ));
+ " no sbit found for glyph index %u\n", glyph_index ));
return FT_THROW( Missing_Bitmap );
}
@@ -1462,12 +1455,13 @@
FT_Int originOffsetX, originOffsetY;
FT_Tag graphicType;
FT_Int recurse_depth = 0;
+ FT_Bool flipped = FALSE;
FT_Error error;
FT_Byte* p;
- FT_UNUSED( map );
#ifndef FT_CONFIG_OPTION_USE_PNG
+ FT_UNUSED( map );
FT_UNUSED( metrics_only );
#endif
@@ -1517,12 +1511,16 @@
switch ( graphicType )
{
+ case FT_MAKE_TAG( 'f', 'l', 'i', 'p' ):
+ flipped = !flipped;
+ FALL_THROUGH;
+
case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ):
- if ( recurse_depth < 4 )
+ if ( recurse_depth++ < 4 )
{
glyph_index = FT_GET_USHORT();
FT_FRAME_EXIT();
- recurse_depth++;
+
goto retry;
}
error = FT_THROW( Invalid_File_Format );
@@ -1540,6 +1538,38 @@
glyph_end - glyph_start - 8,
TRUE,
metrics_only );
+ if ( flipped && !metrics_only && !error )
+ {
+ FT_UInt32* curr_pos = (FT_UInt32*)map->buffer;
+
+ /* `Load_SBit_Png` always returns a pixmap with 32 bits per pixel */
+ /* and no extra pitch bytes. */
+ FT_UInt width = map->width;
+ FT_UInt y;
+
+
+ for ( y = 0; y < map->rows; y++ )
+ {
+ FT_UInt32* left = curr_pos;
+ FT_UInt32* right = curr_pos + width - 1;
+
+
+ while ( left < right )
+ {
+ FT_UInt32 value;
+
+
+ value = *right;
+ *right = *left;
+ *left = value;
+
+ left++;
+ right--;
+ }
+
+ curr_pos += width;
+ }
+ }
#else
error = FT_THROW( Unimplemented_Feature );
#endif
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h
index 96f80a584248..7427149d68f1 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h
@@ -4,7 +4,7 @@
*
* TrueType and OpenType embedded bitmap support (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c b/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c
index 532ccfa1737e..0f9e3889aabf 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c
@@ -4,7 +4,7 @@
*
* WOFF2 Font table tags (base).
*
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
* Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h b/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h
index d03b4b41bc9d..e223022962ea 100644
--- a/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h
+++ b/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h
@@ -4,7 +4,7 @@
*
* WOFF2 Font table tags (specification).
*
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
* Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c
index b7c0632a6fa9..3c387aea0ac1 100644
--- a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c
+++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c
@@ -4,7 +4,7 @@
*
* A new `perfect' anti-aliasing renderer (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -157,10 +157,6 @@
#define ft_memset memset
-#define ft_setjmp setjmp
-#define ft_longjmp longjmp
-#define ft_jmp_buf jmp_buf
-
typedef ptrdiff_t FT_PtrDist;
@@ -170,8 +166,8 @@ typedef ptrdiff_t FT_PtrDist;
#define Smooth_Err_Invalid_Argument -3
#define Smooth_Err_Raster_Overflow -4
-#define FT_BEGIN_HEADER
-#define FT_END_HEADER
+#define FT_BEGIN_HEADER /* nothing */
+#define FT_END_HEADER /* nothing */
#include "ftimage.h"
#include "ftgrays.h"
@@ -495,6 +491,7 @@ typedef ptrdiff_t FT_PtrDist;
TCoord min_ey, max_ey;
TCoord count_ey; /* same as (max_ey - min_ey) */
+ int error; /* pool overflow exception */
PCell cell; /* current cell */
PCell cell_free; /* call allocation next free slot */
PCell cell_null; /* last cell, used as dumpster and limit */
@@ -510,8 +507,6 @@ typedef ptrdiff_t FT_PtrDist;
FT_Raster_Span_Func render_span;
void* render_span_data;
- ft_jmp_buf jump_buffer;
-
} gray_TWorker, *gray_PWorker;
#if defined( _MSC_VER )
@@ -613,9 +608,14 @@ typedef ptrdiff_t FT_PtrDist;
}
/* insert new cell */
- cell = ras.cell_free++;
- if ( cell >= ras.cell_null )
- ft_longjmp( ras.jump_buffer, 1 );
+ cell = ras.cell_free;
+ if ( cell == ras.cell_null )
+ {
+ ras.error = FT_THROW( Raster_Overflow );
+ goto Found;
+ }
+
+ ras.cell_free = cell + 1;
cell->x = ex;
cell->area = 0;
@@ -1353,7 +1353,8 @@ typedef ptrdiff_t FT_PtrDist;
ras.x = x;
ras.y = y;
- return 0;
+
+ return ras.error;
}
@@ -1365,7 +1366,8 @@ typedef ptrdiff_t FT_PtrDist;
gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
- return 0;
+
+ return ras.error;
}
@@ -1378,7 +1380,8 @@ typedef ptrdiff_t FT_PtrDist;
gray_render_conic( RAS_VAR_ control, to );
- return 0;
+
+ return ras.error;
}
@@ -1392,7 +1395,8 @@ typedef ptrdiff_t FT_PtrDist;
gray_render_cubic( RAS_VAR_ control1, control2, to );
- return 0;
+
+ return ras.error;
}
@@ -1700,30 +1704,22 @@ typedef ptrdiff_t FT_PtrDist;
gray_convert_glyph_inner( RAS_ARG_
int continued )
{
- volatile int error;
+ int error;
- if ( ft_setjmp( ras.jump_buffer ) == 0 )
- {
- if ( continued )
- FT_Trace_Disable();
- error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
- if ( continued )
- FT_Trace_Enable();
-
- FT_TRACE7(( "band [%d..%d]: %td cell%s remaining\n",
- ras.min_ey,
- ras.max_ey,
- ras.cell_null - ras.cell_free,
- ras.cell_null - ras.cell_free == 1 ? "" : "s" ));
- }
- else
- {
- error = FT_THROW( Raster_Overflow );
+ if ( continued )
+ FT_Trace_Disable();
+ error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+ if ( continued )
+ FT_Trace_Enable();
- FT_TRACE7(( "band [%d..%d]: to be bisected\n",
- ras.min_ey, ras.max_ey ));
- }
+ FT_TRACE7(( error == Smooth_Err_Raster_Overflow
+ ? "band [%d..%d]: to be bisected\n"
+ : "band [%d..%d]: %td cell%s remaining\n",
+ ras.min_ey,
+ ras.max_ey,
+ ras.cell_null - ras.cell_free,
+ ras.cell_null - ras.cell_free == 1 ? "" : "s" ));
return error;
}
@@ -1808,7 +1804,7 @@ typedef ptrdiff_t FT_PtrDist;
FT_FILL_RULE( coverage, cover, fill );
span[n].coverage = (unsigned char)coverage;
- span[n].x = (short)x;
+ span[n].x = (unsigned short)x;
span[n].len = (unsigned short)( cell->x - x );
if ( ++n == FT_MAX_GRAY_SPANS )
@@ -1827,7 +1823,7 @@ typedef ptrdiff_t FT_PtrDist;
FT_FILL_RULE( coverage, area, fill );
span[n].coverage = (unsigned char)coverage;
- span[n].x = (short)cell->x;
+ span[n].x = (unsigned short)cell->x;
span[n].len = 1;
if ( ++n == FT_MAX_GRAY_SPANS )
@@ -1873,6 +1869,7 @@ typedef ptrdiff_t FT_PtrDist;
TCoord* band;
int continued = 0;
+ int error = Smooth_Err_Ok;
/* Initialize the null cell at the end of the poll. */
@@ -1907,7 +1904,6 @@ typedef ptrdiff_t FT_PtrDist;
do
{
TCoord i;
- int error;
ras.min_ex = band[1];
@@ -1922,6 +1918,7 @@ typedef ptrdiff_t FT_PtrDist;
ras.cell_free = buffer + n;
ras.cell = ras.cell_null;
+ ras.error = Smooth_Err_Ok;
error = gray_convert_glyph_inner( RAS_VAR_ continued );
continued = 1;
@@ -1936,7 +1933,7 @@ typedef ptrdiff_t FT_PtrDist;
continue;
}
else if ( error != Smooth_Err_Raster_Overflow )
- return error;
+ goto Exit;
/* render pool overflow; we will reduce the render band by half */
i = ( band[0] - band[1] ) >> 1;
@@ -1945,7 +1942,8 @@ typedef ptrdiff_t FT_PtrDist;
if ( i == 0 )
{
FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
- return FT_THROW( Raster_Overflow );
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
}
band++;
@@ -1954,7 +1952,11 @@ typedef ptrdiff_t FT_PtrDist;
} while ( band >= bands );
}
- return Smooth_Err_Ok;
+ Exit:
+ ras.cell = ras.cell_free = ras.cell_null = NULL;
+ ras.ycells = NULL;
+
+ return error;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h
index 940fbe8c79bd..e463e5b3eb8f 100644
--- a/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h
+++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h
@@ -4,7 +4,7 @@
*
* FreeType smooth renderer declaration
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -19,11 +19,6 @@
#ifndef FTGRAYS_H_
#define FTGRAYS_H_
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-
#ifdef STANDALONE_
#include "ftimage.h"
#else
@@ -31,6 +26,7 @@
#include
#endif
+FT_BEGIN_HEADER
/**************************************************************************
*
@@ -46,10 +42,7 @@
FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster;
-
-#ifdef __cplusplus
- }
-#endif
+FT_END_HEADER
#endif /* FTGRAYS_H_ */
diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h
index 6d41fb8e0fd9..8d5068549faa 100644
--- a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h
+++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h
@@ -4,7 +4,7 @@
*
* smooth renderer error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c
index f0acc1ea4a6e..5a7a852a619a 100644
--- a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c
+++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c
@@ -4,7 +4,7 @@
*
* Anti-aliasing renderer interface (body).
*
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -80,6 +80,7 @@
{
unsigned char* origin; /* pixmap origin at the bottom-left */
int pitch; /* pitch to go down one row */
+ unsigned char wght[5]; /* filtering weights */
} TOrigin;
@@ -274,6 +275,32 @@
}
+ /* This function applies a horizontal filter in direct rendering mode */
+ static void
+ ft_smooth_lcd_spans( int y,
+ int count,
+ const FT_Span* spans,
+ void* target_ ) /* TOrigin* */
+ {
+ TOrigin* target = (TOrigin*)target_;
+
+ unsigned char* dst_line = target->origin - y * target->pitch - 2;
+ unsigned char* dst;
+ unsigned short w;
+
+
+ for ( ; count--; spans++ )
+ for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ )
+ {
+ dst[0] += ( spans->coverage * target->wght[0] + 85 ) >> 8;
+ dst[1] += ( spans->coverage * target->wght[1] + 85 ) >> 8;
+ dst[2] += ( spans->coverage * target->wght[2] + 85 ) >> 8;
+ dst[3] += ( spans->coverage * target->wght[3] + 85 ) >> 8;
+ dst[4] += ( spans->coverage * target->wght[4] + 85 ) >> 8;
+ }
+ }
+
+
static FT_Error
ft_smooth_raster_lcd( FT_Renderer render,
FT_Outline* outline,
@@ -285,11 +312,47 @@
FT_Vector* vec;
FT_Raster_Params params;
+ TOrigin target;
- params.target = bitmap;
- params.source = outline;
- params.flags = FT_RASTER_FLAG_AA;
+ if ( render->root.library->lcd_weights[2] )
+ {
+ /* Reject outlines that are too wide for 16-bit FT_Span. */
+ /* Other limits are applied upstream with the same error code. */
+ if ( bitmap->width > 0x7FFF )
+ return FT_THROW( Raster_Overflow );
+
+ /* Set up direct rendering for instant filtering. */
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT;
+ params.gray_spans = ft_smooth_lcd_spans;
+ params.user = ⌖
+
+ params.clip_box.xMin = 0;
+ params.clip_box.yMin = 0;
+ params.clip_box.xMax = bitmap->width;
+ params.clip_box.yMax = bitmap->rows;
+
+ if ( bitmap->pitch < 0 )
+ target.origin = bitmap->buffer;
+ else
+ target.origin = bitmap->buffer
+ + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch;
+
+ target.pitch = bitmap->pitch;
+
+ target.wght[0] = render->root.library->lcd_weights[0];
+ target.wght[1] = render->root.library->lcd_weights[1];
+ target.wght[2] = render->root.library->lcd_weights[2];
+ target.wght[3] = render->root.library->lcd_weights[3];
+ target.wght[4] = render->root.library->lcd_weights[4];
+ }
+ else
+ {
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA;
+ }
/* implode outline */
for ( vec = points; vec < points_end; vec++ )
@@ -306,6 +369,32 @@
}
+ /* This function applies a vertical filter in direct rendering mode */
+ static void
+ ft_smooth_lcdv_spans( int y,
+ int count,
+ const FT_Span* spans,
+ void* target_ ) /* TOrigin* */
+ {
+ TOrigin* target = (TOrigin*)target_;
+
+ int pitch = target->pitch;
+ unsigned char* dst_line = target->origin - ( y + 2 ) * pitch;
+ unsigned char* dst;
+ unsigned short w;
+
+
+ for ( ; count--; spans++ )
+ for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ )
+ {
+ dst[ 0] += ( spans->coverage * target->wght[0] + 85 ) >> 8;
+ dst[ pitch] += ( spans->coverage * target->wght[1] + 85 ) >> 8;
+ dst[2 * pitch] += ( spans->coverage * target->wght[2] + 85 ) >> 8;
+ dst[3 * pitch] += ( spans->coverage * target->wght[3] + 85 ) >> 8;
+ dst[4 * pitch] += ( spans->coverage * target->wght[4] + 85 ) >> 8;
+ }
+ }
+
static FT_Error
ft_smooth_raster_lcdv( FT_Renderer render,
FT_Outline* outline,
@@ -317,11 +406,42 @@
FT_Vector* vec;
FT_Raster_Params params;
+ TOrigin target;
- params.target = bitmap;
- params.source = outline;
- params.flags = FT_RASTER_FLAG_AA;
+ if ( render->root.library->lcd_weights[2] )
+ {
+ /* Set up direct rendering for instant filtering. */
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT;
+ params.gray_spans = ft_smooth_lcdv_spans;
+ params.user = ⌖
+
+ params.clip_box.xMin = 0;
+ params.clip_box.yMin = 0;
+ params.clip_box.xMax = bitmap->width;
+ params.clip_box.yMax = bitmap->rows;
+
+ if ( bitmap->pitch < 0 )
+ target.origin = bitmap->buffer;
+ else
+ target.origin = bitmap->buffer
+ + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch;
+
+ target.pitch = bitmap->pitch;
+
+ target.wght[0] = render->root.library->lcd_weights[0];
+ target.wght[1] = render->root.library->lcd_weights[1];
+ target.wght[2] = render->root.library->lcd_weights[2];
+ target.wght[3] = render->root.library->lcd_weights[3];
+ target.wght[4] = render->root.library->lcd_weights[4];
+ }
+ else
+ {
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA;
+ }
/* implode outline */
for ( vec = points; vec < points_end; vec++ )
@@ -494,12 +614,6 @@
else
y_shift += 64 * (FT_Int)bitmap->rows;
- if ( origin )
- {
- x_shift += origin->x;
- y_shift += origin->y;
- }
-
/* translate outline to render it into the bitmap */
if ( x_shift || y_shift )
FT_Outline_Translate( outline, x_shift, y_shift );
@@ -527,33 +641,6 @@
error = ft_smooth_raster_lcd ( render, outline, bitmap );
else if ( mode == FT_RENDER_MODE_LCD_V )
error = ft_smooth_raster_lcdv( render, outline, bitmap );
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
- /* finally apply filtering */
- {
- FT_Byte* lcd_weights;
- FT_Bitmap_LcdFilterFunc lcd_filter_func;
-
-
- /* Per-face LCD filtering takes priority if set up. */
- if ( slot->face && slot->face->internal->lcd_filter_func )
- {
- lcd_weights = slot->face->internal->lcd_weights;
- lcd_filter_func = slot->face->internal->lcd_filter_func;
- }
- else
- {
- lcd_weights = slot->library->lcd_weights;
- lcd_filter_func = slot->library->lcd_filter_func;
- }
-
- if ( lcd_filter_func )
- lcd_filter_func( bitmap, lcd_weights );
- }
-
-#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
}
Exit:
diff --git a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h
index d7b61a9e60ec..f76708ae7010 100644
--- a/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h
+++ b/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h
@@ -4,7 +4,7 @@
*
* Anti-aliasing renderer interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c
index 4ab68eb9a12d..6369d83d6d5a 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c
@@ -4,7 +4,7 @@
*
* TrueType font driver implementation (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -220,12 +220,12 @@
{
/* Use 'kern' table if available since that can be faster; otherwise */
/* use GPOS kerning pairs if available. */
- if ( ttface->kern_avail_bits != 0 )
+ if ( ttface->kern_avail_bits )
kerning->x = sfnt->get_kerning( ttface,
left_glyph,
right_glyph );
#ifdef TT_CONFIG_OPTION_GPOS_KERNING
- else if ( ttface->gpos_kerning_available )
+ else if ( ttface->num_gpos_lookups_kerning )
kerning->x = sfnt->get_gpos_kerning( ttface,
left_glyph,
right_glyph );
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h
index 3e1cf234fcfd..943eaae3482f 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h
@@ -4,7 +4,7 @@
*
* High-level TrueType driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h b/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h
index 7ad937bd04d3..631dbf5a80fc 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h
@@ -4,7 +4,7 @@
*
* TrueType error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c
index b656ccf04e3c..4dd68ab10197 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c
@@ -4,7 +4,7 @@
*
* TrueType Glyph Loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -660,7 +660,7 @@
} while ( subglyph->flags & MORE_COMPONENTS );
gloader->current.num_subglyphs = num_subglyphs;
- FT_TRACE5(( " %d component%s\n",
+ FT_TRACE5(( " %u component%s\n",
num_subglyphs,
num_subglyphs > 1 ? "s" : "" ));
@@ -674,7 +674,7 @@
for ( i = 0; i < num_subglyphs; i++ )
{
if ( num_subglyphs > 1 )
- FT_TRACE7(( " subglyph %d:\n", i ));
+ FT_TRACE7(( " subglyph %u:\n", i ));
FT_TRACE7(( " glyph index: %d\n", subglyph->index ));
@@ -777,15 +777,11 @@
TT_Hint_Glyph( TT_Loader loader,
FT_Bool is_composite )
{
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- TT_Face face = loader->face;
- TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
-#endif
-
TT_GlyphZone zone = &loader->zone;
#ifdef TT_USE_BYTECODE_INTERPRETER
TT_ExecContext exec = loader->exec;
+ TT_Size size = loader->size;
FT_Long n_ins = exec->glyphSize;
#else
FT_UNUSED( is_composite );
@@ -797,9 +793,6 @@
if ( n_ins > 0 )
FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
- /* Reset graphics state. */
- exec->GS = loader->size->GS;
-
/* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
/* completely refer to the (already) hinted subglyphs. */
if ( is_composite )
@@ -811,8 +804,8 @@
}
else
{
- exec->metrics.x_scale = loader->size->metrics->x_scale;
- exec->metrics.y_scale = loader->size->metrics->y_scale;
+ exec->metrics.x_scale = size->metrics->x_scale;
+ exec->metrics.y_scale = size->metrics->y_scale;
}
#endif
@@ -838,7 +831,7 @@
exec->is_composite = is_composite;
exec->pts = *zone;
- error = TT_Run_Context( exec );
+ error = TT_Run_Context( exec, size );
if ( error && exec->pedantic_hinting )
return error;
@@ -854,8 +847,7 @@
/* to change bearings or advance widths. */
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
- exec->backward_compatibility )
+ if ( exec->backward_compatibility )
return FT_Err_Ok;
#endif
@@ -1152,30 +1144,15 @@
x = FT_MulFix( x, x_scale );
y = FT_MulFix( y, y_scale );
- if ( subglyph->flags & ROUND_XY_TO_GRID )
+ if ( subglyph->flags & ROUND_XY_TO_GRID &&
+ IS_HINTED( loader->load_flags ) )
{
- TT_Face face = loader->face;
- TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
-
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+ if ( !loader->exec->backward_compatibility )
+#endif
+ x = FT_PIX_ROUND( x );
- if ( IS_HINTED( loader->load_flags ) )
- {
- /*
- * We round the horizontal offset only if there is hinting along
- * the x axis; this corresponds to integer advance width values.
- *
- * Theoretically, a glyph's bytecode can toggle ClearType's
- * `backward compatibility' mode, which would allow modification
- * of the advance width. In reality, however, applications
- * neither allow nor expect modified advance widths if subpixel
- * rendering is active.
- *
- */
- if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 )
- x = FT_PIX_ROUND( x );
-
- y = FT_PIX_ROUND( y );
- }
+ y = FT_PIX_ROUND( y );
}
}
}
@@ -1204,8 +1181,6 @@
{
FT_Error error;
FT_Outline* outline = &loader->gloader->base.outline;
- FT_Stream stream = loader->stream;
- FT_UShort n_ins;
FT_UInt i;
@@ -1224,8 +1199,10 @@
#ifdef TT_USE_BYTECODE_INTERPRETER
{
- TT_ExecContext exec = loader->exec;
+ TT_ExecContext exec = loader->exec;
FT_Memory memory = exec->memory;
+ FT_Stream stream = loader->stream;
+ FT_UShort n_ins;
if ( exec->glyphSize )
@@ -1378,8 +1355,9 @@
if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
loader->exec &&
- loader->exec->subpixel_hinting_lean &&
- loader->exec->grayscale_cleartype )
+ loader->exec->mode != FT_RENDER_MODE_MONO &&
+ loader->exec->mode != FT_RENDER_MODE_LCD &&
+ loader->exec->mode != FT_RENDER_MODE_LCD_V )
{
loader->pp3.x = loader->advance / 2;
loader->pp4.x = loader->advance / 2;
@@ -1444,13 +1422,13 @@
#ifdef FT_DEBUG_LEVEL_TRACE
if ( recurse_count )
- FT_TRACE5(( " nesting level: %d\n", recurse_count ));
+ FT_TRACE5(( " nesting level: %u\n", recurse_count ));
#endif
/* some fonts have an incorrect value of `maxComponentDepth' */
if ( recurse_count > face->max_profile.maxComponentDepth )
{
- FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n",
+ FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %u\n",
recurse_count ));
face->max_profile.maxComponentDepth = (FT_UShort)recurse_count;
}
@@ -1566,18 +1544,18 @@
if ( header_only )
goto Exit;
- if ( loader->byte_len == 0 || loader->n_contours == 0 )
- {
#ifdef FT_CONFIG_OPTION_INCREMENTAL
- tt_get_metrics_incremental( loader, glyph_index );
+ tt_get_metrics_incremental( loader, glyph_index );
#endif
- tt_loader_set_pp( loader );
+ tt_loader_set_pp( loader );
+ /* shortcut for empty glyphs */
+ if ( loader->byte_len == 0 || loader->n_contours == 0 )
+ {
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
- FT_IS_VARIATION( FT_FACE( face ) ) )
+ if ( !IS_DEFAULT_INSTANCE( FT_FACE( face ) ) )
{
/* a small outline structure with four elements for */
/* communication with `TT_Vary_Apply_Glyph_Deltas' */
@@ -1627,11 +1605,6 @@
goto Exit;
}
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
- tt_get_metrics_incremental( loader, glyph_index );
-#endif
- tt_loader_set_pp( loader );
-
/***********************************************************************/
/***********************************************************************/
@@ -1735,8 +1708,7 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
- FT_IS_VARIATION( FT_FACE( face ) ) )
+ if ( !IS_DEFAULT_INSTANCE( FT_FACE( face ) ) )
{
FT_UShort i, limit;
FT_SubGlyph subglyph;
@@ -1953,6 +1925,9 @@
#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* restore the original stream */
+ loader->stream = face->root.stream;
+
if ( glyph_data_loaded )
face->root.internal->incremental_interface->funcs->free_glyph_data(
face->root.internal->incremental_interface->object,
@@ -2112,7 +2087,6 @@
{
TT_Face face = (TT_Face)glyph->face;
SFNT_Service sfnt = (SFNT_Service)face->sfnt;
- FT_Stream stream = face->root.stream;
FT_Error error;
TT_SBit_MetricsRec sbit_metrics;
@@ -2121,14 +2095,11 @@
size->strike_index,
glyph_index,
(FT_UInt)load_flags,
- stream,
+ face->root.stream,
&glyph->bitmap,
&sbit_metrics );
if ( !error )
{
- glyph->outline.n_points = 0;
- glyph->outline.n_contours = 0;
-
glyph->metrics.width = (FT_Pos)sbit_metrics.width * 64;
glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64;
@@ -2153,6 +2124,50 @@
glyph->bitmap_top = sbit_metrics.horiBearingY;
}
}
+ /* a missing glyph in a bitmap-only font is assumed whitespace */
+ /* that needs to be constructed using metrics data from `hmtx' */
+ /* and, optionally, `vmtx' tables */
+ else if ( FT_ERR_EQ( error, Missing_Bitmap ) &&
+ !FT_IS_SCALABLE( glyph->face ) &&
+ face->horz_metrics_size )
+ {
+ FT_Fixed x_scale = size->root.metrics.x_scale;
+ FT_Fixed y_scale = size->root.metrics.y_scale;
+
+ FT_Short left_bearing = 0;
+ FT_Short top_bearing = 0;
+
+ FT_UShort advance_width = 0;
+ FT_UShort advance_height = 0;
+
+
+ TT_Get_HMetrics( face, glyph_index,
+ &left_bearing,
+ &advance_width );
+ TT_Get_VMetrics( face, glyph_index,
+ 0,
+ &top_bearing,
+ &advance_height );
+
+ glyph->metrics.width = 0;
+ glyph->metrics.height = 0;
+
+ glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale );
+ glyph->metrics.horiBearingY = 0;
+ glyph->metrics.horiAdvance = FT_MulFix( advance_width, x_scale );
+
+ glyph->metrics.vertBearingX = 0;
+ glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale );
+ glyph->metrics.vertAdvance = FT_MulFix( advance_height, y_scale );
+
+ glyph->format = FT_GLYPH_FORMAT_BITMAP;
+ glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
+
+ glyph->bitmap_left = 0;
+ glyph->bitmap_top = 0;
+
+ error = FT_Err_Ok;
+ }
return error;
}
@@ -2168,15 +2183,6 @@
FT_Bool glyf_table_only )
{
TT_Face face = (TT_Face)glyph->face;
- FT_Stream stream = face->root.stream;
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
- FT_Error error;
- FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( glyph->face );
-#endif
-#endif
FT_ZERO( loader );
@@ -2186,122 +2192,80 @@
/* load execution context */
if ( IS_HINTED( load_flags ) && !glyf_table_only )
{
+ FT_Error error;
TT_ExecContext exec;
- FT_Bool grayscale = TRUE;
+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
+ FT_Bool grayscale = FT_BOOL( mode != FT_RENDER_MODE_MONO );
+ FT_Bool reexecute = FALSE;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- FT_Bool subpixel_hinting_lean;
- FT_Bool grayscale_cleartype;
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( glyph->face );
#endif
- FT_Bool reexecute = FALSE;
-
- if ( size->bytecode_ready < 0 || size->cvt_ready < 0 )
+ if ( size->bytecode_ready > 0 )
+ return size->bytecode_ready;
+ if ( size->bytecode_ready < 0 )
{
- error = tt_size_ready_bytecode( size, pedantic );
+ FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+
+
+ error = tt_size_init_bytecode( size, pedantic );
if ( error )
return error;
}
- else if ( size->bytecode_ready )
- return size->bytecode_ready;
- else if ( size->cvt_ready )
- return size->cvt_ready;
- /* query new execution context */
exec = size->context;
- if ( !exec )
- return FT_THROW( Could_Not_Find_Context );
-
- grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
- FT_RENDER_MODE_MONO );
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+ /* reset backward compatibility; note that */
+ /* the CVT program always runs without it */
+ exec->backward_compatibility = 0;
+
if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
{
- subpixel_hinting_lean =
- FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
- FT_RENDER_MODE_MONO );
- grayscale_cleartype =
- FT_BOOL( subpixel_hinting_lean &&
- !( ( load_flags &
- FT_LOAD_TARGET_LCD ) ||
- ( load_flags &
- FT_LOAD_TARGET_LCD_V ) ) );
- exec->vertical_lcd_lean =
- FT_BOOL( subpixel_hinting_lean &&
- ( load_flags &
- FT_LOAD_TARGET_LCD_V ) );
- grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean );
- }
- else
- {
- subpixel_hinting_lean = FALSE;
- grayscale_cleartype = FALSE;
- exec->vertical_lcd_lean = FALSE;
- }
-#endif
-
- error = TT_Load_Context( exec, face, size );
- if ( error )
- return error;
+ grayscale = FALSE;
- {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+ /* any mode change requires a re-execution of the CVT program */
+ if ( mode != exec->mode )
{
- /* a change from mono to subpixel rendering (and vice versa) */
- /* requires a re-execution of the CVT program */
- if ( subpixel_hinting_lean != exec->subpixel_hinting_lean )
- {
- FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
- " re-executing `prep' table\n" ));
-
- exec->subpixel_hinting_lean = subpixel_hinting_lean;
- reexecute = TRUE;
- }
-
- /* a change from colored to grayscale subpixel rendering (and */
- /* vice versa) requires a re-execution of the CVT program */
- if ( grayscale_cleartype != exec->grayscale_cleartype )
- {
- FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change,"
- " re-executing `prep' table\n" ));
+ FT_TRACE4(( "tt_loader_init: render mode change,"
+ " re-executing `prep' table\n" ));
- exec->grayscale_cleartype = grayscale_cleartype;
- reexecute = TRUE;
- }
+ exec->mode = mode;
+ reexecute = TRUE;
}
+ }
#endif
- /* a change from mono to grayscale rendering (and vice versa) */
- /* requires a re-execution of the CVT program */
- if ( grayscale != exec->grayscale )
- {
- FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
- " re-executing `prep' table\n" ));
+ /* a change from mono to grayscale rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( grayscale != exec->grayscale )
+ {
+ FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
+ " re-executing `prep' table\n" ));
- exec->grayscale = grayscale;
- reexecute = TRUE;
- }
+ exec->grayscale = grayscale;
+ reexecute = TRUE;
}
- if ( reexecute )
+ if ( size->cvt_ready > 0 )
+ return size->cvt_ready;
+ if ( size->cvt_ready < 0 || reexecute )
{
- error = tt_size_run_prep( size, pedantic );
- if ( error )
- return error;
- error = TT_Load_Context( exec, face, size );
+ error = tt_size_run_prep( size );
if ( error )
return error;
}
+ TT_Load_Context( exec, face, size );
+
/* check whether the cvt program has disabled hinting */
- if ( exec->GS.instruct_control & 1 )
+ if ( size->GS.instruct_control & 1 )
load_flags |= FT_LOAD_NO_HINTING;
- /* load default graphics state -- if needed */
- if ( exec->GS.instruct_control & 2 )
- exec->GS = tt_default_graphics_state;
+ /* check whether GS modifications should be reverted */
+ if ( size->GS.instruct_control & 2 )
+ size->GS = tt_default_graphics_state;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
/*
@@ -2318,28 +2282,24 @@
*
*/
if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
- subpixel_hinting_lean &&
+ mode != FT_RENDER_MODE_MONO &&
!FT_IS_TRICKY( glyph->face ) )
- exec->backward_compatibility = !( exec->GS.instruct_control & 4 );
- else
- exec->backward_compatibility = FALSE;
+ exec->backward_compatibility = ( size->GS.instruct_control & 4 ) ^ 4;
+
#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
- exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
loader->exec = exec;
- loader->instructions = exec->glyphIns;
/* Use the hdmx table if any unless FT_LOAD_COMPUTE_METRICS */
/* is set or backward compatibility mode of the v38 or v40 */
/* interpreters is active. See `ttinterp.h' for details on */
/* backward compatibility mode. */
- if ( IS_HINTED( loader->load_flags ) &&
- !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) &&
+ if ( IS_HINTED( load_flags ) &&
+ !( load_flags & FT_LOAD_COMPUTE_METRICS ) &&
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
- exec->backward_compatibility ) &&
+ !exec->backward_compatibility &&
#endif
- !face->postscript.isFixedPitch )
+ !face->postscript.isFixedPitch )
{
loader->widthp = size->widthp;
}
@@ -2364,7 +2324,7 @@
loader->face = face;
loader->size = size;
loader->glyph = (FT_GlyphSlot)glyph;
- loader->stream = stream;
+ loader->stream = face->root.stream;
loader->composites.head = NULL;
loader->composites.tail = NULL;
@@ -2426,84 +2386,26 @@
TT_LoaderRec loader;
- FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
+ FT_TRACE1(( "TT_Load_Glyph: glyph index %u\n", glyph_index ));
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/* try to load embedded bitmap (if any) */
- if ( size->strike_index != 0xFFFFFFFFUL &&
- ( load_flags & FT_LOAD_NO_BITMAP ) == 0 &&
- IS_DEFAULT_INSTANCE( glyph->face ) )
+ if ( size->strike_index != 0xFFFFFFFFUL &&
+ !( load_flags & FT_LOAD_NO_BITMAP &&
+ FT_IS_SCALABLE( glyph->face ) ) &&
+ IS_DEFAULT_INSTANCE( glyph->face ) )
{
- FT_Fixed x_scale = size->root.metrics.x_scale;
- FT_Fixed y_scale = size->root.metrics.y_scale;
-
-
error = load_sbit_image( size, glyph, glyph_index, load_flags );
- if ( FT_ERR_EQ( error, Missing_Bitmap ) )
- {
- /* the bitmap strike is incomplete and misses the requested glyph; */
- /* if we have a bitmap-only font, return an empty glyph */
- if ( !FT_IS_SCALABLE( glyph->face ) )
- {
- FT_Short left_bearing = 0;
- FT_Short top_bearing = 0;
-
- FT_UShort advance_width = 0;
- FT_UShort advance_height = 0;
-
-
- /* to return an empty glyph, however, we need metrics data */
- /* from the `hmtx' (or `vmtx') table; the assumption is that */
- /* empty glyphs are missing intentionally, representing */
- /* whitespace - not having at least horizontal metrics is */
- /* thus considered an error */
- if ( !face->horz_metrics_size )
- return error;
-
- /* we now construct an empty bitmap glyph */
- TT_Get_HMetrics( face, glyph_index,
- &left_bearing,
- &advance_width );
- TT_Get_VMetrics( face, glyph_index,
- 0,
- &top_bearing,
- &advance_height );
-
- glyph->outline.n_points = 0;
- glyph->outline.n_contours = 0;
-
- glyph->metrics.width = 0;
- glyph->metrics.height = 0;
-
- glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale );
- glyph->metrics.horiBearingY = 0;
- glyph->metrics.horiAdvance = FT_MulFix( advance_width, x_scale );
-
- glyph->metrics.vertBearingX = 0;
- glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale );
- glyph->metrics.vertAdvance = FT_MulFix( advance_height, y_scale );
-
- glyph->format = FT_GLYPH_FORMAT_BITMAP;
- glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
-
- glyph->bitmap_left = 0;
- glyph->bitmap_top = 0;
-
- return FT_Err_Ok;
- }
- }
- else if ( error )
- {
- /* return error if font is not scalable */
- if ( !FT_IS_SCALABLE( glyph->face ) )
- return error;
- }
- else
+ if ( !error )
{
if ( FT_IS_SCALABLE( glyph->face ) ||
FT_HAS_SBIX( glyph->face ) )
{
+ FT_Fixed x_scale = size->root.metrics.x_scale;
+ FT_Fixed y_scale = size->root.metrics.y_scale;
+
+
/* for the bbox we need the header only */
(void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
(void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
@@ -2550,8 +2452,10 @@
y_scale );
}
- return FT_Err_Ok;
+ goto Exit;
}
+ else if ( !FT_IS_SCALABLE( glyph->face ) )
+ goto Exit;
}
if ( load_flags & FT_LOAD_SBITS_ONLY )
@@ -2563,7 +2467,7 @@
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
/* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
- if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.ppem )
{
error = FT_THROW( Invalid_Size_Handle );
goto Exit;
@@ -2614,7 +2518,7 @@
glyph->metrics.horiAdvance = FT_MulFix( advanceX, x_scale );
glyph->metrics.vertAdvance = FT_MulFix( advanceY, y_scale );
- return error;
+ goto Exit;
}
FT_TRACE3(( "Failed to load SVG glyph\n" ));
@@ -2642,10 +2546,6 @@
goto Done;
}
- glyph->format = FT_GLYPH_FORMAT_OUTLINE;
- glyph->num_subglyphs = 0;
- glyph->outline.flags = 0;
-
/* main loading loop */
error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
if ( !error )
@@ -2657,9 +2557,18 @@
}
else
{
+ glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
glyph->outline = loader.gloader->base.outline;
glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
+ /* Set the `high precision' bit flag. This is _critical_ to */
+ /* get correct output for monochrome TrueType glyphs at all */
+ /* sizes using the bytecode interpreter. */
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+ size->metrics->y_ppem < 24 )
+ glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
/* Translate array so that (0,0) is the glyph's origin. Note */
/* that this behaviour is independent on the value of bit 1 of */
/* the `flags' field in the `head' table -- at least major */
@@ -2708,14 +2617,6 @@
error = compute_glyph_metrics( &loader, glyph_index );
}
- /* Set the `high precision' bit flag. */
- /* This is _critical_ to get correct output for monochrome */
- /* TrueType glyphs at all sizes using the bytecode interpreter. */
- /* */
- if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
- size->metrics->y_ppem < 24 )
- glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
FT_TRACE1(( " subglyphs = %u, contours = %hu, points = %hu,"
" flags = 0x%.3x\n",
loader.gloader->base.num_subglyphs,
@@ -2727,11 +2628,8 @@
tt_loader_done( &loader );
Exit:
-#ifdef FT_DEBUG_LEVEL_TRACE
- if ( error )
- FT_TRACE1(( " failed (error code 0x%x)\n",
- error ));
-#endif
+ FT_TRACE1(( error ? " failed (error code 0x%x)\n" : "",
+ error ));
return error;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h
index 22ea967f3013..39d6ae3664ca 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h
@@ -4,7 +4,7 @@
*
* TrueType Glyph Loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c
index 4f0083c96b7c..f8842795f14d 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c
@@ -4,7 +4,7 @@
*
* TrueType GX Font Variation loader
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
*
* This file is part of the FreeType project, and may only be used,
@@ -489,8 +489,9 @@
FT_UShort axis_count;
FT_UInt region_count;
- FT_UInt i, j;
- FT_Bool long_words;
+ FT_UInt i, j;
+ FT_Byte* bytes;
+ FT_Bool long_words;
GX_Blend blend = ttface->blend;
FT_ULong* dataOffsetArray = NULL;
@@ -526,11 +527,15 @@
if ( FT_QNEW_ARRAY( dataOffsetArray, data_count ) )
goto Exit;
+ if ( FT_FRAME_ENTER( data_count * 4 ) )
+ goto Exit;
+
+ bytes = stream->cursor;
+
for ( i = 0; i < data_count; i++ )
- {
- if ( FT_READ_ULONG( dataOffsetArray[i] ) )
- goto Exit;
- }
+ dataOffsetArray[i] = FT_NEXT_ULONG( bytes );
+
+ FT_FRAME_EXIT();
/* parse array of region records (region list) */
if ( FT_STREAM_SEEK( offset + region_offset ) )
@@ -564,13 +569,26 @@
goto Exit;
itemStore->regionCount = region_count;
- for ( i = 0; i < itemStore->regionCount; i++ )
+ if ( FT_FRAME_ENTER( (FT_Long)region_count * axis_count * 6 ) )
+ {
+ FT_TRACE2(( "tt_var_load_item_variation_store:"
+ " not enough data for variation regions\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ bytes = stream->cursor;
+
+ for ( i = 0; i < region_count; i++ )
{
GX_AxisCoords axisCoords;
if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList, axis_count ) )
+ {
+ FT_FRAME_EXIT();
goto Exit;
+ }
axisCoords = itemStore->varRegionList[i].axisList;
@@ -579,10 +597,9 @@
FT_Int start, peak, end;
- if ( FT_READ_SHORT( start ) ||
- FT_READ_SHORT( peak ) ||
- FT_READ_SHORT( end ) )
- goto Exit;
+ start = FT_NEXT_SHORT( bytes );
+ peak = FT_NEXT_SHORT( bytes );
+ end = FT_NEXT_SHORT( bytes );
/* immediately tag invalid ranges with special peak = 0 */
if ( ( start < 0 && end > 0 ) || start > peak || peak > end )
@@ -594,6 +611,8 @@
}
}
+ FT_FRAME_EXIT();
+
/* end of region list parse */
/* use dataOffsetArray now to parse varData items */
@@ -625,7 +644,7 @@
/* check some data consistency */
if ( word_delta_count > region_idx_count )
{
- FT_TRACE2(( "bad short count %d or region count %d\n",
+ FT_TRACE2(( "bad short count %d or region count %u\n",
word_delta_count,
region_idx_count ));
error = FT_THROW( Invalid_Table );
@@ -634,7 +653,7 @@
if ( region_idx_count > itemStore->regionCount )
{
- FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n",
+ FT_TRACE2(( "inconsistent regionCount %u in varData[%u]\n",
region_idx_count,
i ));
error = FT_THROW( Invalid_Table );
@@ -648,29 +667,39 @@
varData->wordDeltaCount = word_delta_count;
varData->longWords = long_words;
+ if ( FT_FRAME_ENTER( region_idx_count * 2 ) )
+ {
+ FT_TRACE2(( "tt_var_load_item_variation_store:"
+ " not enough data for region indices\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ bytes = stream->cursor;
+
for ( j = 0; j < varData->regionIdxCount; j++ )
{
- if ( FT_READ_USHORT( varData->regionIndices[j] ) )
- goto Exit;
+ varData->regionIndices[j] = FT_NEXT_USHORT( bytes );
if ( varData->regionIndices[j] >= itemStore->regionCount )
{
- FT_TRACE2(( "bad region index %d\n",
+ FT_TRACE2(( "bad region index %u\n",
varData->regionIndices[j] ));
+ FT_FRAME_EXIT();
error = FT_THROW( Invalid_Table );
goto Exit;
}
}
+ FT_FRAME_EXIT();
+
per_region_size = word_delta_count + region_idx_count;
if ( long_words )
per_region_size *= 2;
- if ( FT_NEW_ARRAY( varData->deltaSet, per_region_size * item_count ) )
+ if ( FT_QALLOC_MULT( varData->deltaSet, item_count, per_region_size ) )
goto Exit;
- if ( FT_Stream_Read( stream,
- varData->deltaSet,
- per_region_size * item_count ) )
+ if ( FT_STREAM_READ( varData->deltaSet, item_count * per_region_size ) )
{
FT_TRACE2(( "deltaSet read failed." ));
error = FT_THROW( Invalid_Table );
@@ -706,6 +735,7 @@
FT_UInt innerIndexMask;
FT_ULong i;
FT_UInt j;
+ FT_Byte* bytes;
if ( FT_STREAM_SEEK( offset ) ||
@@ -757,6 +787,16 @@
if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) )
goto Exit;
+ if ( FT_FRAME_ENTER( map->mapCount * entrySize ) )
+ {
+ FT_TRACE2(( "tt_var_load_delta_set_index_mapping:"
+ " invalid number of delta-set index mappings\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ bytes = stream->cursor;
+
for ( i = 0; i < map->mapCount; i++ )
{
FT_UInt mapData = 0;
@@ -769,9 +809,7 @@
FT_Byte data;
- if ( FT_READ_BYTE( data ) )
- goto Exit;
-
+ data = FT_NEXT_BYTE( bytes );
mapData = ( mapData << 8 ) | data;
}
@@ -789,7 +827,7 @@
if ( outerIndex >= itemStore->dataCount )
{
- FT_TRACE2(( "outerIndex[%ld] == %d out of range\n",
+ FT_TRACE2(( "outerIndex[%lu] == %u out of range\n",
i,
outerIndex ));
error = FT_THROW( Invalid_Table );
@@ -802,7 +840,7 @@
if ( innerIndex >= itemStore->varData[outerIndex].itemCount )
{
- FT_TRACE2(( "innerIndex[%ld] == %d out of range\n",
+ FT_TRACE2(( "innerIndex[%lu] == %u out of range\n",
i,
innerIndex ));
error = FT_THROW( Invalid_Table );
@@ -812,6 +850,8 @@
map->innerIndex[i] = innerIndex;
}
+ FT_FRAME_EXIT();
+
Exit:
return error;
}
@@ -965,28 +1005,181 @@
}
+ static FT_Fixed
+ tt_calculate_scalar( GX_AxisCoords axis,
+ FT_UInt axisCount,
+ FT_Fixed* normalizedcoords )
+ {
+ FT_Fixed scalar = 0x10000L;
+ FT_UInt j;
+
+
+ /* Inner loop steps through axes in this region. */
+ for ( j = 0; j < axisCount; j++, axis++ )
+ {
+ FT_Fixed ncv = normalizedcoords[j];
+
+
+ /* Compute the scalar contribution of this axis, */
+ /* with peak of 0 used for invalid axes. */
+ if ( axis->peakCoord == ncv ||
+ axis->peakCoord == 0 )
+ continue;
+
+ /* Ignore this region if coordinates are out of range. */
+ else if ( ncv <= axis->startCoord ||
+ ncv >= axis->endCoord )
+ {
+ scalar = 0;
+ break;
+ }
+
+ /* Cumulative product of all the axis scalars. */
+ else if ( ncv < axis->peakCoord )
+ scalar = FT_MulDiv( scalar,
+ ncv - axis->startCoord,
+ axis->peakCoord - axis->startCoord );
+ else /* ncv > axis->peakCoord */
+ scalar = FT_MulDiv( scalar,
+ axis->endCoord - ncv,
+ axis->endCoord - axis->peakCoord );
+
+ } /* per-axis loop */
+
+ return scalar;
+ }
+
+
+ static FT_Int64
+ ft_mul_add_delta_scalar( FT_Int64 returnValue,
+ FT_Int32 delta,
+ FT_Int32 scalar )
+ {
+
+#ifdef FT_INT64
+
+ return returnValue + (FT_Int64)delta * scalar;
+
+#else /* !FT_INT64 */
+
+ if ( (FT_UInt32)( delta + 0x8000 ) <= 0x20000 )
+ {
+ /* Fast path: multiplication result fits into 32 bits. */
+
+ FT_Int32 lo = delta * scalar;
+
+
+ returnValue.lo += (FT_UInt32)lo;
+
+ if ( returnValue.lo < (FT_UInt32)lo )
+ returnValue.hi += ( lo < 0 ) ? 0 : 1;
+
+ if ( lo < 0 )
+ returnValue.hi -= 1;
+
+ return returnValue;
+ }
+ else
+ {
+ /* Slow path: full 32x32 -> 64-bit signed multiplication. */
+
+ FT_Int64 product;
+
+ /* Get absolute values. */
+ FT_UInt32 a = ( delta < 0 ) ? -delta : delta;
+ FT_UInt32 b = ( scalar < 0 ) ? -scalar : scalar;
+
+ /* Prepare unsigned multiplication. */
+ FT_UInt32 a_lo = a & 0xFFFF;
+ FT_UInt32 a_hi = a >> 16;
+
+ FT_UInt32 b_lo = b & 0xFFFF;
+ FT_UInt32 b_hi = b >> 16;
+
+ /* Partial products. */
+ FT_UInt32 p0 = a_lo * b_lo;
+ FT_UInt32 p1 = a_lo * b_hi;
+ FT_UInt32 p2 = a_hi * b_lo;
+ FT_UInt32 p3 = a_hi * b_hi;
+
+ /* Combine: result = p3 << 32 + (p1 + p2) << 16 + p0 */
+ FT_UInt32 mid = p1 + p2;
+ FT_UInt32 mid_carry = ( mid < p1 );
+
+ FT_UInt32 carry;
+
+
+ product.lo = ( mid << 16 ) + ( p0 & 0xFFFF );
+ carry = ( product.lo < ( p0 & 0xFFFF ) ) ? 1 : 0;
+ product.hi = p3 + ( mid >> 16 ) + mid_carry + carry;
+
+ /* If result should be negative, negate. */
+ if ( ( delta < 0 ) ^ ( scalar < 0 ) )
+ {
+ product.lo = ~product.lo + 1;
+ product.hi = ~product.hi + ( product.lo == 0 ? 1 : 0 );
+ }
+
+ /* Add to `returnValue`. */
+ returnValue.lo += product.lo;
+ if ( returnValue.lo < product.lo )
+ returnValue.hi++;
+ returnValue.hi += product.hi;
+
+ return returnValue;
+ }
+
+#endif /* !FT_INT64 */
+
+ }
+
+
+ static FT_ItemVarDelta
+ ft_round_and_shift16( FT_Int64 returnValue )
+ {
+
+#ifdef FT_INT64
+
+ return (FT_ItemVarDelta)( returnValue + 0x8000L ) >> 16;
+
+#else /* !FT_INT64 */
+
+ FT_UInt hi = returnValue.hi;
+ FT_UInt lo = returnValue.lo;
+
+ FT_UInt delta;
+
+
+ /* Add 0x8000 to round. */
+ lo += 0x8000;
+ if ( lo < 0x8000 ) /* overflow occurred */
+ hi += 1;
+
+ /* Shift right by 16 bits. */
+ delta = ( hi << 16 ) | ( lo >> 16 );
+
+ return (FT_ItemVarDelta)delta;
+
+#endif /* !FT_INT64 */
+
+ }
+
+
FT_LOCAL_DEF( FT_ItemVarDelta )
tt_var_get_item_delta( FT_Face face, /* TT_Face */
GX_ItemVarStore itemStore,
FT_UInt outerIndex,
FT_UInt innerIndex )
{
- TT_Face ttface = (TT_Face)face;
- FT_Stream stream = FT_FACE_STREAM( face );
- FT_Memory memory = stream->memory;
- FT_Error error = FT_Err_Ok;
-
- GX_ItemVarData varData;
- FT_ItemVarDelta* deltaSet = NULL;
- FT_ItemVarDelta deltaSetStack[16];
+ TT_Face ttface = (TT_Face)face;
- FT_Fixed* scalars = NULL;
- FT_Fixed scalarsStack[16];
+ GX_ItemVarData varData;
- FT_UInt master, j;
- FT_ItemVarDelta returnValue = 0;
- FT_UInt per_region_size;
- FT_Byte* bytes;
+ FT_UInt master;
+ FT_Int64 returnValue = FT_INT64_ZERO;
+ FT_UInt shift_base = 1;
+ FT_UInt per_region_size;
+ FT_Byte* bytes;
if ( !ttface->blend || !ttface->blend->normalizedcoords )
@@ -1011,113 +1204,63 @@
if ( varData->regionIdxCount == 0 )
return 0; /* Avoid "applying zero offset to null pointer". */
- if ( varData->regionIdxCount < 16 )
- {
- deltaSet = deltaSetStack;
- scalars = scalarsStack;
- }
- else
- {
- if ( FT_QNEW_ARRAY( deltaSet, varData->regionIdxCount ) )
- goto Exit;
- if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) )
- goto Exit;
- }
-
/* Parse delta set. */
/* */
/* Deltas are (word_delta_count + region_idx_count) bytes each */
/* if `longWords` isn't set, and twice as much otherwise. */
per_region_size = varData->wordDeltaCount + varData->regionIdxCount;
if ( varData->longWords )
+ {
+ shift_base = 2;
per_region_size *= 2;
+ }
bytes = varData->deltaSet + per_region_size * innerIndex;
- if ( varData->longWords )
- {
- for ( master = 0; master < varData->wordDeltaCount; master++ )
- deltaSet[master] = FT_NEXT_LONG( bytes );
- for ( ; master < varData->regionIdxCount; master++ )
- deltaSet[master] = FT_NEXT_SHORT( bytes );
- }
- else
- {
- for ( master = 0; master < varData->wordDeltaCount; master++ )
- deltaSet[master] = FT_NEXT_SHORT( bytes );
- for ( ; master < varData->regionIdxCount; master++ )
- deltaSet[master] = FT_NEXT_CHAR( bytes );
- }
-
/* outer loop steps through master designs to be blended */
for ( master = 0; master < varData->regionIdxCount; master++ )
{
- FT_Fixed scalar = 0x10000L;
- FT_UInt regionIndex = varData->regionIndices[master];
+ FT_UInt regionIndex = varData->regionIndices[master];
GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList;
+ FT_Fixed scalar = tt_calculate_scalar(
+ axis,
+ itemStore->axisCount,
+ ttface->blend->normalizedcoords );
- /* inner loop steps through axes in this region */
- for ( j = 0; j < itemStore->axisCount; j++, axis++ )
- {
- FT_Fixed ncv = ttface->blend->normalizedcoords[j];
+ if ( scalar )
+ {
+ FT_Int delta;
- /* compute the scalar contribution of this axis */
- /* with peak of 0 used for invalid axes */
- if ( axis->peakCoord == ncv ||
- axis->peakCoord == 0 )
- continue;
- /* ignore this region if coords are out of range */
- else if ( ncv <= axis->startCoord ||
- ncv >= axis->endCoord )
+ if ( varData->longWords )
{
- scalar = 0;
- break;
+ if ( master < varData->wordDeltaCount )
+ delta = FT_NEXT_LONG( bytes );
+ else
+ delta = FT_NEXT_SHORT( bytes );
+ }
+ else
+ {
+ if ( master < varData->wordDeltaCount )
+ delta = FT_NEXT_SHORT( bytes );
+ else
+ delta = FT_NEXT_CHAR( bytes );
}
- /* cumulative product of all the axis scalars */
- else if ( ncv < axis->peakCoord )
- scalar = FT_MulDiv( scalar,
- ncv - axis->startCoord,
- axis->peakCoord - axis->startCoord );
- else /* ncv > axis->peakCoord */
- scalar = FT_MulDiv( scalar,
- axis->endCoord - ncv,
- axis->endCoord - axis->peakCoord );
-
- } /* per-axis loop */
-
- scalars[master] = scalar;
+ returnValue = ft_mul_add_delta_scalar( returnValue, delta, scalar );
+ }
+ else
+ {
+ /* Branch-free, yay. */
+ bytes += shift_base << ( master < varData->wordDeltaCount );
+ }
} /* per-region loop */
-
- /* 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 );
-
- Exit:
- if ( scalars != scalarsStack )
- FT_FREE( scalars );
- if ( deltaSet != deltaSetStack )
- FT_FREE( deltaSet );
-
- return returnValue;
+ return ft_round_and_shift16( returnValue );
}
@@ -1643,6 +1786,7 @@
GX_Blend blend = face->blend;
FT_Error error;
FT_UInt i, j;
+ FT_Byte* bytes;
FT_ULong table_len;
FT_ULong gvar_start;
FT_ULong offsetToData;
@@ -1734,6 +1878,8 @@
if ( FT_FRAME_ENTER( offsets_len ) )
goto Exit;
+ bytes = stream->cursor;
+
/* offsets (one more offset than glyphs, to mark size of last) */
if ( FT_QNEW_ARRAY( blend->glyphoffsets, gvar_head.glyphCount + 1 ) )
goto Fail2;
@@ -1744,16 +1890,24 @@
FT_ULong max_offset = 0;
+ if ( stream->limit - stream->cursor < gvar_head.glyphCount * 4 )
+ {
+ FT_TRACE2(( "ft_var_load_gvar:"
+ " glyph variation data offset not enough\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
for ( i = 0; i <= gvar_head.glyphCount; i++ )
{
- blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG();
+ blend->glyphoffsets[i] = offsetToData + FT_NEXT_ULONG( bytes );
if ( max_offset <= blend->glyphoffsets[i] )
max_offset = blend->glyphoffsets[i];
else
{
FT_TRACE2(( "ft_var_load_gvar:"
- " glyph variation data offset %d not monotonic\n",
+ " glyph variation data offset %u not monotonic\n",
i ));
blend->glyphoffsets[i] = max_offset;
}
@@ -1762,7 +1916,7 @@
if ( limit < blend->glyphoffsets[i] )
{
FT_TRACE2(( "ft_var_load_gvar:"
- " glyph variation data offset %d out of range\n",
+ " glyph variation data offset %u out of range\n",
i ));
blend->glyphoffsets[i] = limit;
}
@@ -1774,16 +1928,24 @@
FT_ULong max_offset = 0;
+ if ( stream->limit - stream->cursor < gvar_head.glyphCount * 2 )
+ {
+ FT_TRACE2(( "ft_var_load_gvar:"
+ " glyph variation data offset not enough\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
for ( i = 0; i <= gvar_head.glyphCount; i++ )
{
- blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+ blend->glyphoffsets[i] = offsetToData + FT_NEXT_USHORT( bytes ) * 2;
if ( max_offset <= blend->glyphoffsets[i] )
max_offset = blend->glyphoffsets[i];
else
{
FT_TRACE2(( "ft_var_load_gvar:"
- " glyph variation data offset %d not monotonic\n",
+ " glyph variation data offset %u not monotonic\n",
i ));
blend->glyphoffsets[i] = max_offset;
}
@@ -1792,7 +1954,7 @@
if ( limit < blend->glyphoffsets[i] )
{
FT_TRACE2(( "ft_var_load_gvar:"
- " glyph variation data offset %d out of range\n",
+ " glyph variation data offset %u out of range\n",
i ));
blend->glyphoffsets[i] = limit;
}
@@ -1814,6 +1976,8 @@
goto Fail;
}
+ bytes = stream->cursor;
+
if ( FT_QNEW_ARRAY( blend->tuplecoords,
gvar_head.axisCount * gvar_head.globalCoordCount ) )
goto Fail2;
@@ -1824,13 +1988,17 @@
for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ )
{
blend->tuplecoords[i * gvar_head.axisCount + j] =
- FT_fdot14ToFixed( FT_GET_SHORT() );
+ FT_fdot14ToFixed( FT_NEXT_SHORT( bytes ) );
FT_TRACE5(( "%.5f ",
(double)blend->tuplecoords[i * gvar_head.axisCount + j] / 65536 ));
}
FT_TRACE5(( "]\n" ));
}
+ if ( FT_NEW_ARRAY( blend->tuplescalars,
+ gvar_head.globalCoordCount ) )
+ goto Fail2;
+
blend->tuplecount = gvar_head.globalCoordCount;
FT_TRACE5(( "\n" ));
@@ -1896,15 +2064,25 @@
for ( i = 0; i < blend->num_axis; i++ )
{
- FT_Fixed ncv = blend->normalizedcoords[i];
+ FT_Fixed ncv;
- FT_TRACE6(( " axis %d coordinate %.5f:\n", i, (double)ncv / 65536 ));
+ if ( tuple_coords[i] == 0 )
+ {
+ FT_TRACE6(( " tuple coordinate is zero, ignore\n" ));
+ continue;
+ }
- /* It's not clear why (for intermediate tuples) we don't need */
- /* to check against start/end -- the documentation says we don't. */
- /* Similarly, it's unclear why we don't need to scale along the */
- /* axis. */
+ ncv = blend->normalizedcoords[i];
+
+ FT_TRACE6(( " axis %u coordinate %.5f:\n", i, (double)ncv / 65536 ));
+
+ if ( ncv == 0 )
+ {
+ FT_TRACE6(( " axis coordinate is zero, stop\n" ));
+ apply = 0;
+ break;
+ }
if ( tuple_coords[i] == ncv )
{
@@ -1914,12 +2092,6 @@
continue;
}
- if ( tuple_coords[i] == 0 )
- {
- FT_TRACE6(( " tuple coordinate is zero, ignore\n" ));
- continue;
- }
-
if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
{
/* not an intermediate tuple */
@@ -2001,7 +2173,7 @@
if ( num_coords > mmvar->num_axis )
{
FT_TRACE2(( "ft_var_to_normalized:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
mmvar->num_axis, num_coords ));
num_coords = mmvar->num_axis;
}
@@ -2016,7 +2188,7 @@
FT_Fixed coord = coords[i];
- FT_TRACE5(( " %d: %.5f\n", i, (double)coord / 65536 ));
+ FT_TRACE5(( " %u: %.5f\n", i, (double)coord / 65536 ));
if ( coord > a->maximum || coord < a->minimum )
{
FT_TRACE1(( "ft_var_to_normalized: design coordinate %.5f\n",
@@ -2156,7 +2328,7 @@
if ( num_coords > blend->num_axis )
{
FT_TRACE2(( "ft_var_to_design:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
blend->num_axis, num_coords ));
nc = blend->num_axis;
}
@@ -2516,7 +2688,7 @@
" minimum default maximum flags\n" ));
/* " XXXX.XXXXX XXXX.XXXXX XXXX.XXXXX 0xXXXX" */
- FT_TRACE5(( " %3d `%s'"
+ FT_TRACE5(( " %3u `%s'"
" %10.5f %10.5f %10.5f 0x%04X%s\n",
i,
a->name,
@@ -2608,7 +2780,7 @@
(void)FT_STREAM_SEEK( pos );
- FT_TRACE5(( " named instance %d (%s%s%s, %s%s%s)\n",
+ FT_TRACE5(( " named instance %u (%s%s%s, %s%s%s)\n",
i,
strname ? "name: `" : "",
strname ? strname : "unnamed",
@@ -2636,7 +2808,7 @@
FT_UInt strid = ~0U;
- /* The default instance is missing in array the */
+ /* The default instance is missing in the array */
/* of named instances; try to synthesize an entry. */
/* If this fails, `default_named_instance` remains */
/* at value zero, which doesn't do any harm. */
@@ -2766,10 +2938,18 @@
} manageCvt;
- face->doblend = FALSE;
-
if ( !face->blend )
{
+ face->doblend = FALSE;
+ for ( i = 0; i < num_coords; i++ )
+ if ( coords[i] )
+ {
+ face->doblend = TRUE;
+ break;
+ }
+ if ( !face->doblend )
+ goto Exit;
+
if ( FT_SET_ERROR( TT_Get_MM_Var( FT_FACE( face ), NULL ) ) )
goto Exit;
}
@@ -2780,7 +2960,7 @@
if ( num_coords > mmvar->num_axis )
{
FT_TRACE2(( "TT_Set_MM_Blend:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
mmvar->num_axis, num_coords ));
num_coords = mmvar->num_axis;
}
@@ -2882,11 +3062,7 @@
/* return value -1 indicates `no change' */
if ( !have_diff )
- {
- face->doblend = TRUE;
-
return -1;
- }
for ( ; i < mmvar->num_axis; i++ )
{
@@ -2915,7 +3091,15 @@
blend->normalizedcoords,
blend->coords );
- face->doblend = TRUE;
+ face->doblend = FALSE;
+ for ( i = 0; i < blend->num_axis; i++ )
+ {
+ if ( blend->normalizedcoords[i] )
+ {
+ face->doblend = TRUE;
+ break;
+ }
+ }
if ( face->cvt )
{
@@ -2941,6 +3125,9 @@
}
}
+ for ( i = 0 ; i < blend->tuplecount ; i++ )
+ blend->tuplescalars[i] = (FT_Fixed)-0x20000L;
+
Exit:
return error;
}
@@ -2980,7 +3167,24 @@
FT_UInt num_coords,
FT_Fixed* coords )
{
- return tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 );
+ FT_Error error;
+
+
+ error = tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 );
+ if ( error == FT_Err_Ok )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0; i < num_coords; i++ )
+ if ( coords[i] )
+ {
+ error = -2; /* -2 means is_variable. */
+ break;
+ }
+ }
+
+ return error;
}
@@ -3043,7 +3247,7 @@
if ( num_coords > blend->num_axis )
{
FT_TRACE2(( "TT_Get_MM_Blend:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
blend->num_axis, num_coords ));
nc = blend->num_axis;
}
@@ -3125,7 +3329,7 @@
if ( num_coords > mmvar->num_axis )
{
FT_TRACE2(( "TT_Set_Var_Design:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
mmvar->num_axis, num_coords ));
num_coords = mmvar->num_axis;
}
@@ -3201,6 +3405,15 @@
if ( error )
goto Exit;
+ for ( i = 0; i < num_coords; i++ )
+ {
+ if ( normalized[i] )
+ {
+ error = -2; /* -2 means is_variable. */
+ break;
+ }
+ }
+
Exit:
FT_FREE( normalized );
return error;
@@ -3237,10 +3450,12 @@
FT_UInt num_coords,
FT_Fixed* coords )
{
- TT_Face ttface = (TT_Face)face;
- FT_Error error = FT_Err_Ok;
- GX_Blend blend;
- FT_UInt i, nc;
+ TT_Face ttface = (TT_Face)face;
+ FT_Error error = FT_Err_Ok;
+ GX_Blend blend;
+ FT_MM_Var* mmvar;
+ FT_Var_Axis* a;
+ FT_UInt i, nc;
if ( !ttface->blend )
@@ -3263,24 +3478,26 @@
if ( num_coords > blend->num_axis )
{
FT_TRACE2(( "TT_Get_Var_Design:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
blend->num_axis, num_coords ));
nc = blend->num_axis;
}
+ mmvar = blend->mmvar;
+ a = mmvar->axis;
if ( ttface->doblend )
{
- for ( i = 0; i < nc; i++ )
+ for ( i = 0; i < nc; i++, a++ )
coords[i] = blend->coords[i];
}
else
{
- for ( i = 0; i < nc; i++ )
- coords[i] = 0;
+ for ( i = 0; i < nc; i++, a++ )
+ coords[i] = a->def;
}
- for ( ; i < num_coords; i++ )
- coords[i] = 0;
+ for ( ; i < num_coords; i++, a++ )
+ coords[i] = a->def;
return FT_Err_Ok;
}
@@ -3373,6 +3590,9 @@
error = TT_Set_Var_Design( face, 0, NULL );
}
+ if ( error == -1 || error == -2 )
+ error = FT_Err_Ok;
+
Exit:
return error;
}
@@ -3591,7 +3811,7 @@
FT_Stream_SeekSet( stream, here );
}
- FT_TRACE5(( "cvar: there %s %d tuple%s:\n",
+ FT_TRACE5(( "cvar: there %s %u tuple%s:\n",
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
tupleCount & GX_TC_TUPLE_COUNT_MASK,
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
@@ -3610,7 +3830,7 @@
FT_Fixed apply;
- FT_TRACE6(( " tuple %d:\n", i ));
+ FT_TRACE6(( " tuple %u:\n", i ));
tupleDataSize = FT_GET_USHORT();
tupleIndex = FT_GET_USHORT();
@@ -3676,7 +3896,7 @@
if ( !points || !deltas )
; /* failure, ignore it */
- else if ( localpoints == ALL_POINTS )
+ else if ( points == ALL_POINTS )
{
#ifdef FT_DEBUG_LEVEL_TRACE
int count = 0;
@@ -3697,7 +3917,7 @@
#ifdef FT_DEBUG_LEVEL_TRACE
if ( old_cvt_delta != cvt_deltas[j] )
{
- FT_TRACE7(( " %d: %f -> %f\n",
+ FT_TRACE7(( " %u: %f -> %f\n",
j,
(double)( FT_fdot6ToFixed( face->cvt[j] ) +
old_cvt_delta ) / 65536,
@@ -4027,7 +4247,7 @@
FT_Outline* outline,
FT_Vector* unrounded )
{
- FT_Error error;
+ FT_Error error = FT_Err_Ok;
TT_Face face = loader->face;
FT_Stream stream = face->root.stream;
FT_Memory memory = stream->memory;
@@ -4047,6 +4267,15 @@
FT_ULong here;
FT_UInt i, j;
+ FT_UInt peak_coords_size;
+ FT_UInt point_deltas_x_size;
+ FT_UInt points_org_size;
+ FT_UInt points_out_size;
+ FT_UInt has_delta_size;
+ FT_UInt pool_size;
+ FT_Byte* pool = NULL;
+ FT_Byte* p;
+
FT_Fixed* peak_coords = NULL;
FT_Fixed* tuple_coords;
FT_Fixed* im_start_coords;
@@ -4067,21 +4296,24 @@
FT_Fixed* point_deltas_y = NULL;
- if ( !face->doblend || !blend )
- return FT_THROW( Invalid_Argument );
-
for ( i = 0; i < n_points; i++ )
{
unrounded[i].x = INT_TO_F26DOT6( outline->points[i].x );
unrounded[i].y = INT_TO_F26DOT6( outline->points[i].y );
}
+ if ( !face->doblend )
+ goto Exit;
+
+ if ( !blend )
+ return FT_THROW( Invalid_Argument );
+
if ( glyph_index >= blend->gv_glyphcnt ||
blend->glyphoffsets[glyph_index] ==
blend->glyphoffsets[glyph_index + 1] )
{
FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
- " no variation data for glyph %d\n", glyph_index ));
+ " no variation data for glyph %u\n", glyph_index ));
return FT_Err_Ok;
}
@@ -4125,18 +4357,41 @@
FT_Stream_SeekSet( stream, here );
}
- FT_TRACE5(( "gvar: there %s %d tuple%s:\n",
+ FT_TRACE5(( "gvar: there %s %u tuple%s:\n",
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
tupleCount & GX_TC_TUPLE_COUNT_MASK,
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
- if ( FT_QNEW_ARRAY( peak_coords, 3 * blend->num_axis ) ||
- FT_NEW_ARRAY( point_deltas_x, 2 * n_points ) ||
- FT_QNEW_ARRAY( points_org, n_points ) ||
- FT_QNEW_ARRAY( points_out, n_points ) ||
- FT_QNEW_ARRAY( has_delta, n_points ) )
+ peak_coords_size = ALIGN_SIZE( 3 * blend->num_axis *
+ sizeof ( *peak_coords ) );
+ point_deltas_x_size = ALIGN_SIZE( 2 * n_points *
+ sizeof ( *point_deltas_x ) );
+ points_org_size = ALIGN_SIZE( n_points * sizeof ( *points_org ) );
+ points_out_size = ALIGN_SIZE( n_points * sizeof ( *points_out ) );
+ has_delta_size = ALIGN_SIZE( n_points * sizeof ( *has_delta ) );
+
+ pool_size = peak_coords_size +
+ point_deltas_x_size +
+ points_org_size +
+ points_out_size +
+ has_delta_size;
+
+ if ( FT_ALLOC( pool, pool_size ) )
goto Exit;
+ p = pool;
+ peak_coords = (FT_Fixed*)p;
+ p += peak_coords_size;
+ point_deltas_x = (FT_Fixed*)p;
+ p += point_deltas_x_size;
+ points_org = (FT_Vector*)p;
+ p += points_org_size;
+ points_out = (FT_Vector*)p;
+ p += points_out_size;
+ has_delta = (FT_Bool*)p;
+
+ FT_ARRAY_ZERO( point_deltas_x, 2 * n_points );
+
im_start_coords = peak_coords + blend->num_axis;
im_end_coords = im_start_coords + blend->num_axis;
point_deltas_y = point_deltas_x + n_points;
@@ -4147,27 +4402,70 @@
points_org[j].y = FT_intToFixed( outline->points[j].y );
}
- for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ )
+ p = stream->cursor;
+
+ tupleCount &= GX_TC_TUPLE_COUNT_MASK;
+ for ( i = 0; i < tupleCount; i++ )
{
- FT_UInt tupleDataSize;
- FT_UInt tupleIndex;
- FT_Fixed apply;
+ FT_UInt tupleDataSize;
+ FT_UInt tupleIndex;
+ FT_Fixed apply;
+ FT_Fixed* tupleScalars;
- FT_TRACE6(( " tuple %d:\n", i ));
+ FT_TRACE6(( " tuple %u:\n", i ));
- tupleDataSize = FT_GET_USHORT();
- tupleIndex = FT_GET_USHORT();
+ tupleScalars = blend->tuplescalars;
+
+ /* Enter frame for four bytes. */
+ if ( 4 > stream->limit - p )
+ {
+ FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+ " invalid glyph variation array header\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ tupleDataSize = FT_NEXT_USHORT( p );
+ tupleIndex = FT_NEXT_USHORT( p );
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ tupleScalars = NULL;
if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
{
+ if ( 2 * blend->num_axis > (FT_UInt)( stream->limit - p ) )
+ {
+ FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+ " invalid glyph variation array header\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
for ( j = 0; j < blend->num_axis; j++ )
- peak_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+ peak_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
+
tuple_coords = peak_coords;
+ tupleScalars = NULL;
}
else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) < blend->tuplecount )
+ {
+ FT_Fixed scalar =
+ tupleScalars
+ ? tupleScalars[tupleIndex & GX_TI_TUPLE_INDEX_MASK]
+ : (FT_Fixed)-0x20000;
+
+
+ if ( scalar != (FT_Fixed)-0x20000 )
+ {
+ apply = scalar;
+ goto apply_found;
+ }
+
tuple_coords = blend->tuplecoords +
- ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis;
+ ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) *
+ blend->num_axis;
+ }
else
{
FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
@@ -4179,10 +4477,18 @@
if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
{
+ if ( 4 * blend->num_axis > (FT_UInt)( stream->limit - p ) )
+ {
+ FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+ " invalid glyph variation array header\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
for ( j = 0; j < blend->num_axis; j++ )
- im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+ im_start_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
for ( j = 0; j < blend->num_axis; j++ )
- im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+ im_end_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
}
apply = ft_var_apply_tuple( blend,
@@ -4191,6 +4497,11 @@
im_start_coords,
im_end_coords );
+ if ( tupleScalars )
+ tupleScalars[tupleIndex & GX_TI_TUPLE_INDEX_MASK] = apply;
+
+ apply_found:
+
if ( apply == 0 ) /* tuple isn't active for our blend */
{
offsetToData += tupleDataSize;
@@ -4247,7 +4558,7 @@
#ifdef FT_DEBUG_LEVEL_TRACE
if ( point_delta_x || point_delta_y )
{
- FT_TRACE7(( " %d: (%f, %f) -> (%f, %f)\n",
+ FT_TRACE7(( " %u: (%f, %f) -> (%f, %f)\n",
j,
(double)( FT_intToFixed( outline->points[j].x ) +
old_point_delta_x ) / 65536,
@@ -4321,7 +4632,7 @@
#ifdef FT_DEBUG_LEVEL_TRACE
if ( point_delta_x || point_delta_y )
{
- FT_TRACE7(( " %d: (%f, %f) -> (%f, %f)\n",
+ FT_TRACE7(( " %u: (%f, %f) -> (%f, %f)\n",
j,
(double)( FT_intToFixed( outline->points[j].x ) +
old_point_delta_x ) / 65536,
@@ -4402,11 +4713,7 @@
Exit:
if ( sharedpoints != ALL_POINTS )
FT_FREE( sharedpoints );
- FT_FREE( points_org );
- FT_FREE( points_out );
- FT_FREE( has_delta );
- FT_FREE( peak_coords );
- FT_FREE( point_deltas_x );
+ FT_FREE( pool );
FExit:
FT_FRAME_EXIT();
@@ -4577,6 +4884,7 @@
FT_FREE( blend->mvar_table );
}
+ FT_FREE( blend->tuplescalars );
FT_FREE( blend->tuplecoords );
FT_FREE( blend->glyphoffsets );
FT_FREE( blend );
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h
index 9326011e3a24..568c8027bbf8 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h
@@ -4,7 +4,7 @@
*
* TrueType GX Font Variation loader (specification)
*
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
* David Turner, Robert Wilhelm, Werner Lemberg and George Williams.
*
* This file is part of the FreeType project, and may only be used,
@@ -255,6 +255,10 @@ FT_BEGIN_HEADER
* A two-dimensional array that holds the shared tuple coordinates
* in the `gvar' table.
*
+ * tuplescalars ::
+ * A one-dimensional array that holds the shared tuple
+ * scalars in the `gvar' table for current face coordinates.
+ *
* gv_glyphcnt ::
* The number of glyphs handled in the `gvar' table.
*
@@ -293,6 +297,7 @@ FT_BEGIN_HEADER
FT_UInt tuplecount;
FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */
+ FT_Fixed* tuplescalars; /* tuplescalars[tuplecount] */
FT_UInt gv_glyphcnt;
FT_ULong* glyphoffsets; /* glyphoffsets[gv_glyphcnt + 1] */
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c
index 951891dbf51c..f46cc77fe5f0 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c
@@ -4,7 +4,7 @@
*
* TrueType bytecode interpreter (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -27,6 +27,8 @@
#include
#include
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
#include "ttinterp.h"
#include "tterrors.h"
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
@@ -34,9 +36,6 @@
#endif
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-
/**************************************************************************
*
* The macro FT_COMPONENT is used in trace mode. It is an implicit
@@ -89,58 +88,37 @@
#define FAILURE 1
- /**************************************************************************
- *
- * CODERANGE FUNCTIONS
- *
- */
+ /* The default value for `scan_control' is documented as FALSE in the */
+ /* TrueType specification. This is confusing since it implies a */
+ /* Boolean value. However, this is not the case, thus both the */
+ /* default values of our `scan_type' and `scan_control' fields (which */
+ /* the documentation's `scan_control' variable is split into) are */
+ /* zero. */
+ /* */
+ /* The rounding compensation should logically belong here but poorly */
+ /* described in the OpenType specs. It was probably important in the */
+ /* days of dot matrix printers. The values are referenced by color */
+ /* as Gray, Black, and White in order. The Apple specification says */
+ /* that the Gray compensation is always zero. The fourth value is */
+ /* not described at all, but Greg says that it is the same as Gray. */
+ /* FreeType sets all compensation values to zero. */
+
+ const TT_GraphicsState tt_default_graphics_state =
+ {
+ 0, 0, 0, 1, 1, 1,
+ { 0x4000, 0 }, { 0x4000, 0 }, { 0x4000, 0 },
+ 1, 1, { 0, 0, 0, 0 },
+
+ 64, 68, 0, 0, 9, 3,
+ TRUE, 0, FALSE, 0
+ };
/**************************************************************************
*
- * @Function:
- * TT_Goto_CodeRange
- *
- * @Description:
- * Switches to a new code range (updates the code related elements in
- * `exec', and `IP').
- *
- * @Input:
- * range ::
- * The new execution code range.
- *
- * IP ::
- * The new IP in the new code range.
+ * CODERANGE FUNCTIONS
*
- * @InOut:
- * exec ::
- * The target execution context.
*/
- FT_LOCAL_DEF( void )
- TT_Goto_CodeRange( TT_ExecContext exec,
- FT_Int range,
- FT_Long IP )
- {
- TT_CodeRange* coderange;
-
-
- FT_ASSERT( range >= 1 && range <= 3 );
-
- coderange = &exec->codeRangeTable[range - 1];
-
- FT_ASSERT( coderange->base );
-
- /* NOTE: Because the last instruction of a program may be a CALL */
- /* which will return to the first byte *after* the code */
- /* range, we test for IP <= Size instead of IP < Size. */
- /* */
- FT_ASSERT( IP <= coderange->size );
-
- exec->code = coderange->base;
- exec->codeSize = coderange->size;
- exec->IP = IP;
- exec->curRange = range;
- }
/**************************************************************************
@@ -168,13 +146,19 @@
FT_LOCAL_DEF( void )
TT_Set_CodeRange( TT_ExecContext exec,
FT_Int range,
- void* base,
+ FT_Byte* base,
FT_Long length )
{
FT_ASSERT( range >= 1 && range <= 3 );
- exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+ exec->codeRangeTable[range - 1].base = base;
exec->codeRangeTable[range - 1].size = length;
+
+ exec->code = base;
+ exec->codeSize = length;
+ exec->IP = 0;
+ exec->curRange = range;
+ exec->iniRange = range;
}
@@ -224,9 +208,6 @@
* exec ::
* A handle to the target execution context.
*
- * memory ::
- * A handle to the parent memory object.
- *
* @Note:
* Only the glyph loader and debugger should call this function.
*/
@@ -240,10 +221,6 @@
exec->maxPoints = 0;
exec->maxContours = 0;
- /* free stack */
- FT_FREE( exec->stack );
- exec->stackSize = 0;
-
/* free glyf cvt working area */
FT_FREE( exec->glyfCvt );
exec->glyfCvtSize = 0;
@@ -295,79 +272,31 @@
*
* Note that not all members of `TT_ExecContext` get initialized.
*/
- FT_LOCAL_DEF( FT_Error )
+ FT_LOCAL_DEF( void )
TT_Load_Context( TT_ExecContext exec,
TT_Face face,
TT_Size size )
{
- FT_Int i;
- TT_MaxProfile* maxp;
- FT_Error error;
- FT_Memory memory = exec->memory;
+ FT_Memory memory = exec->memory;
exec->face = face;
- maxp = &face->max_profile;
exec->size = size;
- if ( size )
- {
- exec->numFDefs = size->num_function_defs;
- exec->maxFDefs = size->max_function_defs;
- exec->numIDefs = size->num_instruction_defs;
- exec->maxIDefs = size->max_instruction_defs;
- exec->FDefs = size->function_defs;
- exec->IDefs = size->instruction_defs;
- exec->pointSize = size->point_size;
- exec->tt_metrics = size->ttmetrics;
- exec->metrics = *size->metrics;
-
- exec->maxFunc = size->max_func;
- exec->maxIns = size->max_ins;
-
- for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
- exec->codeRangeTable[i] = size->codeRangeTable[i];
-
- /* set graphics state */
- exec->GS = size->GS;
-
- exec->cvtSize = size->cvt_size;
- exec->cvt = size->cvt;
-
- exec->storeSize = size->storage_size;
- exec->storage = size->storage;
-
- exec->twilight = size->twilight;
-
- /* In case of multi-threading it can happen that the old size object */
- /* no longer exists, thus we must clear all glyph zone references. */
- FT_ZERO( &exec->zp0 );
- exec->zp1 = exec->zp0;
- exec->zp2 = exec->zp0;
- }
-
- /* XXX: We reserve a little more elements on the stack to deal safely */
- /* with broken fonts like arialbs, courbs, timesbs, etc. */
- if ( FT_QRENEW_ARRAY( exec->stack,
- exec->stackSize,
- maxp->maxStackElements + 32 ) )
- return error;
- exec->stackSize = maxp->maxStackElements + 32;
+ /* CVT and storage are not persistent in FreeType */
+ /* reset them after they might have been modified */
+ exec->storage = exec->stack + exec->stackSize;
+ exec->cvt = exec->storage + exec->storeSize;
/* free previous glyph code range */
FT_FREE( exec->glyphIns );
exec->glyphSize = 0;
- exec->pts.n_points = 0;
- exec->pts.n_contours = 0;
-
- exec->zp1 = exec->pts;
- exec->zp2 = exec->pts;
- exec->zp0 = exec->pts;
-
- exec->instruction_trap = FALSE;
+ exec->pointSize = size->point_size;
+ exec->tt_metrics = size->ttmetrics;
+ exec->metrics = *size->metrics;
- return FT_Err_Ok;
+ exec->twilight = size->twilight;
}
@@ -394,89 +323,22 @@
TT_Save_Context( TT_ExecContext exec,
TT_Size size )
{
- FT_Int i;
-
-
- /* XXX: Will probably disappear soon with all the code range */
- /* management, which is now rather obsolete. */
- /* */
- size->num_function_defs = exec->numFDefs;
- size->num_instruction_defs = exec->numIDefs;
-
- size->max_func = exec->maxFunc;
- size->max_ins = exec->maxIns;
-
- for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
- size->codeRangeTable[i] = exec->codeRangeTable[i];
- }
-
-
- /**************************************************************************
- *
- * @Function:
- * TT_Run_Context
- *
- * @Description:
- * Executes one or more instructions in the execution context.
- *
- * @Input:
- * exec ::
- * A handle to the target execution context.
- *
- * @Return:
- * TrueType error code. 0 means success.
- */
- FT_LOCAL_DEF( FT_Error )
- TT_Run_Context( TT_ExecContext exec )
- {
- TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 );
-
- exec->zp0 = exec->pts;
- exec->zp1 = exec->pts;
- exec->zp2 = exec->pts;
-
- exec->GS.gep0 = 1;
- exec->GS.gep1 = 1;
- exec->GS.gep2 = 1;
-
- exec->GS.projVector.x = 0x4000;
- exec->GS.projVector.y = 0x0000;
-
- exec->GS.freeVector = exec->GS.projVector;
- exec->GS.dualVector = exec->GS.projVector;
-
- exec->GS.round_state = 1;
- exec->GS.loop = 1;
-
- /* some glyphs leave something on the stack. so we clean it */
- /* before a new execution. */
- exec->top = 0;
- exec->callTop = 0;
+ /* UNDOCUMENTED! */
+ /* Only these GS values can be modified by the CVT program. */
- return exec->face->interpreter( exec );
+ size->GS.minimum_distance = exec->GS.minimum_distance;
+ size->GS.control_value_cutin = exec->GS.control_value_cutin;
+ size->GS.single_width_cutin = exec->GS.single_width_cutin;
+ size->GS.single_width_value = exec->GS.single_width_value;
+ size->GS.delta_base = exec->GS.delta_base;
+ size->GS.delta_shift = exec->GS.delta_shift;
+ size->GS.auto_flip = exec->GS.auto_flip;
+ size->GS.instruct_control = exec->GS.instruct_control;
+ size->GS.scan_control = exec->GS.scan_control;
+ size->GS.scan_type = exec->GS.scan_type;
}
- /* The default value for `scan_control' is documented as FALSE in the */
- /* TrueType specification. This is confusing since it implies a */
- /* Boolean value. However, this is not the case, thus both the */
- /* default values of our `scan_type' and `scan_control' fields (which */
- /* the documentation's `scan_control' variable is split into) are */
- /* zero. */
-
- const TT_GraphicsState tt_default_graphics_state =
- {
- 0, 0, 0,
- { 0x4000, 0 },
- { 0x4000, 0 },
- { 0x4000, 0 },
-
- 1, 64, 1,
- TRUE, 68, 0, 0, 9, 3,
- 0, FALSE, 0, 1, 1, 1
- };
-
-
/* documentation is in ttinterp.h */
FT_EXPORT_DEF( TT_ExecContext )
@@ -485,7 +347,8 @@
FT_Memory memory;
FT_Error error;
- TT_ExecContext exec = NULL;
+ TT_ExecContext exec = NULL;
+ FT_DebugHook_Func interp;
if ( !driver )
@@ -497,6 +360,15 @@
if ( FT_NEW( exec ) )
goto Fail;
+ /* set `exec->interpreter' according to the debug hook present, */
+ /* which is used by 'ttdebug'. */
+ interp = driver->root.root.library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+
+ if ( interp )
+ exec->interpreter = (TT_Interpreter)interp;
+ else
+ exec->interpreter = (TT_Interpreter)TT_RunIns;
+
/* create callStack here, other allocations delayed */
exec->memory = memory;
exec->callSize = 32;
@@ -1160,20 +1032,35 @@
#undef PACK
-#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+#ifdef FT_INT64
+
+#define TT_MulFix14( a, b ) TT_MulFix14_64( a, b )
+
+ static inline FT_F26Dot6
+ TT_MulFix14_64( FT_F26Dot6 a,
+ FT_F2Dot14 b )
+ {
+ FT_Int64 ab = MUL_INT64( a, b );
+
+
+ ab = ADD_INT64( ab, 0x2000 + ( ab >> 63 ) ); /* rounding phase */
+
+ return (FT_F26Dot6)( ab >> 14 );
+ }
+
+#elif !defined( FT_CONFIG_OPTION_NO_ASSEMBLER )
#if defined( __arm__ ) && \
( defined( __thumb2__ ) || !defined( __thumb__ ) )
#define TT_MulFix14 TT_MulFix14_arm
- static FT_Int32
+ static __inline FT_Int32
TT_MulFix14_arm( FT_Int32 a,
- FT_Int b )
+ FT_Int32 b )
{
FT_Int32 t, t2;
-
#if defined( __CC_ARM ) || defined( __ARMCC__ )
__asm
@@ -1199,8 +1086,8 @@
#endif
"adds %1, %1, %0\n\t" /* %1 += %0 */
"adc %2, %2, #0\n\t" /* %2 += carry */
- "mov %0, %1, lsr #14\n\t" /* %0 = %1 >> 16 */
- "orr %0, %0, %2, lsl #18\n\t" /* %0 |= %2 << 16 */
+ "mov %0, %1, lsr #14\n\t" /* %0 = %1 >> 14 */
+ "orr %0, %0, %2, lsl #18\n\t" /* %0 |= %2 << 18 */
: "=r"(a), "=&r"(t2), "=&r"(t)
: "r"(a), "r"(b)
: "cc" );
@@ -1210,49 +1097,60 @@
return a;
}
-#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */
-
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
-
-#if defined( __GNUC__ ) && \
- ( defined( __i386__ ) || defined( __x86_64__ ) )
+#elif defined( __i386__ ) || defined( _M_IX86 )
-#define TT_MulFix14 TT_MulFix14_long_long
+#define TT_MulFix14 TT_MulFix14_i386
- /* Temporarily disable the warning that C90 doesn't support `long long'. */
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
+ /* documentation is in freetype.h */
- /* This is declared `noinline' because inlining the function results */
- /* in slower code. The `pure' attribute indicates that the result */
- /* only depends on the parameters. */
- static __attribute__(( noinline ))
- __attribute__(( pure )) FT_Int32
- TT_MulFix14_long_long( FT_Int32 a,
- FT_Int b )
+ static __inline FT_Int32
+ TT_MulFixi14_i386( FT_Int32 a,
+ FT_Int32 b )
{
+ FT_Int32 result;
- long long ret = (long long)a * b;
+#if defined( __GNUC__ )
- /* The following line assumes that right shifting of signed values */
- /* will actually preserve the sign bit. The exact behaviour is */
- /* undefined, but this is true on x86 and x86_64. */
- long long tmp = ret >> 63;
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x2000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $14, %%eax\n"
+ "shll $18, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "=d"(b)
+ : "a"(a), "d"(b)
+ : "%ecx", "cc" );
+
+#elif defined( _MSC_VER)
+ __asm
+ {
+ mov eax, a
+ mov edx, b
+ imul edx
+ mov ecx, edx
+ sar ecx, 31
+ add ecx, 2000h
+ add eax, ecx
+ adc edx, 0
+ shr eax, 14
+ shl edx, 18
+ add eax, edx
+ mov result, eax
+ }
- ret += 0x2000 + tmp;
+#endif
- return (FT_Int32)( ret >> 14 );
+ return result;
}
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
+#endif /* __i386__ || _M_IX86 */
-#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
#ifndef TT_MulFix14
@@ -1262,92 +1160,59 @@
/* for platforms where sizeof(int) == 2. */
static FT_Int32
TT_MulFix14( FT_Int32 a,
- FT_Int b )
+ FT_Int16 b )
{
- FT_Int32 sign;
- FT_UInt32 ah, al, mid, lo, hi;
-
-
- sign = a ^ b;
+ FT_Int32 m, hi;
+ FT_UInt32 l, lo;
- if ( a < 0 )
- a = -a;
- if ( b < 0 )
- b = -b;
- ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
- al = (FT_UInt32)( a & 0xFFFFU );
+ /* compute a*b as 64-bit (hi_lo) value */
+ l = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+ m = ( a >> 16 ) * b;
- lo = al * b;
- mid = ah * b;
- hi = mid >> 16;
- mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
- lo += mid;
- if ( lo < mid )
- hi += 1;
+ lo = l + ( (FT_UInt32)m << 16 );
+ hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
- mid = ( lo >> 14 ) | ( hi << 18 );
+ /* divide the result by 2^14 with rounding */
+ l = lo + 0x2000U + (FT_UInt32)( hi >> 31 ); /* rounding phase */
+ hi += ( l < lo );
- return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+ return (FT_F26Dot6)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
}
#endif /* !TT_MulFix14 */
-#if defined( __GNUC__ ) && \
- ( defined( __i386__ ) || \
- defined( __x86_64__ ) || \
- defined( __arm__ ) )
-
-#define TT_DotFix14 TT_DotFix14_long_long
-
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
+#ifdef FT_INT64
- static __attribute__(( pure )) FT_Int32
- TT_DotFix14_long_long( FT_Int32 ax,
- FT_Int32 ay,
- FT_Int bx,
- FT_Int by )
+ /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
+ static inline FT_F26Dot6
+ TT_DotFix14( FT_F26Dot6 ax,
+ FT_F26Dot6 ay,
+ FT_F2Dot14 bx,
+ FT_F2Dot14 by )
{
- /* Temporarily disable the warning that C90 doesn't support */
- /* `long long'. */
-
- long long temp1 = (long long)ax * bx;
- long long temp2 = (long long)ay * by;
-
+ FT_Int64 c = ADD_INT64( MUL_INT64( ax, bx ), MUL_INT64( ay, by ) );
- temp1 += temp2;
- temp2 = temp1 >> 63;
- temp1 += 0x2000 + temp2;
- return (FT_Int32)( temp1 >> 14 );
+ c = ADD_INT64( c, 0x2000 + ( c >> 63 ) ); /* rounding phase */
+ return (FT_F26Dot6)( c >> 14 );
}
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
-
-#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */
-
-
-#ifndef TT_DotFix14
+#else
- /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
- static FT_Int32
- TT_DotFix14( FT_Int32 ax,
- FT_Int32 ay,
- FT_Int bx,
- FT_Int by )
+ static inline FT_F26Dot6
+ TT_DotFix14( FT_F26Dot6 ax,
+ FT_F26Dot6 ay,
+ FT_F2Dot14 bx,
+ FT_F2Dot14 by )
{
- FT_Int32 m, s, hi1, hi2, hi;
+ FT_Int32 m, hi1, hi2, hi;
FT_UInt32 l, lo1, lo2, lo;
- /* compute ax*bx as 64-bit value */
+ /* compute ax*bx as 64-bit (hi_lo) value */
l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
m = ( ax >> 16 ) * bx;
@@ -1366,18 +1231,13 @@
hi = hi1 + hi2 + ( lo < lo1 );
/* divide the result by 2^14 with rounding */
- s = hi >> 31;
- l = lo + (FT_UInt32)s;
- hi += s + ( l < lo );
- lo = l;
-
- l = lo + 0x2000U;
+ l = lo + 0x2000U + (FT_UInt32)( hi >> 31 ); /* rounding phase */
hi += ( l < lo );
- return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+ return (FT_F26Dot6)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
}
-#endif /* TT_DotFix14 */
+#endif /* !FT_INT64 */
/**************************************************************************
@@ -1531,31 +1391,6 @@
}
- /**************************************************************************
- *
- * @Function:
- * GetShortIns
- *
- * @Description:
- * Returns a short integer taken from the instruction stream at
- * address IP.
- *
- * @Return:
- * Short read at code[IP].
- *
- * @Note:
- * This one could become a macro.
- */
- static FT_Short
- GetShortIns( TT_ExecContext exc )
- {
- /* Reading a byte stream so there is no endianness (DaveP) */
- exc->IP += 2;
- return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) +
- exc->code[exc->IP - 1] );
- }
-
-
/**************************************************************************
*
* @Function:
@@ -1609,6 +1444,7 @@
exc->code = range->base;
exc->codeSize = range->size;
exc->IP = aIP;
+ exc->length = 0;
exc->curRange = aRange;
return SUCCESS;
@@ -1671,48 +1507,33 @@
FT_UShort point,
FT_F26Dot6 distance )
{
- FT_F26Dot6 v;
+ FT_Fixed v;
- v = exc->GS.freeVector.x;
-
+ v = exc->moveVector.x;
if ( v != 0 )
{
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
/* Exception to the post-IUP curfew: Allow the x component of */
/* diagonal moves, but only post-IUP. DejaVu tries to adjust */
/* diagonal stems like on `Z' and `z' post-IUP. */
- if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
- zone->cur[point].x = ADD_LONG( zone->cur[point].x,
- FT_MulDiv( distance,
- v,
- exc->F_dot_P ) );
- else
+ if ( !exc->backward_compatibility )
#endif
-
- if ( NO_SUBPIXEL_HINTING )
zone->cur[point].x = ADD_LONG( zone->cur[point].x,
- FT_MulDiv( distance,
- v,
- exc->F_dot_P ) );
+ FT_MulFix( distance, v ) );
zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
}
- v = exc->GS.freeVector.y;
-
+ v = exc->moveVector.y;
if ( v != 0 )
{
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( !( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called &&
- exc->iupy_called ) )
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( exc->backward_compatibility != 0x7 )
#endif
zone->cur[point].y = ADD_LONG( zone->cur[point].y,
- FT_MulDiv( distance,
- v,
- exc->F_dot_P ) );
+ FT_MulFix( distance, v ) );
zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
}
@@ -1745,24 +1566,20 @@
FT_UShort point,
FT_F26Dot6 distance )
{
- FT_F26Dot6 v;
+ FT_Fixed v;
- v = exc->GS.freeVector.x;
+ v = exc->moveVector.x;
if ( v != 0 )
zone->org[point].x = ADD_LONG( zone->org[point].x,
- FT_MulDiv( distance,
- v,
- exc->F_dot_P ) );
+ FT_MulFix( distance, v ) );
- v = exc->GS.freeVector.y;
+ v = exc->moveVector.y;
if ( v != 0 )
zone->org[point].y = ADD_LONG( zone->org[point].y,
- FT_MulDiv( distance,
- v,
- exc->F_dot_P ) );
+ FT_MulFix( distance, v ) );
}
@@ -1784,12 +1601,8 @@
FT_F26Dot6 distance )
{
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
- zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
- else
+ if ( !exc->backward_compatibility )
#endif
-
- if ( NO_SUBPIXEL_HINTING )
zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
@@ -1805,9 +1618,8 @@
FT_UNUSED( exc );
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( !( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called && exc->iupy_called ) )
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( exc->backward_compatibility != 0x7 )
#endif
zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance );
@@ -1860,8 +1672,8 @@
* distance ::
* The distance (not) to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* The compensated distance.
@@ -1869,10 +1681,10 @@
static FT_F26Dot6
Round_None( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -1903,8 +1715,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -1912,10 +1724,10 @@
static FT_F26Dot6
Round_To_Grid( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -1948,8 +1760,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -1957,10 +1769,10 @@
static FT_F26Dot6
Round_To_Half_Grid( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -1995,8 +1807,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -2004,10 +1816,10 @@
static FT_F26Dot6
Round_Down_To_Grid( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -2039,8 +1851,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -2048,10 +1860,10 @@
static FT_F26Dot6
Round_Up_To_Grid( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -2084,8 +1896,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -2093,10 +1905,10 @@
static FT_F26Dot6
Round_To_Double_Grid( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
+ FT_UNUSED( exc );
if ( distance >= 0 )
@@ -2129,8 +1941,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -2144,9 +1956,8 @@
static FT_F26Dot6
Round_Super( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
@@ -2185,8 +1996,8 @@
* distance ::
* The distance to round.
*
- * color ::
- * The engine compensation color.
+ * compensation ::
+ * The engine compensation.
*
* @Return:
* Rounded distance.
@@ -2198,9 +2009,8 @@
static FT_F26Dot6
Round_Super_45( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color )
+ FT_F26Dot6 compensation )
{
- FT_F26Dot6 compensation = exc->tt_metrics.compensations[color];
FT_F26Dot6 val;
@@ -2227,59 +2037,6 @@
}
- /**************************************************************************
- *
- * @Function:
- * Compute_Round
- *
- * @Description:
- * Sets the rounding mode.
- *
- * @Input:
- * round_mode ::
- * The rounding mode to be used.
- */
- static void
- Compute_Round( TT_ExecContext exc,
- FT_Byte round_mode )
- {
- switch ( round_mode )
- {
- case TT_Round_Off:
- exc->func_round = (TT_Round_Func)Round_None;
- break;
-
- case TT_Round_To_Grid:
- exc->func_round = (TT_Round_Func)Round_To_Grid;
- break;
-
- case TT_Round_Up_To_Grid:
- exc->func_round = (TT_Round_Func)Round_Up_To_Grid;
- break;
-
- case TT_Round_Down_To_Grid:
- exc->func_round = (TT_Round_Func)Round_Down_To_Grid;
- break;
-
- case TT_Round_To_Half_Grid:
- exc->func_round = (TT_Round_Func)Round_To_Half_Grid;
- break;
-
- case TT_Round_To_Double_Grid:
- exc->func_round = (TT_Round_Func)Round_To_Double_Grid;
- break;
-
- case TT_Round_Super:
- exc->func_round = (TT_Round_Func)Round_Super;
- break;
-
- case TT_Round_Super_45:
- exc->func_round = (TT_Round_Func)Round_Super_45;
- break;
- }
- }
-
-
/**************************************************************************
*
* @Function:
@@ -2481,14 +2238,45 @@
static void
Compute_Funcs( TT_ExecContext exc )
{
- if ( exc->GS.freeVector.x == 0x4000 )
- exc->F_dot_P = exc->GS.projVector.x;
- else if ( exc->GS.freeVector.y == 0x4000 )
- exc->F_dot_P = exc->GS.projVector.y;
+ FT_Long F_dot_P =
+ ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x +
+ (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y +
+ 0x2000L ) >> 14;
+
+
+ if ( F_dot_P >= 0x3FFEL )
+ {
+ /* commonly collinear */
+ exc->moveVector.x = exc->GS.freeVector.x * 4;
+ exc->moveVector.y = exc->GS.freeVector.y * 4;
+ }
+ else if ( -0x400L < F_dot_P && F_dot_P < 0x400L )
+ {
+ /* prohibitively orthogonal */
+ exc->moveVector.x = 0;
+ exc->moveVector.y = 0;
+ }
+ else
+ {
+ exc->moveVector.x = exc->GS.freeVector.x * 0x10000L / F_dot_P;
+ exc->moveVector.y = exc->GS.freeVector.y * 0x10000L / F_dot_P;
+ }
+
+ if ( F_dot_P >= 0x3FFEL && exc->GS.freeVector.x == 0x4000 )
+ {
+ exc->func_move = (TT_Move_Func)Direct_Move_X;
+ exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+ }
+ else if ( F_dot_P >= 0x3FFEL && exc->GS.freeVector.y == 0x4000 )
+ {
+ exc->func_move = (TT_Move_Func)Direct_Move_Y;
+ exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+ }
else
- exc->F_dot_P =
- ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x +
- (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14;
+ {
+ exc->func_move = (TT_Move_Func)Direct_Move;
+ exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+ }
if ( exc->GS.projVector.x == 0x4000 )
exc->func_project = (TT_Project_Func)Project_x;
@@ -2504,29 +2292,6 @@
else
exc->func_dualproj = (TT_Project_Func)Dual_Project;
- exc->func_move = (TT_Move_Func)Direct_Move;
- exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig;
-
- if ( exc->F_dot_P == 0x4000L )
- {
- if ( exc->GS.freeVector.x == 0x4000 )
- {
- exc->func_move = (TT_Move_Func)Direct_Move_X;
- exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
- }
- else if ( exc->GS.freeVector.y == 0x4000 )
- {
- exc->func_move = (TT_Move_Func)Direct_Move_Y;
- exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
- }
- }
-
- /* at small sizes, F_dot_P can become too small, resulting */
- /* in overflows and `spikes' in a number of glyphs like `w'. */
-
- if ( FT_ABS( exc->F_dot_P ) < 0x400L )
- exc->F_dot_P = 0x4000L;
-
/* Disable cached aspect ratio */
exc->tt_metrics.ratio = 0;
}
@@ -2799,7 +2564,7 @@
Ins_ODD( TT_ExecContext exc,
FT_Long* args )
{
- args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 64 );
+ args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 64 ) == 64 );
}
@@ -2813,7 +2578,7 @@
Ins_EVEN( TT_ExecContext exc,
FT_Long* args )
{
- args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 0 );
+ args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 64 ) == 0 );
}
@@ -3020,7 +2785,7 @@
FT_MEM_QRENEW_ARRAY( exc->glyfStorage,
exc->glyfStoreSize,
exc->storeSize );
- exc->error = error;
+ exc->error = error;
if ( error )
return;
@@ -3143,7 +2908,8 @@
Ins_ROUND( TT_ExecContext exc,
FT_Long* args )
{
- args[0] = exc->func_round( exc, args[0], exc->opcode & 3 );
+ args[0] = exc->func_round( exc, args[0],
+ exc->GS.compensation[exc->opcode & 3] );
}
@@ -3157,7 +2923,8 @@
Ins_NROUND( TT_ExecContext exc,
FT_Long* args )
{
- args[0] = Round_None( exc, args[0], exc->opcode & 3 );
+ args[0] = Round_None( exc, args[0],
+ exc->GS.compensation[exc->opcode & 3] );
}
@@ -3211,13 +2978,11 @@
}
else
{
- K = exc->stack[exc->args - L];
+ K = args[-L];
- FT_ARRAY_MOVE( &exc->stack[exc->args - L ],
- &exc->stack[exc->args - L + 1],
- ( L - 1 ) );
+ FT_ARRAY_MOVE( args - L, args - L + 1, L - 1 );
- exc->stack[exc->args - 1] = K;
+ args[-1] = K;
}
}
@@ -3244,7 +3009,7 @@
args[0] = 0;
}
else
- args[0] = exc->stack[exc->args - L];
+ args[0] = args[-L];
}
@@ -3314,8 +3079,7 @@
exc->length = 2 - exc->length * exc->code[exc->IP + 1];
}
- if ( exc->IP + exc->length <= exc->codeSize )
- return SUCCESS;
+ return SUCCESS;
}
Fail_Overflow:
@@ -3363,6 +3127,9 @@
nIfs--;
Out = FT_BOOL( nIfs == 0 );
break;
+
+ default:
+ break;
}
} while ( Out == 0 );
}
@@ -3396,6 +3163,9 @@
case 0x59: /* EIF */
nIfs--;
break;
+
+ default:
+ break;
}
} while ( nIfs != 0 );
}
@@ -3439,7 +3209,7 @@
return;
}
- exc->step_ins = FALSE;
+ exc->length = 0;
if ( args[0] < 0 )
{
@@ -3540,10 +3310,10 @@
return;
}
- rec->range = exc->curRange;
- rec->opc = (FT_UInt16)n;
- rec->start = exc->IP + 1;
- rec->active = TRUE;
+ rec->range = exc->curRange;
+ rec->opc = (FT_UInt16)n;
+ rec->start = exc->IP + 1;
+ rec->active = TRUE;
if ( n > exc->maxFunc )
exc->maxFunc = (FT_UInt16)n;
@@ -3555,14 +3325,17 @@
{
switch ( exc->opcode )
{
- case 0x89: /* IDEF */
- case 0x2C: /* FDEF */
+ case 0x89: /* IDEF */
+ case 0x2C: /* FDEF */
exc->error = FT_THROW( Nested_DEFS );
return;
case 0x2D: /* ENDF */
rec->end = exc->IP;
return;
+
+ default:
+ break;
}
}
}
@@ -3592,12 +3365,11 @@
pRec->Cur_Count--;
- exc->step_ins = FALSE;
-
if ( pRec->Cur_Count > 0 )
{
exc->callTop++;
- exc->IP = pRec->Def->start;
+ exc->IP = pRec->Def->start;
+ exc->length = 0;
}
else
/* Loop through the current function */
@@ -3685,8 +3457,6 @@
Ins_Goto_CodeRange( exc, def->range, def->start );
- exc->step_ins = FALSE;
-
return;
Fail:
@@ -3764,8 +3534,6 @@
Ins_Goto_CodeRange( exc, def->range, def->start );
- exc->step_ins = FALSE;
-
exc->loopcall_counter += (FT_ULong)args[0];
if ( exc->loopcall_counter > exc->loopcall_counter_max )
exc->error = FT_THROW( Execution_Too_Long );
@@ -3845,9 +3613,13 @@
case 0x2C: /* FDEF */
exc->error = FT_THROW( Nested_DEFS );
return;
+
case 0x2D: /* ENDF */
def->end = exc->IP;
return;
+
+ default:
+ break;
}
}
}
@@ -3870,10 +3642,23 @@
Ins_NPUSHB( TT_ExecContext exc,
FT_Long* args )
{
- FT_UShort L, K;
+ FT_Long IP = exc->IP;
+ FT_Int L, K;
+
+ if ( ++IP >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
- L = (FT_UShort)exc->code[exc->IP + 1];
+ L = exc->code[IP];
+
+ if ( IP + L >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
{
@@ -3881,10 +3666,11 @@
return;
}
- for ( K = 1; K <= L; K++ )
- args[K - 1] = exc->code[exc->IP + K + 1];
+ for ( K = 0; K < L; K++ )
+ args[K] = exc->code[++IP];
exc->new_top += L;
+ exc->IP = IP;
}
@@ -3898,10 +3684,23 @@
Ins_NPUSHW( TT_ExecContext exc,
FT_Long* args )
{
- FT_UShort L, K;
+ FT_Long IP = exc->IP;
+ FT_Int L, K;
- L = (FT_UShort)exc->code[exc->IP + 1];
+ if ( ++IP >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
+
+ L = exc->code[IP];
+
+ if ( IP + 2 * L >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
{
@@ -3909,13 +3708,12 @@
return;
}
- exc->IP += 2;
+ /* note casting for sign-extension */
+ for ( K = 0; K < L; K++, IP += 2 )
+ args[K] = (FT_Short)( exc->code[IP + 1] << 8 ) | exc->code[IP + 2];
- for ( K = 0; K < L; K++ )
- args[K] = GetShortIns( exc );
-
- exc->step_ins = FALSE;
exc->new_top += L;
+ exc->IP = IP;
}
@@ -3929,10 +3727,17 @@
Ins_PUSHB( TT_ExecContext exc,
FT_Long* args )
{
- FT_UShort L, K;
+ FT_Long IP = exc->IP;
+ FT_Int L, K;
- L = (FT_UShort)( exc->opcode - 0xB0 + 1 );
+ L = exc->opcode - 0xB0 + 1;
+
+ if ( IP + L >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
{
@@ -3940,8 +3745,10 @@
return;
}
- for ( K = 1; K <= L; K++ )
- args[K - 1] = exc->code[exc->IP + K];
+ for ( K = 0; K < L; K++ )
+ args[K] = exc->code[++IP];
+
+ exc->IP = IP;
}
@@ -3955,10 +3762,17 @@
Ins_PUSHW( TT_ExecContext exc,
FT_Long* args )
{
- FT_UShort L, K;
+ FT_Long IP = exc->IP;
+ FT_Int L, K;
+
+ L = exc->opcode - 0xB8 + 1;
- L = (FT_UShort)( exc->opcode - 0xB8 + 1 );
+ if ( IP + 2 * L >= exc->codeSize )
+ {
+ exc->error = FT_THROW( Code_Overflow );
+ return;
+ }
if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
{
@@ -3966,12 +3780,11 @@
return;
}
- exc->IP++;
+ /* note casting for sign-extension */
+ for ( K = 0; K < L; K++, IP += 2 )
+ args[K] = (FT_Short)( exc->code[IP + 1] << 8 ) | exc->code[IP + 2];
- for ( K = 0; K < L; K++ )
- args[K] = GetShortIns( exc );
-
- exc->step_ins = FALSE;
+ exc->IP = IP;
}
@@ -4142,15 +3955,12 @@
Ins_SPVFS( TT_ExecContext exc,
FT_Long* args )
{
- FT_Short S;
FT_Long X, Y;
/* Only use low 16bits, then sign extend */
- S = (FT_Short)args[1];
- Y = (FT_Long)S;
- S = (FT_Short)args[0];
- X = (FT_Long)S;
+ Y = (FT_Short)args[1];
+ X = (FT_Short)args[0];
Normalize( X, Y, &exc->GS.projVector );
@@ -4169,15 +3979,12 @@
Ins_SFVFS( TT_ExecContext exc,
FT_Long* args )
{
- FT_Short S;
FT_Long X, Y;
/* Only use low 16bits, then sign extend */
- S = (FT_Short)args[1];
- Y = (FT_Long)S;
- S = (FT_Short)args[0];
- X = S;
+ Y = (FT_Short)args[1];
+ X = (FT_Short)args[0];
Normalize( X, Y, &exc->GS.freeVector );
Compute_Funcs( exc );
@@ -4915,7 +4722,7 @@
/* compatibility hacks and lets them program points to the grid like */
/* it's 1996. They might sign a waiver for just one glyph, though. */
if ( SUBPIXEL_HINTING_MINIMAL )
- exc->backward_compatibility = !FT_BOOL( L == 4 );
+ exc->backward_compatibility = ( L & 4 ) ^ 4;
#endif
}
else if ( exc->pedantic_hinting )
@@ -4999,32 +4806,31 @@
* Stack: uint32... -->
*/
static void
- Ins_FLIPPT( TT_ExecContext exc )
+ Ins_FLIPPT( TT_ExecContext exc,
+ FT_Long* args )
{
+ FT_Long loop = exc->GS.loop;
FT_UShort point;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- /* See `ttinterp.h' for details on backward compatibility mode. */
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called &&
- exc->iupy_called )
- goto Fail;
-#endif
-
- if ( exc->top < exc->GS.loop )
+ if ( exc->new_top < loop )
{
if ( exc->pedantic_hinting )
exc->error = FT_THROW( Too_Few_Arguments );
goto Fail;
}
- while ( exc->GS.loop > 0 )
- {
- exc->args--;
+ exc->new_top -= loop;
- point = (FT_UShort)exc->stack[exc->args];
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( exc->backward_compatibility == 0x7 )
+ goto Fail;
+#endif
+
+ while ( loop-- )
+ {
+ point = (FT_UShort)*(--args);
if ( BOUNDS( point, exc->pts.n_points ) )
{
@@ -5036,13 +4842,10 @@
}
else
exc->pts.tags[point] ^= FT_CURVE_TAG_ON;
-
- exc->GS.loop--;
}
Fail:
exc->GS.loop = 1;
- exc->new_top = exc->args;
}
@@ -5061,10 +4864,7 @@
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
/* See `ttinterp.h' for details on backward compatibility mode. */
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called &&
- exc->iupy_called )
+ if ( exc->backward_compatibility == 0x7 )
return;
#endif
@@ -5099,10 +4899,7 @@
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
/* See `ttinterp.h' for details on backward compatibility mode. */
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called &&
- exc->iupy_called )
+ if ( exc->backward_compatibility == 0x7 )
return;
#endif
@@ -5158,8 +4955,8 @@
d = PROJECT( zp.cur + p, zp.org + p );
- *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P );
- *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P );
+ *x = FT_MulFix( d, exc->moveVector.x );
+ *y = FT_MulFix( d, exc->moveVector.y );
return SUCCESS;
}
@@ -5176,8 +4973,8 @@
if ( exc->GS.freeVector.x != 0 )
{
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( !( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility ) )
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( !exc->backward_compatibility )
#endif
exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx );
@@ -5188,10 +4985,8 @@
if ( exc->GS.freeVector.y != 0 )
{
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( !( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility &&
- exc->iupx_called &&
- exc->iupy_called ) )
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( exc->backward_compatibility != 0x7 )
#endif
exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy );
@@ -5208,8 +5003,10 @@
* Stack: uint32... -->
*/
static void
- Ins_SHP( TT_ExecContext exc )
+ Ins_SHP( TT_ExecContext exc,
+ FT_Long* args )
{
+ FT_Long loop = exc->GS.loop;
TT_GlyphZoneRec zp;
FT_UShort refp;
@@ -5217,20 +5014,21 @@
FT_UShort point;
- if ( exc->top < exc->GS.loop )
+ if ( exc->new_top < loop )
{
if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Invalid_Reference );
+ exc->error = FT_THROW( Too_Few_Arguments );
goto Fail;
}
+ exc->new_top -= loop;
+
if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
return;
- while ( exc->GS.loop > 0 )
+ while ( loop-- )
{
- exc->args--;
- point = (FT_UShort)exc->stack[exc->args];
+ point = (FT_UShort)*(--args);
if ( BOUNDS( point, exc->zp2.n_points ) )
{
@@ -5242,13 +5040,10 @@
}
else
Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
- exc->GS.loop--;
}
Fail:
exc->GS.loop = 1;
- exc->new_top = exc->args;
}
@@ -5364,6 +5159,7 @@
Ins_SHPIX( TT_ExecContext exc,
FT_Long* args )
{
+ FT_Long loop = exc->GS.loop;
FT_F26Dot6 dx, dy;
FT_UShort point;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
@@ -5373,22 +5169,21 @@
#endif
-
- if ( exc->top < exc->GS.loop + 1 )
+ if ( exc->new_top < loop )
{
if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Invalid_Reference );
+ exc->error = FT_THROW( Too_Few_Arguments );
goto Fail;
}
+ exc->new_top -= loop;
+
dx = TT_MulFix14( args[0], exc->GS.freeVector.x );
dy = TT_MulFix14( args[0], exc->GS.freeVector.y );
- while ( exc->GS.loop > 0 )
+ while ( loop-- )
{
- exc->args--;
-
- point = (FT_UShort)exc->stack[exc->args];
+ point = (FT_UShort)*(--args);
if ( BOUNDS( point, exc->zp2.n_points ) )
{
@@ -5400,8 +5195,7 @@
}
else
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility )
+ if ( exc->backward_compatibility )
{
/* Special case: allow SHPIX to move points in the twilight zone. */
/* Otherwise, treat SHPIX the same as DELTAP. Unbreaks various */
@@ -5409,7 +5203,7 @@
/* that would glitch severely after calling ALIGNRP after a */
/* blocked SHPIX. */
if ( in_twilight ||
- ( !( exc->iupx_called && exc->iupy_called ) &&
+ ( exc->backward_compatibility != 0x7 &&
( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ) ) )
Move_Zp2_Point( exc, point, 0, dy, TRUE );
@@ -5417,13 +5211,10 @@
else
#endif
Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
- exc->GS.loop--;
}
Fail:
exc->GS.loop = 1;
- exc->new_top = exc->args;
}
@@ -5502,7 +5293,7 @@
if ( ( exc->opcode & 1 ) != 0 )
{
cur_dist = FAST_PROJECT( &exc->zp0.cur[point] );
- distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist );
+ distance = SUB_LONG( exc->func_round( exc, cur_dist, 0 ), cur_dist );
}
else
distance = 0;
@@ -5566,7 +5357,7 @@
if ( exc->GS.gep0 == 0 ) /* If in twilight zone */
{
exc->zp0.org[point].x = TT_MulFix14( distance,
- exc->GS.freeVector.x );
+ exc->GS.freeVector.x );
exc->zp0.org[point].y = TT_MulFix14( distance,
exc->GS.freeVector.y );
exc->zp0.cur[point] = exc->zp0.org[point];
@@ -5587,7 +5378,7 @@
if ( delta > control_value_cutin )
distance = org_dist;
- distance = exc->func_round( exc, distance, 3 );
+ distance = exc->func_round( exc, distance, 0 );
}
exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) );
@@ -5609,7 +5400,7 @@
FT_Long* args )
{
FT_UShort point = 0;
- FT_F26Dot6 org_dist, distance;
+ FT_F26Dot6 org_dist, distance, compensation;
point = (FT_UShort)args[0];
@@ -5664,11 +5455,11 @@
/* single width cut-in test */
/* |org_dist - single_width_value| < single_width_cutin */
- if ( exc->GS.single_width_cutin > 0 &&
- org_dist < exc->GS.single_width_value +
- exc->GS.single_width_cutin &&
- org_dist > exc->GS.single_width_value -
- exc->GS.single_width_cutin )
+ if ( exc->GS.single_width_cutin > 0 &&
+ org_dist < ADD_LONG( exc->GS.single_width_value,
+ exc->GS.single_width_cutin ) &&
+ org_dist > SUB_LONG( exc->GS.single_width_value,
+ exc->GS.single_width_cutin ) )
{
if ( org_dist >= 0 )
org_dist = exc->GS.single_width_value;
@@ -5678,12 +5469,12 @@
/* round flag */
+ compensation = exc->GS.compensation[exc->opcode & 3];
+
if ( ( exc->opcode & 4 ) != 0 )
- {
- distance = exc->func_round( exc, org_dist, exc->opcode & 3 );
- }
+ distance = exc->func_round( exc, org_dist, compensation );
else
- distance = Round_None( exc, org_dist, exc->opcode & 3 );
+ distance = Round_None( exc, org_dist, compensation );
/* minimum distance flag */
@@ -5735,7 +5526,8 @@
FT_F26Dot6 cvt_dist,
distance,
cur_dist,
- org_dist;
+ org_dist,
+ compensation;
FT_F26Dot6 delta;
@@ -5801,6 +5593,8 @@
/* control value cut-in and round */
+ compensation = exc->GS.compensation[exc->opcode & 3];
+
if ( ( exc->opcode & 4 ) != 0 )
{
/* XXX: UNDOCUMENTED! Only perform cut-in test when both points */
@@ -5831,16 +5625,16 @@
cvt_dist = org_dist;
}
- distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 );
+ distance = exc->func_round( exc, cvt_dist, compensation );
}
else
- distance = Round_None( exc, cvt_dist, exc->opcode & 3 );
+ distance = Round_None( exc, cvt_dist, compensation );
/* minimum distance test */
if ( ( exc->opcode & 8 ) != 0 )
{
- FT_F26Dot6 minimum_distance = exc->GS.minimum_distance;
+ FT_F26Dot6 minimum_distance = exc->GS.minimum_distance;
if ( org_dist >= 0 )
@@ -5862,11 +5656,10 @@
Fail:
exc->GS.rp1 = exc->GS.rp0;
+ exc->GS.rp2 = point;
if ( ( exc->opcode & 16 ) != 0 )
exc->GS.rp0 = point;
-
- exc->GS.rp2 = point;
}
@@ -5877,25 +5670,33 @@
* Stack: uint32 uint32... -->
*/
static void
- Ins_ALIGNRP( TT_ExecContext exc )
+ Ins_ALIGNRP( TT_ExecContext exc,
+ FT_Long* args )
{
+ FT_Long loop = exc->GS.loop;
FT_UShort point;
FT_F26Dot6 distance;
- if ( exc->top < exc->GS.loop ||
- BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
+ if ( exc->new_top < loop )
{
if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Invalid_Reference );
+ exc->error = FT_THROW( Too_Few_Arguments );
goto Fail;
}
- while ( exc->GS.loop > 0 )
+ exc->new_top -= loop;
+
+ if ( BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
{
- exc->args--;
+ if ( exc->pedantic_hinting )
+ exc->error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
- point = (FT_UShort)exc->stack[exc->args];
+ while ( loop-- )
+ {
+ point = (FT_UShort)*(--args);
if ( BOUNDS( point, exc->zp1.n_points ) )
{
@@ -5912,13 +5713,10 @@
exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) );
}
-
- exc->GS.loop--;
}
Fail:
exc->GS.loop = 1;
- exc->new_top = exc->args;
}
@@ -6060,15 +5858,26 @@
/* SOMETIMES, DUMBER CODE IS BETTER CODE */
static void
- Ins_IP( TT_ExecContext exc )
+ Ins_IP( TT_ExecContext exc,
+ FT_Long* args )
{
+ FT_Long loop = exc->GS.loop;
FT_F26Dot6 old_range, cur_range;
FT_Vector* orus_base;
FT_Vector* cur_base;
FT_Int twilight;
- if ( exc->top < exc->GS.loop )
+ if ( exc->new_top < loop )
+ {
+ if ( exc->pedantic_hinting )
+ exc->error = FT_THROW( Too_Few_Arguments );
+ goto Fail;
+ }
+
+ exc->new_top -= loop;
+
+ if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
{
if ( exc->pedantic_hinting )
exc->error = FT_THROW( Invalid_Reference );
@@ -6084,13 +5893,6 @@
exc->GS.gep1 == 0 ||
exc->GS.gep2 == 0 );
- if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
- {
- if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Invalid_Reference );
- goto Fail;
- }
-
if ( twilight )
orus_base = &exc->zp0.org[exc->GS.rp1];
else
@@ -6102,8 +5904,7 @@
/* fonts out there (e.g. [aeu]grave in monotype.ttf) */
/* calling IP[] with bad values of rp[12]. */
/* Do something sane when this odd thing happens. */
- if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ||
- BOUNDS( exc->GS.rp2, exc->zp1.n_points ) )
+ if ( BOUNDS( exc->GS.rp2, exc->zp1.n_points ) )
{
old_range = 0;
cur_range = 0;
@@ -6132,9 +5933,9 @@
cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base );
}
- for ( ; exc->GS.loop > 0; exc->GS.loop-- )
+ while ( loop-- )
{
- FT_UInt point = (FT_UInt)exc->stack[--exc->args];
+ FT_UInt point = (FT_UInt)*(--args);
FT_F26Dot6 org_dist, cur_dist, new_dist;
@@ -6206,7 +6007,6 @@
Fail:
exc->GS.loop = 1;
- exc->new_top = exc->args;
}
@@ -6405,17 +6205,10 @@
/* See `ttinterp.h' for details on backward compatibility mode. */
/* Allow IUP until it has been called on both axes. Immediately */
/* return on subsequent ones. */
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility )
- {
- if ( exc->iupx_called && exc->iupy_called )
- return;
-
- if ( exc->opcode & 1 )
- exc->iupx_called = TRUE;
- else
- exc->iupy_called = TRUE;
- }
+ if ( exc->backward_compatibility == 0x7 )
+ return;
+ else if ( exc->backward_compatibility )
+ exc->backward_compatibility |= 1 << ( exc->opcode & 1 );
#endif
/* ignore empty outlines */
@@ -6507,30 +6300,50 @@
Ins_DELTAP( TT_ExecContext exc,
FT_Long* args )
{
- FT_ULong nump, k;
+ FT_Long nump;
FT_UShort A;
- FT_ULong C, P;
- FT_Long B;
+ FT_Long B, P, F;
- P = (FT_ULong)exc->func_cur_ppem( exc );
- nump = (FT_ULong)args[0]; /* some points theoretically may occur more
- than once, thus UShort isn't enough */
+ nump = args[0]; /* signed value for convenience */
- for ( k = 1; k <= nump; k++ )
+ if ( nump < 0 || nump > exc->new_top / 2 )
{
- if ( exc->args < 2 )
- {
- if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Too_Few_Arguments );
- exc->args = 0;
- goto Fail;
- }
+ if ( exc->pedantic_hinting )
+ exc->error = FT_THROW( Too_Few_Arguments );
+
+ nump = exc->new_top / 2;
+ }
+
+ exc->new_top -= 2 * nump;
+
+ P = exc->func_cur_ppem( exc ) - exc->GS.delta_base;
+
+ switch ( exc->opcode )
+ {
+ case 0x5D:
+ break;
+
+ case 0x71:
+ P -= 16;
+ break;
- exc->args -= 2;
+ case 0x72:
+ P -= 32;
+ break;
+ }
- A = (FT_UShort)exc->stack[exc->args + 1];
- B = exc->stack[exc->args];
+ /* check applicable range of adjusted ppem */
+ if ( P & ~0xF ) /* P < 0 || P > 15 */
+ return;
+
+ P <<= 4;
+ F = 1L << ( 6 - exc->GS.delta_shift );
+
+ while ( nump-- )
+ {
+ A = (FT_UShort)*(--args);
+ B = *(--args);
/* XXX: Because some popular fonts contain some invalid DeltaP */
/* instructions, we simply ignore them when the stacked */
@@ -6538,41 +6351,28 @@
/* error. As a delta instruction doesn't change a glyph */
/* in great ways, this shouldn't be a problem. */
- if ( !BOUNDS( A, exc->zp0.n_points ) )
+ if ( BOUNDS( A, exc->zp0.n_points ) )
{
- C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
- switch ( exc->opcode )
+ if ( exc->pedantic_hinting )
{
- case 0x5D:
- break;
-
- case 0x71:
- C += 16;
- break;
-
- case 0x72:
- C += 32;
- break;
+ exc->error = FT_THROW( Invalid_Reference );
+ return;
}
-
- C += exc->GS.delta_base;
-
- if ( P == C )
+ }
+ else
+ {
+ if ( ( B & 0xF0 ) == P )
{
- B = ( (FT_ULong)B & 0xF ) - 8;
+ B = ( B & 0xF ) - 8;
if ( B >= 0 )
B++;
- B *= 1L << ( 6 - exc->GS.delta_shift );
-
+ B *= F;
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
- /* See `ttinterp.h' for details on backward compatibility */
- /* mode. */
- if ( SUBPIXEL_HINTING_MINIMAL &&
- exc->backward_compatibility )
+ /* See `ttinterp.h' for details on backward compatibility mode. */
+ if ( exc->backward_compatibility )
{
- if ( !( exc->iupx_called && exc->iupy_called ) &&
+ if ( exc->backward_compatibility != 0x7 &&
( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) )
exc->func_move( exc, &exc->zp0, A, B );
@@ -6582,13 +6382,7 @@
exc->func_move( exc, &exc->zp0, A, B );
}
}
- else
- if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Invalid_Reference );
}
-
- Fail:
- exc->new_top = exc->args;
}
@@ -6602,28 +6396,50 @@
Ins_DELTAC( TT_ExecContext exc,
FT_Long* args )
{
- FT_ULong nump, k;
- FT_ULong A, C, P;
- FT_Long B;
+ FT_Long nump;
+ FT_ULong A;
+ FT_Long B, P, F;
- P = (FT_ULong)exc->func_cur_ppem( exc );
- nump = (FT_ULong)args[0];
+ nump = args[0]; /* signed value for convenience */
- for ( k = 1; k <= nump; k++ )
+ if ( nump < 0 || nump > exc->new_top / 2 )
{
- if ( exc->args < 2 )
- {
- if ( exc->pedantic_hinting )
- exc->error = FT_THROW( Too_Few_Arguments );
- exc->args = 0;
- goto Fail;
- }
+ if ( exc->pedantic_hinting )
+ exc->error = FT_THROW( Too_Few_Arguments );
+
+ nump = exc->new_top / 2;
+ }
+
+ exc->new_top -= 2 * nump;
+
+ P = exc->func_cur_ppem( exc ) - exc->GS.delta_base;
+
+ switch ( exc->opcode )
+ {
+ case 0x73:
+ break;
- exc->args -= 2;
+ case 0x74:
+ P -= 16;
+ break;
+
+ case 0x75:
+ P -= 32;
+ break;
+ }
+
+ /* check applicable range of adjusted ppem */
+ if ( P & ~0xF ) /* P < 0 || P > 15 */
+ return;
- A = (FT_ULong)exc->stack[exc->args + 1];
- B = exc->stack[exc->args];
+ P <<= 4;
+ F = 1L << ( 6 - exc->GS.delta_shift );
+
+ while ( nump-- )
+ {
+ A = (FT_ULong)*(--args);
+ B = *(--args);
if ( BOUNDSL( A, exc->cvtSize ) )
{
@@ -6635,38 +6451,17 @@
}
else
{
- C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
- switch ( exc->opcode )
- {
- case 0x73:
- break;
-
- case 0x74:
- C += 16;
- break;
-
- case 0x75:
- C += 32;
- break;
- }
-
- C += exc->GS.delta_base;
-
- if ( P == C )
+ if ( ( B & 0xF0 ) == P )
{
- B = ( (FT_ULong)B & 0xF ) - 8;
+ B = ( B & 0xF ) - 8;
if ( B >= 0 )
B++;
- B *= 1L << ( 6 - exc->GS.delta_shift );
+ B *= F;
exc->func_move_cvt( exc, A, B );
}
}
}
-
- Fail:
- exc->new_top = exc->args;
}
@@ -6736,7 +6531,7 @@
/* Otherwise, instructions may behave weirdly and rendering results */
/* may differ between v35 and v40 mode, e.g., in `Times New Roman */
/* Bold Italic'. */
- if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean )
+ if ( SUBPIXEL_HINTING_MINIMAL && exc->mode != FT_RENDER_MODE_MONO )
{
/*********************************
* HINTING FOR SUBPIXEL
@@ -6753,7 +6548,7 @@
* Selector Bit: 8
* Return Bit(s): 15
*/
- if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd_lean )
+ if ( ( args[0] & 256 ) != 0 && exc->mode == FT_RENDER_MODE_LCD_V )
K |= 1 << 15;
/*********************************
@@ -6774,7 +6569,7 @@
* The only smoothing method FreeType supports unless someone sets
* FT_LOAD_TARGET_MONO.
*/
- if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean )
+ if ( ( args[0] & 2048 ) != 0 && exc->mode != FT_RENDER_MODE_MONO )
K |= 1 << 18;
/*********************************
@@ -6786,7 +6581,10 @@
* Grayscale rendering is what FreeType does anyway unless someone
* sets FT_LOAD_TARGET_MONO or FT_LOAD_TARGET_LCD(_V)
*/
- if ( ( args[0] & 4096 ) != 0 && exc->grayscale_cleartype )
+ if ( ( args[0] & 4096 ) != 0 &&
+ exc->mode != FT_RENDER_MODE_MONO &&
+ exc->mode != FT_RENDER_MODE_LCD &&
+ exc->mode != FT_RENDER_MODE_LCD_V )
K |= 1 << 19;
}
#endif
@@ -6833,6 +6631,8 @@
for ( i = 0; i < num_axes; i++ )
args[i] = 0;
}
+
+ exc->new_top += num_axes;
}
@@ -6883,7 +6683,6 @@
Ins_Goto_CodeRange( exc, def->range, def->start );
- exc->step_ins = FALSE;
return;
}
}
@@ -6928,96 +6727,22 @@
TT_RunIns( void* exec )
{
TT_ExecContext exc = (TT_ExecContext)exec;
+ FT_ULong ins_counter = 0;
- FT_ULong ins_counter = 0; /* executed instructions counter */
- FT_ULong num_twilight_points;
- FT_UShort i;
-
-
- /* We restrict the number of twilight points to a reasonable, */
- /* heuristic value to avoid slow execution of malformed bytecode. */
- num_twilight_points = FT_MAX( 30,
- 2 * ( exc->pts.n_points + exc->cvtSize ) );
- if ( exc->twilight.n_points > num_twilight_points )
- {
- if ( num_twilight_points > 0xFFFFU )
- num_twilight_points = 0xFFFFU;
-
- FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" ));
- FT_TRACE5(( " from %d to the more reasonable value %ld\n",
- exc->twilight.n_points,
- num_twilight_points ));
- exc->twilight.n_points = (FT_UShort)num_twilight_points;
- }
-
- /* Set up loop detectors. We restrict the number of LOOPCALL loops */
- /* and the number of JMPR, JROT, and JROF calls with a negative */
- /* argument to values that depend on various parameters like the */
- /* size of the CVT table or the number of points in the current */
- /* glyph (if applicable). */
- /* */
- /* The idea is that in real-world bytecode you either iterate over */
- /* all CVT entries (in the `prep' table), or over all points (or */
- /* contours, in the `glyf' table) of a glyph, and such iterations */
- /* don't happen very often. */
- exc->loopcall_counter = 0;
- exc->neg_jump_counter = 0;
-
- /* The maximum values are heuristic. */
- if ( exc->pts.n_points )
- exc->loopcall_counter_max = FT_MAX( 50,
- 10 * exc->pts.n_points ) +
- FT_MAX( 50,
- exc->cvtSize / 10 );
- else
- exc->loopcall_counter_max = 300 + 22 * exc->cvtSize;
-
- /* as a protection against an unreasonable number of CVT entries */
- /* we assume at most 100 control values per glyph for the counter */
- if ( exc->loopcall_counter_max >
- 100 * (FT_ULong)exc->face->root.num_glyphs )
- exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs;
-
- FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL"
- " to %ld\n", exc->loopcall_counter_max ));
-
- exc->neg_jump_counter_max = exc->loopcall_counter_max;
- FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps"
- " to %ld\n", exc->neg_jump_counter_max ));
-
- /* set PPEM and CVT functions */
- exc->tt_metrics.ratio = 0;
- if ( exc->metrics.x_ppem != exc->metrics.y_ppem )
- {
- /* non-square pixels, use the stretched routines */
- exc->func_cur_ppem = Current_Ppem_Stretched;
- exc->func_read_cvt = Read_CVT_Stretched;
- exc->func_write_cvt = Write_CVT_Stretched;
- exc->func_move_cvt = Move_CVT_Stretched;
- }
- else
- {
- /* square pixels, use normal routines */
- exc->func_cur_ppem = Current_Ppem;
- exc->func_read_cvt = Read_CVT;
- exc->func_write_cvt = Write_CVT;
- exc->func_move_cvt = Move_CVT;
- }
-
- exc->iniRange = exc->curRange;
-
- 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_MINIMAL
- exc->iupx_called = FALSE;
- exc->iupy_called = FALSE;
-#endif
do
{
+ /* 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 )
+ {
+ exc->error = FT_THROW( Execution_Too_Long );
+ goto LErrorLabel_;
+ }
+
+ exc->error = FT_Err_Ok;
exc->opcode = exc->code[exc->IP];
+ exc->length = 1;
#ifdef FT_DEBUG_LEVEL_TRACE
if ( ft_trace_levels[trace_ttinterp] >= 6 )
@@ -7041,17 +6766,6 @@
}
#endif /* FT_DEBUG_LEVEL_TRACE */
- if ( ( exc->length = opcode_length[exc->opcode] ) < 0 )
- {
- if ( exc->IP + 1 >= exc->codeSize )
- goto LErrorCodeOverflow_;
-
- exc->length = 2 - exc->length * exc->code[exc->IP + 1];
- }
-
- if ( exc->IP + exc->length > exc->codeSize )
- goto LErrorCodeOverflow_;
-
/* First, let's check for empty stack and overflow */
exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 );
@@ -7059,6 +6773,9 @@
/* One can also interpret it as the index of the last argument. */
if ( exc->args < 0 )
{
+ FT_UShort i;
+
+
if ( exc->pedantic_hinting )
{
exc->error = FT_THROW( Too_Few_Arguments );
@@ -7071,21 +6788,7 @@
exc->args = 0;
}
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
- if ( exc->opcode == 0x91 )
- {
- /* this is very special: GETVARIATION returns */
- /* a variable number of arguments */
-
- /* it is the job of the application to `activate' GX handling, */
- /* that is, calling any of the GX API functions on the current */
- /* font to select a variation instance */
- if ( exc->face->blend )
- exc->new_top = exc->args + exc->face->blend->num_axis;
- }
- else
-#endif
- exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
+ exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
/* `new_top' is the new top of the stack, after the instruction's */
/* execution. `top' will be set to `new_top' after the `switch' */
@@ -7096,9 +6799,6 @@
goto LErrorLabel_;
}
- exc->step_ins = TRUE;
- exc->error = FT_Err_Ok;
-
{
FT_Long* args = exc->stack + exc->args;
FT_Byte opcode = exc->opcode;
@@ -7281,7 +6981,7 @@
case 0x32: /* SHP */
case 0x33: /* SHP */
- Ins_SHP( exc );
+ Ins_SHP( exc, args );
break;
case 0x34: /* SHC */
@@ -7299,7 +6999,7 @@
break;
case 0x39: /* IP */
- Ins_IP( exc );
+ Ins_IP( exc, args );
break;
case 0x3A: /* MSIRP */
@@ -7308,7 +7008,7 @@
break;
case 0x3C: /* AlignRP */
- Ins_ALIGNRP( exc );
+ Ins_ALIGNRP( exc, args );
break;
case 0x3D: /* RTDG */
@@ -7544,7 +7244,7 @@
break;
case 0x80: /* FLIPPT */
- Ins_FLIPPT( exc );
+ Ins_FLIPPT( exc, args );
break;
case 0x81: /* FLIPRGON */
@@ -7642,13 +7342,13 @@
{
switch ( exc->error )
{
- /* looking for redefined instructions */
case FT_ERR( Invalid_Opcode ):
{
TT_DefRecord* def = exc->IDefs;
TT_DefRecord* limit = FT_OFFSET( def, exc->numIDefs );
+ /* looking for redefined instructions */
for ( ; def < limit; def++ )
{
if ( def->active && exc->opcode == (FT_Byte)def->opc )
@@ -7678,37 +7378,15 @@
}
}
}
-
- exc->error = FT_THROW( Invalid_Opcode );
- goto LErrorLabel_;
-
-#if 0
- break; /* Unreachable code warning suppression. */
- /* Leave to remind in case a later change the editor */
- /* to consider break; */
-#endif
+ FALL_THROUGH;
default:
goto LErrorLabel_;
-
-#if 0
- break;
-#endif
}
}
exc->top = exc->new_top;
-
- if ( exc->step_ins )
- exc->IP += exc->length;
-
- /* 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 )
- {
- exc->error = FT_THROW( Execution_Too_Long );
- goto LErrorLabel_;
- }
+ exc->IP += exc->length;
LSuiteLabel_:
if ( exc->IP >= exc->codeSize )
@@ -7724,15 +7402,12 @@
} while ( !exc->instruction_trap );
LNo_Error_:
- FT_TRACE4(( " %ld instruction%s executed\n",
+ FT_TRACE4(( " %lu instruction%s executed\n",
ins_counter,
ins_counter == 1 ? "" : "s" ));
return FT_Err_Ok;
- LErrorCodeOverflow_:
- exc->error = FT_THROW( Code_Overflow );
-
LErrorLabel_:
if ( exc->error && !exc->instruction_trap )
FT_TRACE1(( " The interpreter returned error 0x%x\n", exc->error ));
@@ -7740,6 +7415,126 @@
return exc->error;
}
+
+ /**************************************************************************
+ *
+ * @Function:
+ * TT_Run_Context
+ *
+ * @Description:
+ * Executes one or more instructions in the execution context.
+ *
+ * @Input:
+ * exec ::
+ * A handle to the target execution context.
+ *
+ * @Return:
+ * TrueType error code. 0 means success.
+ */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Run_Context( TT_ExecContext exec,
+ TT_Size size )
+ {
+ FT_ULong num_twilight_points;
+
+
+ exec->zp0 = exec->pts;
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+
+ /* We restrict the number of twilight points to a reasonable, */
+ /* heuristic value to avoid slow execution of malformed bytecode. */
+ /* The selected value is large enough to support fonts hinted */
+ /* with `ttfautohint`, which uses twilight points to store */
+ /* vertical coordinates of (auto-hinter) segments. */
+ num_twilight_points = FT_MAX( 30,
+ 2 * ( exec->pts.n_points + exec->cvtSize ) );
+ if ( exec->twilight.n_points > num_twilight_points )
+ {
+ if ( num_twilight_points > 0xFFFFU )
+ num_twilight_points = 0xFFFFU;
+
+ FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" ));
+ FT_TRACE5(( " from %d to the more reasonable value %lu\n",
+ exec->twilight.n_points,
+ num_twilight_points ));
+ exec->twilight.n_points = (FT_UShort)num_twilight_points;
+ }
+
+ /* Set up loop detectors. We restrict the number of LOOPCALL loops */
+ /* and the number of JMPR, JROT, and JROF calls with a negative */
+ /* argument to values that depend on various parameters like the */
+ /* size of the CVT table or the number of points in the current */
+ /* glyph (if applicable). */
+ /* */
+ /* The idea is that in real-world bytecode you either iterate over */
+ /* all CVT entries (in the `prep' table), or over all points (or */
+ /* contours, in the `glyf' table) of a glyph, and such iterations */
+ /* don't happen very often. */
+ exec->loopcall_counter = 0;
+ exec->neg_jump_counter = 0;
+
+ /* The maximum values are heuristic. */
+ if ( exec->pts.n_points )
+ exec->loopcall_counter_max = FT_MAX( 50,
+ 10 * exec->pts.n_points ) +
+ FT_MAX( 50,
+ exec->cvtSize / 10 );
+ else
+ exec->loopcall_counter_max = 300 + 22 * exec->cvtSize;
+
+ /* as a protection against an unreasonable number of CVT entries */
+ /* we assume at most 100 control values per glyph for the counter */
+ if ( exec->loopcall_counter_max >
+ 100 * (FT_ULong)exec->face->root.num_glyphs )
+ exec->loopcall_counter_max = 100 * (FT_ULong)exec->face->root.num_glyphs;
+
+ FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL"
+ " to %lu\n", exec->loopcall_counter_max ));
+
+ exec->neg_jump_counter_max = exec->loopcall_counter_max;
+ FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps"
+ " to %lu\n", exec->neg_jump_counter_max ));
+
+ /* set PPEM and CVT functions */
+ if ( exec->metrics.x_ppem != exec->metrics.y_ppem )
+ {
+ /* non-square pixels, use the stretched routines */
+ exec->func_cur_ppem = Current_Ppem_Stretched;
+ exec->func_read_cvt = Read_CVT_Stretched;
+ exec->func_write_cvt = Write_CVT_Stretched;
+ exec->func_move_cvt = Move_CVT_Stretched;
+ }
+ else
+ {
+ /* square pixels, use normal routines */
+ exec->func_cur_ppem = Current_Ppem;
+ exec->func_read_cvt = Read_CVT;
+ exec->func_write_cvt = Write_CVT;
+ exec->func_move_cvt = Move_CVT;
+ }
+
+ /* reset graphics state */
+ exec->GS = size->GS;
+ exec->func_round = (TT_Round_Func)Round_To_Grid;
+ Compute_Funcs( exec );
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+ /* Reset IUP tracking bits in the backward compatibility mode. */
+ /* See `ttinterp.h' for details. */
+ exec->backward_compatibility &= ~0x3;
+#endif
+
+ /* some glyphs leave something on the stack, */
+ /* so we clean it before a new execution. */
+ exec->top = 0;
+ exec->callTop = 0;
+
+ exec->instruction_trap = FALSE;
+
+ return exec->interpreter( exec );
+ }
+
#else /* !TT_USE_BYTECODE_INTERPRETER */
/* ANSI C doesn't like empty source files */
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h
index 4f1a9bbc6794..5cdc8f59f1a2 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h
@@ -4,7 +4,7 @@
*
* TrueType bytecode interpreter (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -39,6 +39,60 @@ FT_BEGIN_HEADER
#define TT_Round_Super_45 7
+ /**************************************************************************
+ *
+ * EXECUTION SUBTABLES
+ *
+ * These sub-tables relate to instruction execution.
+ *
+ */
+
+
+#define TT_MAX_CODE_RANGES 3
+
+
+ /**************************************************************************
+ *
+ * There can only be 3 active code ranges at once:
+ * - the Font Program
+ * - the CVT Program
+ * - a glyph's instructions set
+ */
+ typedef enum TT_CodeRange_Tag_
+ {
+ tt_coderange_none = 0,
+ tt_coderange_font,
+ tt_coderange_cvt,
+ tt_coderange_glyph
+
+ } TT_CodeRange_Tag;
+
+
+ typedef struct TT_CodeRange_
+ {
+ FT_Byte* base;
+ FT_Long size;
+
+ } TT_CodeRange;
+
+ typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+ /**************************************************************************
+ *
+ * Defines a function/instruction definition record.
+ */
+ typedef struct TT_DefRecord_
+ {
+ FT_Int range; /* in which code range is it located? */
+ FT_Long start; /* where does it start? */
+ FT_Long end; /* where does it end? */
+ FT_UInt opc; /* function #, or instruction code */
+ FT_Bool active; /* is it active? */
+
+ } TT_DefRecord, *TT_DefArray;
+
+
/**************************************************************************
*
* Function types used by the interpreter, depending on various modes
@@ -51,7 +105,7 @@ FT_BEGIN_HEADER
typedef FT_F26Dot6
(*TT_Round_Func)( TT_ExecContext exc,
FT_F26Dot6 distance,
- FT_Int color );
+ FT_F26Dot6 compensation );
/* Point displacement along the freedom vector routine */
typedef void
@@ -111,12 +165,13 @@ FT_BEGIN_HEADER
TT_Face face; /* ! */
TT_Size size; /* ! */
FT_Memory memory;
+ TT_Interpreter interpreter;
/* instructions state */
FT_Error error; /* last execution error */
- FT_Long top; /* @ top of exec. stack */
+ FT_Long top; /* @! top of exec. stack */
FT_Long stackSize; /* ! size of exec. stack */
FT_Long* stack; /* ! current exec. stack */
@@ -142,11 +197,9 @@ FT_BEGIN_HEADER
FT_Long IP; /* current instruction pointer */
FT_Long codeSize; /* size of current range */
- FT_Byte opcode; /* current opcode */
- FT_Int length; /* length of current opcode */
+ FT_Byte opcode; /* current opcode */
+ FT_Int length; /* opcode length or increment */
- FT_Bool step_ins; /* true if the interpreter must */
- /* increment IP after ins. exec */
FT_ULong cvtSize; /* ! */
FT_Long* cvt; /* ! */
FT_ULong glyfCvtSize;
@@ -166,9 +219,9 @@ FT_BEGIN_HEADER
FT_UInt maxFunc; /* ! maximum function index */
FT_UInt maxIns; /* ! maximum instruction index */
- FT_Int callTop, /* @ top of call stack during execution */
- callSize; /* size of call stack */
- TT_CallStack callStack; /* call stack */
+ FT_Int callTop, /* @! top of call stack during execution */
+ callSize; /* size of call stack */
+ TT_CallStack callStack; /* call stack */
FT_UShort maxPoints; /* capacity of this context's `pts' */
FT_Short maxContours; /* record, expressed in points and */
@@ -189,16 +242,14 @@ FT_BEGIN_HEADER
FT_Bool instruction_trap; /* ! If `True', the interpreter */
/* exits after each instruction */
- TT_GraphicsState default_GS; /* graphics state resulting from */
- /* the prep program */
FT_Bool is_composite; /* true if the glyph is composite */
FT_Bool pedantic_hinting; /* true if pedantic interpretation */
/* latest interpreter additions */
- FT_Long F_dot_P; /* dot product of freedom and projection */
- /* vectors */
- TT_Round_Func func_round; /* current rounding function */
+ TT_Round_Func func_round; /* current rounding function */
+
+ FT_Vector moveVector; /* "projected" freedom vector */
TT_Project_Func func_project, /* current projection function */
func_dualproj, /* current dual proj. function */
@@ -327,34 +378,13 @@ FT_BEGIN_HEADER
*
*/
- /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been
- * requested. Used to detect interpreter */
- /* version switches. `_lean' to differentiate from the Infinality */
- /* `subpixel_hinting', which is managed differently. */
- FT_Bool subpixel_hinting_lean;
-
- /* Long side of a LCD subpixel is vertical (e.g., screen is rotated). */
- /* `_lean' to differentiate from the Infinality `vertical_lcd', which */
- /* is managed differently. */
- FT_Bool vertical_lcd_lean;
-
- /* Default to backward compatibility mode in v40 interpreter. If */
- /* this is false, it implies the interpreter is in v35 or in native */
- /* ClearType mode. */
- FT_Bool backward_compatibility;
-
- /* Useful for detecting and denying post-IUP trickery that is usually */
- /* used to fix pixel patterns (`superhinting'). */
- FT_Bool iupx_called;
- FT_Bool iupy_called;
-
- /* ClearType hinting and grayscale rendering, as used by Universal */
- /* Windows Platform apps (Windows 8 and above). Like the standard */
- /* colorful ClearType mode, it utilizes a vastly increased virtual */
- /* resolution on the x axis. Different from bi-level hinting and */
- /* grayscale rendering, the old mode from Win9x days that roughly */
- /* adheres to the physical pixel grid on both axes. */
- FT_Bool grayscale_cleartype;
+ /* Activate backward compatibility (bit 2) and track IUP (bits 0-1). */
+ /* If this is zero, it means that the interpreter is either in v35 */
+ /* or in native ClearType mode. */
+ FT_Int backward_compatibility;
+
+ FT_Render_Mode mode; /* target render mode */
+
#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
/* We maintain two counters (in addition to the instruction counter) */
@@ -371,22 +401,15 @@ FT_BEGIN_HEADER
extern const TT_GraphicsState tt_default_graphics_state;
-#ifdef TT_USE_BYTECODE_INTERPRETER
- FT_LOCAL( void )
- TT_Goto_CodeRange( TT_ExecContext exec,
- FT_Int range,
- FT_Long IP );
-
FT_LOCAL( void )
TT_Set_CodeRange( TT_ExecContext exec,
FT_Int range,
- void* base,
+ FT_Byte* base,
FT_Long length );
FT_LOCAL( void )
TT_Clear_CodeRange( TT_ExecContext exec,
FT_Int range );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
/**************************************************************************
@@ -413,22 +436,21 @@ FT_BEGIN_HEADER
TT_New_Context( TT_Driver driver );
-#ifdef TT_USE_BYTECODE_INTERPRETER
FT_LOCAL( void )
TT_Done_Context( TT_ExecContext exec );
- FT_LOCAL( FT_Error )
+ FT_LOCAL( void )
TT_Load_Context( TT_ExecContext exec,
TT_Face face,
TT_Size size );
FT_LOCAL( void )
TT_Save_Context( TT_ExecContext exec,
- TT_Size ins );
+ TT_Size size );
FT_LOCAL( FT_Error )
- TT_Run_Context( TT_ExecContext exec );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
+ TT_Run_Context( TT_ExecContext exec,
+ TT_Size size );
/**************************************************************************
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c
index d0ac31812045..2aedbd842c1c 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c
@@ -4,7 +4,7 @@
*
* Objects manager (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -67,23 +67,13 @@
* A pointer to the target glyph zone.
*/
FT_LOCAL_DEF( void )
- tt_glyphzone_done( TT_GlyphZone zone )
+ tt_glyphzone_done( FT_Memory memory,
+ TT_GlyphZone zone )
{
- FT_Memory memory = zone->memory;
+ FT_FREE( zone->org );
-
- if ( memory )
- {
- FT_FREE( zone->contours );
- FT_FREE( zone->tags );
- FT_FREE( zone->cur );
- FT_FREE( zone->org );
- FT_FREE( zone->orus );
-
- zone->max_points = zone->n_points = 0;
- zone->max_contours = zone->n_contours = 0;
- zone->memory = NULL;
- }
+ zone->n_points = 0;
+ zone->n_contours = 0;
}
@@ -119,23 +109,22 @@
TT_GlyphZone zone )
{
FT_Error error;
+ FT_Long size = 3 * maxPoints * sizeof ( FT_Vector ) +
+ maxContours * sizeof ( FT_UShort ) +
+ maxPoints * sizeof ( FT_Byte );
- FT_ZERO( zone );
- zone->memory = memory;
-
- if ( FT_NEW_ARRAY( zone->org, maxPoints ) ||
- FT_NEW_ARRAY( zone->cur, maxPoints ) ||
- FT_NEW_ARRAY( zone->orus, maxPoints ) ||
- FT_NEW_ARRAY( zone->tags, maxPoints ) ||
- FT_NEW_ARRAY( zone->contours, maxContours ) )
+ if ( !FT_ALLOC( zone->org, size ) )
{
- tt_glyphzone_done( zone );
- }
- else
- {
- zone->max_points = maxPoints;
- zone->max_contours = maxContours;
+ zone->n_points = maxPoints;
+ zone->n_contours = maxContours;
+
+ zone->cur = zone->org + maxPoints;
+ zone->orus = zone->cur + maxPoints;
+ zone->contours = (FT_UShort*)( zone->orus + maxPoints );
+ zone->tags = (FT_Byte*)( zone->contours + maxContours );
+
+ zone->first_point = 0;
}
return error;
@@ -488,8 +477,7 @@
int j, k;
- FT_MEM_SET( num_matched_ids, 0,
- sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+ FT_ARRAY_ZERO( num_matched_ids, TRICK_SFNT_IDS_NUM_FACES );
has_cvt = FALSE;
has_fpgm = FALSE;
has_prep = FALSE;
@@ -787,7 +775,7 @@
FT_UInt instance_index = (FT_UInt)face_index >> 16;
- if ( FT_HAS_MULTIPLE_MASTERS( ttface ) )
+ if ( instance_index && FT_HAS_MULTIPLE_MASTERS( ttface ) )
{
error = FT_Set_Named_Instance( ttface, instance_index );
if ( error )
@@ -885,59 +873,18 @@
* size ::
* A handle to the size object.
*
- * pedantic ::
- * Set if bytecode execution should be pedantic.
- *
* @Return:
* FreeType error code. 0 means success.
*/
FT_LOCAL_DEF( FT_Error )
- tt_size_run_fpgm( TT_Size size,
- FT_Bool pedantic )
+ tt_size_run_fpgm( TT_Size size )
{
TT_Face face = (TT_Face)size->root.face;
- TT_ExecContext exec;
+ TT_ExecContext exec = size->context;
FT_Error error;
- exec = size->context;
-
- error = TT_Load_Context( exec, face, size );
- if ( error )
- return error;
-
- exec->callTop = 0;
- exec->top = 0;
-
- exec->period = 64;
- exec->phase = 0;
- exec->threshold = 0;
-
- exec->instruction_trap = FALSE;
- exec->F_dot_P = 0x4000L;
-
- exec->pedantic_hinting = pedantic;
-
- {
- FT_Size_Metrics* size_metrics = &exec->metrics;
- TT_Size_Metrics* tt_metrics = &exec->tt_metrics;
-
-
- size_metrics->x_ppem = 0;
- size_metrics->y_ppem = 0;
- size_metrics->x_scale = 0;
- size_metrics->y_scale = 0;
-
- tt_metrics->ppem = 0;
- tt_metrics->scale = 0;
- tt_metrics->ratio = 0x10000L;
- }
-
- /* allow font program execution */
- TT_Set_CodeRange( exec,
- tt_coderange_font,
- face->font_program,
- (FT_Long)face->font_program_size );
+ TT_Load_Context( exec, face, size );
/* disable CVT and glyph programs coderange */
TT_Clear_CodeRange( exec, tt_coderange_cvt );
@@ -945,15 +892,19 @@
if ( face->font_program_size > 0 )
{
- TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+ /* allow font program execution */
+ TT_Set_CodeRange( exec,
+ tt_coderange_font,
+ face->font_program,
+ (FT_Long)face->font_program_size );
+
+ exec->pts.n_points = 0;
+ exec->pts.n_contours = 0;
FT_TRACE4(( "Executing `fpgm' table.\n" ));
- error = face->interpreter( exec );
-#ifdef FT_DEBUG_LEVEL_TRACE
- if ( error )
- FT_TRACE4(( " interpretation failed with error code 0x%x\n",
- error ));
-#endif
+ error = TT_Run_Context( exec, size );
+ FT_TRACE4(( error ? " failed (error code 0x%x)\n" : "",
+ error ));
}
else
error = FT_Err_Ok;
@@ -979,212 +930,146 @@
* size ::
* A handle to the size object.
*
- * pedantic ::
- * Set if bytecode execution should be pedantic.
- *
* @Return:
* FreeType error code. 0 means success.
*/
FT_LOCAL_DEF( FT_Error )
- tt_size_run_prep( TT_Size size,
- FT_Bool pedantic )
+ tt_size_run_prep( TT_Size size )
{
TT_Face face = (TT_Face)size->root.face;
- TT_ExecContext exec;
+ TT_ExecContext exec = size->context;
FT_Error error;
FT_UInt i;
+ /* set default GS, twilight points, and storage */
+ /* before CV program can modify them. */
+ size->GS = tt_default_graphics_state;
+
+ /* all twilight points are originally zero */
+ FT_ARRAY_ZERO( size->twilight.org, size->twilight.n_points );
+ FT_ARRAY_ZERO( size->twilight.cur, size->twilight.n_points );
+
+ TT_Load_Context( exec, face, size );
+
+ /* clear storage area */
+ FT_ARRAY_ZERO( exec->storage, exec->storeSize );
+
/* Scale the cvt values to the new ppem. */
/* By default, we use the y ppem value for scaling. */
FT_TRACE6(( "CVT values:\n" ));
- for ( i = 0; i < size->cvt_size; i++ )
+ for ( i = 0; i < exec->cvtSize; i++ )
{
/* Unscaled CVT values are already stored in 26.6 format. */
/* Note that this scaling operation is very sensitive to rounding; */
/* the integer division by 64 must be applied to the first argument. */
- size->cvt[i] = FT_MulFix( face->cvt[i] / 64, size->ttmetrics.scale );
- FT_TRACE6(( " %3d: %f (%f)\n",
- i, (double)face->cvt[i] / 64, (double)size->cvt[i] / 64 ));
+ exec->cvt[i] = FT_MulFix( face->cvt[i] / 64, size->ttmetrics.scale );
+ FT_TRACE6(( " %3u: %f (%f)\n",
+ i, (double)face->cvt[i] / 64, (double)exec->cvt[i] / 64 ));
}
FT_TRACE6(( "\n" ));
- exec = size->context;
-
- error = TT_Load_Context( exec, face, size );
- if ( error )
- return error;
-
- exec->callTop = 0;
- exec->top = 0;
-
- exec->instruction_trap = FALSE;
-
- exec->pedantic_hinting = pedantic;
-
- TT_Set_CodeRange( exec,
- tt_coderange_cvt,
- face->cvt_program,
- (FT_Long)face->cvt_program_size );
-
TT_Clear_CodeRange( exec, tt_coderange_glyph );
if ( face->cvt_program_size > 0 )
{
- TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+ /* allow CV program execution */
+ TT_Set_CodeRange( exec,
+ tt_coderange_cvt,
+ face->cvt_program,
+ (FT_Long)face->cvt_program_size );
+
+ exec->pts.n_points = 0;
+ exec->pts.n_contours = 0;
FT_TRACE4(( "Executing `prep' table.\n" ));
- error = face->interpreter( exec );
-#ifdef FT_DEBUG_LEVEL_TRACE
- if ( error )
- FT_TRACE4(( " interpretation failed with error code 0x%x\n",
- error ));
-#endif
+ error = TT_Run_Context( exec, size );
+ FT_TRACE4(( error ? " failed (error code 0x%x)\n" : "",
+ error ));
}
else
error = FT_Err_Ok;
size->cvt_ready = error;
- /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */
- /* graphics state variables to be modified by the CVT program. */
-
- exec->GS.dualVector.x = 0x4000;
- exec->GS.dualVector.y = 0;
- exec->GS.projVector.x = 0x4000;
- exec->GS.projVector.y = 0x0;
- exec->GS.freeVector.x = 0x4000;
- exec->GS.freeVector.y = 0x0;
-
- exec->GS.rp0 = 0;
- exec->GS.rp1 = 0;
- exec->GS.rp2 = 0;
-
- exec->GS.gep0 = 1;
- exec->GS.gep1 = 1;
- exec->GS.gep2 = 1;
-
- exec->GS.loop = 1;
-
- /* save as default graphics state */
- size->GS = exec->GS;
-
- TT_Save_Context( exec, size );
+ if ( !error )
+ TT_Save_Context( exec, size );
return error;
}
static void
- tt_size_done_bytecode( FT_Size ftsize )
+ tt_size_done_bytecode( TT_Size size )
{
- TT_Size size = (TT_Size)ftsize;
- TT_Face face = (TT_Face)ftsize->face;
- FT_Memory memory = face->root.memory;
+ FT_Memory memory = size->root.face->memory;
+ TT_ExecContext exec = size->context;
- if ( size->context )
+
+ if ( exec )
{
- TT_Done_Context( size->context );
+ FT_FREE( exec->stack );
+ FT_FREE( exec->FDefs );
+
+ TT_Done_Context( exec );
size->context = NULL;
}
- FT_FREE( size->cvt );
- size->cvt_size = 0;
-
- /* free storage area */
- FT_FREE( size->storage );
- size->storage_size = 0;
-
/* twilight zone */
- tt_glyphzone_done( &size->twilight );
-
- FT_FREE( size->function_defs );
- FT_FREE( size->instruction_defs );
-
- size->num_function_defs = 0;
- size->max_function_defs = 0;
- size->num_instruction_defs = 0;
- size->max_instruction_defs = 0;
-
- size->max_func = 0;
- size->max_ins = 0;
-
- size->bytecode_ready = -1;
- size->cvt_ready = -1;
+ tt_glyphzone_done( memory, &size->twilight );
}
/* Initialize bytecode-related fields in the size object. */
/* We do this only if bytecode interpretation is really needed. */
- static FT_Error
- tt_size_init_bytecode( FT_Size ftsize,
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_init_bytecode( TT_Size size,
FT_Bool pedantic )
{
FT_Error error;
- TT_Size size = (TT_Size)ftsize;
- TT_Face face = (TT_Face)ftsize->face;
- FT_Memory memory = face->root.memory;
+ TT_Face face = (TT_Face)size->root.face;
+ FT_Memory memory = size->root.face->memory;
FT_UShort n_twilight;
TT_MaxProfile* maxp = &face->max_profile;
+ TT_ExecContext exec;
- /* clean up bytecode related data */
- FT_FREE( size->function_defs );
- FT_FREE( size->instruction_defs );
- FT_FREE( size->cvt );
- FT_FREE( size->storage );
+ exec = TT_New_Context( (TT_Driver)face->root.driver );
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
- if ( size->context )
- TT_Done_Context( size->context );
- tt_glyphzone_done( &size->twilight );
+ size->context = exec;
- size->bytecode_ready = -1;
- size->cvt_ready = -1;
+ exec->pedantic_hinting = pedantic;
- size->context = TT_New_Context( (TT_Driver)face->root.driver );
+ exec->maxFDefs = maxp->maxFunctionDefs;
+ exec->maxIDefs = maxp->maxInstructionDefs;
- size->max_function_defs = maxp->maxFunctionDefs;
- size->max_instruction_defs = maxp->maxInstructionDefs;
+ if ( FT_NEW_ARRAY( exec->FDefs, exec->maxFDefs + exec->maxIDefs ) )
+ goto Fail;
- size->num_function_defs = 0;
- size->num_instruction_defs = 0;
+ exec->IDefs = exec->FDefs + exec->maxFDefs;
- size->max_func = 0;
- size->max_ins = 0;
+ exec->numFDefs = 0;
+ exec->numIDefs = 0;
- size->cvt_size = face->cvt_size;
- size->storage_size = maxp->maxStorage;
+ exec->maxFunc = 0;
+ exec->maxIns = 0;
- /* Set default metrics */
- {
- TT_Size_Metrics* tt_metrics = &size->ttmetrics;
-
-
- tt_metrics->rotated = FALSE;
- tt_metrics->stretched = FALSE;
-
- /* Set default engine compensation. Value 3 is not described */
- /* in the OpenType specification (as of Mai 2019), but Greg */
- /* says that MS handles it the same as `gray'. */
- /* */
- /* The Apple specification says that the compensation for */
- /* `gray' is always zero. FreeType doesn't do any */
- /* compensation at all. */
- tt_metrics->compensations[0] = 0; /* gray */
- tt_metrics->compensations[1] = 0; /* black */
- tt_metrics->compensations[2] = 0; /* white */
- tt_metrics->compensations[3] = 0; /* zero */
- }
+ /* XXX: We reserve a little more elements on the stack to deal */
+ /* with broken fonts like arialbs, courbs, timesbs, etc. */
+ exec->stackSize = maxp->maxStackElements + 32;
+ exec->storeSize = maxp->maxStorage;
+ exec->cvtSize = face->cvt_size;
- /* allocate function defs, instruction defs, cvt, and storage area */
- if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) ||
- FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
- FT_NEW_ARRAY( size->cvt, size->cvt_size ) ||
- FT_NEW_ARRAY( size->storage, size->storage_size ) )
- goto Exit;
+ if ( FT_NEW_ARRAY( exec->stack,
+ exec->stackSize +
+ (FT_Long)( exec->storeSize + exec->cvtSize ) ) )
+ goto Fail;
- /* reserve twilight zone */
+ /* reserve twilight zone and set GS before fpgm is executed, */
+ /* just in case, even though fpgm should not touch them */
n_twilight = maxp->maxTwilightPoints;
/* there are 4 phantom points (do we need this?) */
@@ -1192,22 +1077,13 @@
error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
if ( error )
- goto Exit;
-
- size->twilight.n_points = n_twilight;
-
- size->GS = tt_default_graphics_state;
-
- /* set `face->interpreter' according to the debug hook present */
- {
- FT_Library library = face->root.driver->root.library;
+ goto Fail;
+ size->GS = tt_default_graphics_state;
+ size->cvt_ready = -1;
- face->interpreter = (TT_Interpreter)
- library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
- if ( !face->interpreter )
- face->interpreter = (TT_Interpreter)TT_RunIns;
- }
+ size->ttmetrics.rotated = FALSE;
+ size->ttmetrics.stretched = FALSE;
/* Fine, now run the font program! */
@@ -1217,59 +1093,11 @@
/* to be executed just once; calling it again is completely useless */
/* and might even lead to extremely slow behaviour if it is malformed */
/* (containing an infinite loop, for example). */
- error = tt_size_run_fpgm( size, pedantic );
+ error = tt_size_run_fpgm( size );
return error;
- Exit:
- if ( error )
- tt_size_done_bytecode( ftsize );
-
- return error;
- }
-
-
- FT_LOCAL_DEF( FT_Error )
- tt_size_ready_bytecode( TT_Size size,
- FT_Bool pedantic )
- {
- FT_Error error = FT_Err_Ok;
-
-
- if ( size->bytecode_ready < 0 )
- error = tt_size_init_bytecode( (FT_Size)size, pedantic );
- else
- error = size->bytecode_ready;
-
- if ( error )
- goto Exit;
-
- /* rescale CVT when needed */
- if ( size->cvt_ready < 0 )
- {
- FT_UShort i;
-
-
- /* all twilight points are originally zero */
- for ( i = 0; i < size->twilight.n_points; i++ )
- {
- size->twilight.org[i].x = 0;
- size->twilight.org[i].y = 0;
- size->twilight.cur[i].x = 0;
- size->twilight.cur[i].y = 0;
- }
-
- /* clear storage area */
- for ( i = 0; i < size->storage_size; i++ )
- size->storage[i] = 0;
-
- size->GS = tt_default_graphics_state;
-
- error = tt_size_run_prep( size, pedantic );
- }
- else
- error = size->cvt_ready;
-
- Exit:
+ Fail:
+ tt_size_done_bytecode( size );
return error;
}
@@ -1300,11 +1128,9 @@
#ifdef TT_USE_BYTECODE_INTERPRETER
size->bytecode_ready = -1;
- size->cvt_ready = -1;
#endif
- size->ttmetrics.valid = FALSE;
- size->strike_index = 0xFFFFFFFFUL;
+ size->strike_index = 0xFFFFFFFFUL;
return error;
}
@@ -1325,14 +1151,11 @@
FT_LOCAL_DEF( void )
tt_size_done( FT_Size ttsize ) /* TT_Size */
{
- TT_Size size = (TT_Size)ttsize;
-
-
#ifdef TT_USE_BYTECODE_INTERPRETER
- tt_size_done_bytecode( ttsize );
+ tt_size_done_bytecode( (TT_Size)ttsize );
+#else
+ FT_UNUSED( ttsize );
#endif
-
- size->ttmetrics.valid = FALSE;
}
@@ -1353,21 +1176,13 @@
* function must take `FT_Size` as a result. The passed `FT_Size` is
* expected to point to a `TT_Size`.
*/
- FT_LOCAL_DEF( FT_Error )
+ FT_LOCAL_DEF( void )
tt_size_reset_height( FT_Size ft_size )
{
TT_Size size = (TT_Size)ft_size;
- TT_Face face = (TT_Face)size->root.face;
+ TT_Face face = (TT_Face)ft_size->face;
FT_Size_Metrics* size_metrics = &size->hinted_metrics;
- size->ttmetrics.valid = FALSE;
-
- /* copy the result from base layer */
- *size_metrics = size->root.metrics;
-
- if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 )
- return FT_THROW( Invalid_PPem );
-
/* This bit flag, if set, indicates that the ppems must be */
/* rounded to integers. Nearly all TrueType fonts have this bit */
/* set, as hinting won't work really well otherwise. */
@@ -1385,10 +1200,6 @@
FT_MulFix( face->root.height,
size_metrics->y_scale ) );
}
-
- size->ttmetrics.valid = TRUE;
-
- return FT_Err_Ok;
}
@@ -1408,14 +1219,20 @@
FT_LOCAL_DEF( FT_Error )
tt_size_reset( TT_Size size )
{
- FT_Error error;
TT_Face face = (TT_Face)size->root.face;
FT_Size_Metrics* size_metrics = &size->hinted_metrics;
- error = tt_size_reset_height( (FT_Size)size );
- if ( error )
- return error;
+ /* invalidate the size object first */
+ size->ttmetrics.ppem = 0;
+
+ if ( size->root.metrics.x_ppem == 0 || size->root.metrics.y_ppem == 0 )
+ return FT_THROW( Invalid_PPem );
+
+ /* copy the result from base layer */
+ *size_metrics = size->root.metrics;
+
+ tt_size_reset_height( (FT_Size)size );
if ( face->header.Flags & 8 )
{
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h
index 9c36ca783620..28d6c7d855f8 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h
@@ -4,7 +4,7 @@
*
* Objects manager (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -53,6 +53,8 @@ FT_BEGIN_HEADER
typedef FT_GlyphSlot TT_GlyphSlot;
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
/**************************************************************************
*
* @Struct:
@@ -67,21 +69,27 @@ FT_BEGIN_HEADER
FT_UShort rp1;
FT_UShort rp2;
+ FT_UShort gep0;
+ FT_UShort gep1;
+ FT_UShort gep2;
+
FT_UnitVector dualVector;
FT_UnitVector projVector;
FT_UnitVector freeVector;
FT_Long loop;
- FT_F26Dot6 minimum_distance;
FT_Int round_state;
+ FT_F26Dot6 compensation[4]; /* device-specific compensations */
- FT_Bool auto_flip;
+ /* default values below can be modified by 'fpgm' and 'prep' */
+ FT_F26Dot6 minimum_distance;
FT_F26Dot6 control_value_cutin;
FT_F26Dot6 single_width_cutin;
FT_F26Dot6 single_width_value;
FT_UShort delta_base;
FT_UShort delta_shift;
+ FT_Bool auto_flip;
FT_Byte instruct_control;
/* According to Greg Hitchcock from Microsoft, the `scan_control' */
/* variable as documented in the TrueType specification is a 32-bit */
@@ -90,17 +98,12 @@ FT_BEGIN_HEADER
FT_Bool scan_control;
FT_Int scan_type;
- FT_UShort gep0;
- FT_UShort gep1;
- FT_UShort gep2;
-
} TT_GraphicsState;
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
FT_LOCAL( void )
- tt_glyphzone_done( TT_GlyphZone zone );
+ tt_glyphzone_done( FT_Memory memory,
+ TT_GlyphZone zone );
FT_LOCAL( FT_Error )
tt_glyphzone_new( FT_Memory memory,
@@ -112,73 +115,6 @@ FT_BEGIN_HEADER
- /**************************************************************************
- *
- * EXECUTION SUBTABLES
- *
- * These sub-tables relate to instruction execution.
- *
- */
-
-
-#define TT_MAX_CODE_RANGES 3
-
-
- /**************************************************************************
- *
- * There can only be 3 active code ranges at once:
- * - the Font Program
- * - the CVT Program
- * - a glyph's instructions set
- */
- typedef enum TT_CodeRange_Tag_
- {
- tt_coderange_none = 0,
- tt_coderange_font,
- tt_coderange_cvt,
- tt_coderange_glyph
-
- } TT_CodeRange_Tag;
-
-
- typedef struct TT_CodeRange_
- {
- FT_Byte* base;
- FT_Long size;
-
- } TT_CodeRange;
-
- typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES];
-
-
- /**************************************************************************
- *
- * Defines a function/instruction definition record.
- */
- typedef struct TT_DefRecord_
- {
- FT_Int range; /* in which code range is it located? */
- FT_Long start; /* where does it start? */
- FT_Long end; /* where does it end? */
- FT_UInt opc; /* function #, or instruction code */
- FT_Bool active; /* is it active? */
-
- } TT_DefRecord, *TT_DefArray;
-
-
- /**************************************************************************
- *
- * Subglyph transformation record.
- */
- typedef struct TT_Transform_
- {
- FT_Fixed xx, xy; /* transformation matrix coefficients */
- FT_Fixed yx, yy;
- FT_F26Dot6 ox, oy; /* offsets */
-
- } TT_Transform;
-
-
/**************************************************************************
*
* A note regarding non-squared pixels:
@@ -251,13 +187,9 @@ FT_BEGIN_HEADER
FT_Long x_ratio;
FT_Long y_ratio;
- FT_UShort ppem; /* maximum ppem size */
FT_Long ratio; /* current ratio */
FT_Fixed scale;
-
- FT_F26Dot6 compensations[4]; /* device-specific compensations */
-
- FT_Bool valid;
+ FT_UShort ppem; /* maximum ppem size */
FT_Bool rotated; /* `is the glyph rotated?'-flag */
FT_Bool stretched; /* `is the glyph stretched?'-flag */
@@ -288,27 +220,8 @@ FT_BEGIN_HEADER
FT_Long point_size; /* for the `MPS' bytecode instruction */
- FT_UInt num_function_defs; /* number of function definitions */
- FT_UInt max_function_defs;
- TT_DefArray function_defs; /* table of function definitions */
-
- FT_UInt num_instruction_defs; /* number of ins. definitions */
- FT_UInt max_instruction_defs;
- TT_DefArray instruction_defs; /* table of ins. definitions */
-
- FT_UInt max_func;
- FT_UInt max_ins;
-
- TT_CodeRangeTable codeRangeTable;
-
TT_GraphicsState GS;
- FT_ULong cvt_size; /* the scaled control value table */
- FT_Long* cvt;
-
- FT_UShort storage_size; /* The storage area is now part of */
- FT_Long* storage; /* the instance */
-
TT_GlyphZoneRec twilight; /* The instance's twilight zone */
TT_ExecContext context;
@@ -375,20 +288,18 @@ FT_BEGIN_HEADER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_LOCAL( FT_Error )
- tt_size_run_fpgm( TT_Size size,
- FT_Bool pedantic );
+ tt_size_run_fpgm( TT_Size size );
FT_LOCAL( FT_Error )
- tt_size_run_prep( TT_Size size,
- FT_Bool pedantic );
+ tt_size_run_prep( TT_Size size );
FT_LOCAL( FT_Error )
- tt_size_ready_bytecode( TT_Size size,
- FT_Bool pedantic );
+ tt_size_init_bytecode( TT_Size size,
+ FT_Bool pedantic );
#endif /* TT_USE_BYTECODE_INTERPRETER */
- FT_LOCAL( FT_Error )
+ FT_LOCAL( void )
tt_size_reset_height( FT_Size size );
FT_LOCAL( FT_Error )
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c
index 9505b5f179f2..827454d85744 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c
@@ -4,7 +4,7 @@
*
* TrueType-specific tables loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -110,7 +110,7 @@
if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
{
- FT_TRACE2(( "glyph count mismatch! loca: %ld, maxp: %ld\n",
+ FT_TRACE2(( "glyph count mismatch! loca: %lu, maxp: %ld\n",
face->num_locations - 1, face->root.num_glyphs ));
/* we only handle the case where `maxp' gives a larger value */
@@ -151,7 +151,7 @@
face->num_locations = (FT_ULong)face->root.num_glyphs + 1;
table_len = new_loca_len;
- FT_TRACE2(( "adjusting num_locations to %ld\n",
+ FT_TRACE2(( "adjusting num_locations to %lu\n",
face->num_locations ));
}
else
@@ -225,7 +225,7 @@
if ( pos1 > ttface->glyf_len )
{
FT_TRACE1(( "tt_face_get_location:"
- " too large offset (0x%08lx) found for glyph index %d,\n",
+ " too large offset (0x%08lx) found for glyph index %u,\n",
pos1, gindex ));
FT_TRACE1(( " "
" exceeding the end of `glyf' table (0x%08lx)\n",
@@ -240,17 +240,17 @@
if ( gindex == ttface->num_locations - 2 )
{
FT_TRACE1(( "tt_face_get_location:"
- " too large size (%ld bytes) found for glyph index %d,\n",
+ " too large size (%lu bytes) found for glyph index %u,\n",
pos2 - pos1, gindex ));
FT_TRACE1(( " "
- " truncating at the end of `glyf' table to %ld bytes\n",
+ " truncating at the end of `glyf' table to %lu bytes\n",
ttface->glyf_len - pos1 ));
pos2 = ttface->glyf_len;
}
else
{
FT_TRACE1(( "tt_face_get_location:"
- " too large offset (0x%08lx) found for glyph index %d,\n",
+ " too large offset (0x%08lx) found for glyph index %u,\n",
pos2, gindex + 1 ));
FT_TRACE1(( " "
" exceeding the end of `glyf' table (0x%08lx)\n",
@@ -419,7 +419,7 @@
if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
goto Exit;
- FT_TRACE2(( "loaded, %12ld bytes\n", face->font_program_size ));
+ FT_TRACE2(( "loaded, %12lu bytes\n", face->font_program_size ));
}
Exit:
@@ -482,7 +482,7 @@
if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
goto Exit;
- FT_TRACE2(( "loaded, %12ld bytes\n", face->cvt_program_size ));
+ FT_TRACE2(( "loaded, %12lu bytes\n", face->cvt_program_size ));
}
Exit:
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h
index bc32b58020c3..bb4d3c9cc557 100644
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h
+++ b/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h
@@ -4,7 +4,7 @@
*
* TrueType-specific tables loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c b/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c
deleted file mode 100644
index d811beef0df2..000000000000
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c
+++ /dev/null
@@ -1,1013 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.c
- *
- * TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "ttsubpix.h"
-
-
-#if defined( TT_USE_BYTECODE_INTERPRETER ) && \
- defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY )
-
- /**************************************************************************
- *
- * These rules affect how the TT Interpreter does hinting, with the
- * goal of doing subpixel hinting by (in general) ignoring x moves.
- * Some of these rules are fixes that go above and beyond the
- * stated techniques in the MS whitepaper on Cleartype, due to
- * artifacts in many glyphs. So, these rules make some glyphs render
- * better than they do in the MS rasterizer.
- *
- * "" string or 0 int/char indicates to apply to all glyphs.
- * "-" used as dummy placeholders, but any non-matching string works.
- *
- * Some of this could arguably be implemented in fontconfig, however:
- *
- * - Fontconfig can't set things on a glyph-by-glyph basis.
- * - The tweaks that happen here are very low-level, from an average
- * user's point of view and are best implemented in the hinter.
- *
- * The goal is to make the subpixel hinting techniques as generalized
- * as possible across all fonts to prevent the need for extra rules such
- * as these.
- *
- * The rule structure is designed so that entirely new rules can easily
- * be added when a new compatibility feature is discovered.
- *
- * The rule structures could also use some enhancement to handle ranges.
- *
- * ****************** WORK IN PROGRESS *******************
- */
-
- /* These are `classes' of fonts that can be grouped together and used in */
- /* rules below. A blank entry "" is required at the end of these! */
-#define FAMILY_CLASS_RULES_SIZE 7
-
- static const SPH_Font_Class FAMILY_CLASS_Rules
- [FAMILY_CLASS_RULES_SIZE] =
- {
- { "MS Legacy Fonts",
- { "Aharoni",
- "Andale Mono",
- "Andalus",
- "Angsana New",
- "AngsanaUPC",
- "Arabic Transparent",
- "Arial Black",
- "Arial Narrow",
- "Arial Unicode MS",
- "Arial",
- "Batang",
- "Browallia New",
- "BrowalliaUPC",
- "Comic Sans MS",
- "Cordia New",
- "CordiaUPC",
- "Courier New",
- "DFKai-SB",
- "David Transparent",
- "David",
- "DilleniaUPC",
- "Estrangelo Edessa",
- "EucrosiaUPC",
- "FangSong_GB2312",
- "Fixed Miriam Transparent",
- "FrankRuehl",
- "Franklin Gothic Medium",
- "FreesiaUPC",
- "Garamond",
- "Gautami",
- "Georgia",
- "Gulim",
- "Impact",
- "IrisUPC",
- "JasmineUPC",
- "KaiTi_GB2312",
- "KodchiangUPC",
- "Latha",
- "Levenim MT",
- "LilyUPC",
- "Lucida Console",
- "Lucida Sans Unicode",
- "MS Gothic",
- "MS Mincho",
- "MV Boli",
- "Mangal",
- "Marlett",
- "Microsoft Sans Serif",
- "Mingliu",
- "Miriam Fixed",
- "Miriam Transparent",
- "Miriam",
- "Narkisim",
- "Palatino Linotype",
- "Raavi",
- "Rod Transparent",
- "Rod",
- "Shruti",
- "SimHei",
- "Simplified Arabic Fixed",
- "Simplified Arabic",
- "Simsun",
- "Sylfaen",
- "Symbol",
- "Tahoma",
- "Times New Roman",
- "Traditional Arabic",
- "Trebuchet MS",
- "Tunga",
- "Verdana",
- "Webdings",
- "Wingdings",
- "",
- },
- },
- { "Core MS Legacy Fonts",
- { "Arial Black",
- "Arial Narrow",
- "Arial Unicode MS",
- "Arial",
- "Comic Sans MS",
- "Courier New",
- "Garamond",
- "Georgia",
- "Impact",
- "Lucida Console",
- "Lucida Sans Unicode",
- "Microsoft Sans Serif",
- "Palatino Linotype",
- "Tahoma",
- "Times New Roman",
- "Trebuchet MS",
- "Verdana",
- "",
- },
- },
- { "Apple Legacy Fonts",
- { "Geneva",
- "Times",
- "Monaco",
- "Century",
- "Chalkboard",
- "Lobster",
- "Century Gothic",
- "Optima",
- "Lucida Grande",
- "Gill Sans",
- "Baskerville",
- "Helvetica",
- "Helvetica Neue",
- "",
- },
- },
- { "Legacy Sans Fonts",
- { "Andale Mono",
- "Arial Unicode MS",
- "Arial",
- "Century Gothic",
- "Comic Sans MS",
- "Franklin Gothic Medium",
- "Geneva",
- "Lucida Console",
- "Lucida Grande",
- "Lucida Sans Unicode",
- "Lucida Sans Typewriter",
- "Microsoft Sans Serif",
- "Monaco",
- "Tahoma",
- "Trebuchet MS",
- "Verdana",
- "",
- },
- },
-
- { "Misc Legacy Fonts",
- { "Dark Courier", "", }, },
- { "Verdana Clones",
- { "DejaVu Sans",
- "Bitstream Vera Sans", "", }, },
- { "Verdana and Clones",
- { "DejaVu Sans",
- "Bitstream Vera Sans",
- "Verdana", "", }, },
- };
-
-
- /* Define this to force natural (i.e. not bitmap-compatible) widths. */
- /* The default leans strongly towards natural widths except for a few */
- /* legacy fonts where a selective combination produces nicer results. */
-/* #define FORCE_NATURAL_WIDTHS */
-
-
- /* Define `classes' of styles that can be grouped together and used in */
- /* rules below. A blank entry "" is required at the end of these! */
-#define STYLE_CLASS_RULES_SIZE 5
-
- static const SPH_Font_Class STYLE_CLASS_Rules
- [STYLE_CLASS_RULES_SIZE] =
- {
- { "Regular Class",
- { "Regular",
- "Book",
- "Medium",
- "Roman",
- "Normal",
- "",
- },
- },
- { "Regular/Italic Class",
- { "Regular",
- "Book",
- "Medium",
- "Italic",
- "Oblique",
- "Roman",
- "Normal",
- "",
- },
- },
- { "Bold/BoldItalic Class",
- { "Bold",
- "Bold Italic",
- "Black",
- "",
- },
- },
- { "Bold/Italic/BoldItalic Class",
- { "Bold",
- "Bold Italic",
- "Black",
- "Italic",
- "Oblique",
- "",
- },
- },
- { "Regular/Bold Class",
- { "Regular",
- "Book",
- "Medium",
- "Normal",
- "Roman",
- "Bold",
- "Black",
- "",
- },
- },
- };
-
-
- /* Force special legacy fixes for fonts. */
-#define COMPATIBILITY_MODE_RULES_SIZE 1
-
- static const SPH_TweakRule COMPATIBILITY_MODE_Rules
- [COMPATIBILITY_MODE_RULES_SIZE] =
- {
- { "Verdana Clones", 0, "", 0 },
- };
-
-
- /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */
-#define PIXEL_HINTING_RULES_SIZE 2
-
- static const SPH_TweakRule PIXEL_HINTING_Rules
- [PIXEL_HINTING_RULES_SIZE] =
- {
- /* these characters are almost always safe */
- { "Courier New", 12, "Italic", 'z' },
- { "Courier New", 11, "Italic", 'z' },
- };
-
-
- /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */
-#define DO_SHPIX_RULES_SIZE 1
-
- static const SPH_TweakRule DO_SHPIX_Rules
- [DO_SHPIX_RULES_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
- /* Skip Y moves that start with a point that is not on a Y pixel */
- /* boundary and don't move that point to a Y pixel boundary. */
-#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4
-
- static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules
- [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
- {
- /* fix vwxyz thinness */
- { "Consolas", 0, "", 0 },
- /* Fix thin middle stems */
- { "Core MS Legacy Fonts", 0, "Regular", 0 },
- /* Cyrillic small letter I */
- { "Legacy Sans Fonts", 0, "", 0 },
- /* Fix artifacts with some Regular & Bold */
- { "Verdana Clones", 0, "", 0 },
- };
-
-
-#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
-
- static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
- [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
- {
- /* Fixes < and > */
- { "Courier New", 0, "Regular", 0 },
- };
-
-
- /* Skip Y moves that start with a point that is not on a Y pixel */
- /* boundary and don't move that point to a Y pixel boundary. */
-#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2
-
- static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
- [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
- {
- /* Maintain thickness of diagonal in 'N' */
- { "Times New Roman", 0, "Regular/Bold Class", 'N' },
- { "Georgia", 0, "Regular/Bold Class", 'N' },
- };
-
-
- /* Skip Y moves that move a point off a Y pixel boundary. */
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1
-
- static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules
- [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
-
- static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
- [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
- /* Round moves that don't move a point to a Y pixel boundary. */
-#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2
-
- static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules
- [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
- {
- /* Droid font instructions don't snap Y to pixels */
- { "Droid Sans", 0, "Regular/Italic Class", 0 },
- { "Droid Sans Mono", 0, "", 0 },
- };
-
-
-#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
-
- static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
- [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
- /* Allow a Direct_Move along X freedom vector if matched. */
-#define ALLOW_X_DMOVE_RULES_SIZE 1
-
- static const SPH_TweakRule ALLOW_X_DMOVE_Rules
- [ALLOW_X_DMOVE_RULES_SIZE] =
- {
- /* Fixes vanishing diagonal in 4 */
- { "Verdana", 0, "Regular", '4' },
- };
-
-
- /* Return MS rasterizer version 35 if matched. */
-#define RASTERIZER_35_RULES_SIZE 8
-
- static const SPH_TweakRule RASTERIZER_35_Rules
- [RASTERIZER_35_RULES_SIZE] =
- {
- /* This seems to be the only way to make these look good */
- { "Times New Roman", 0, "Regular", 'i' },
- { "Times New Roman", 0, "Regular", 'j' },
- { "Times New Roman", 0, "Regular", 'm' },
- { "Times New Roman", 0, "Regular", 'r' },
- { "Times New Roman", 0, "Regular", 'a' },
- { "Times New Roman", 0, "Regular", 'n' },
- { "Times New Roman", 0, "Regular", 'p' },
- { "Times", 0, "", 0 },
- };
-
-
- /* Don't round to the subpixel grid. Round to pixel grid. */
-#define NORMAL_ROUND_RULES_SIZE 1
-
- static const SPH_TweakRule NORMAL_ROUND_Rules
- [NORMAL_ROUND_RULES_SIZE] =
- {
- /* Fix serif thickness for certain ppems */
- /* Can probably be generalized somehow */
- { "Courier New", 0, "", 0 },
- };
-
-
- /* Skip IUP instructions if matched. */
-#define SKIP_IUP_RULES_SIZE 1
-
- static const SPH_TweakRule SKIP_IUP_Rules
- [SKIP_IUP_RULES_SIZE] =
- {
- { "Arial", 13, "Regular", 'a' },
- };
-
-
- /* Skip MIAP Twilight hack if matched. */
-#define MIAP_HACK_RULES_SIZE 1
-
- static const SPH_TweakRule MIAP_HACK_Rules
- [MIAP_HACK_RULES_SIZE] =
- {
- { "Geneva", 12, "", 0 },
- };
-
-
- /* Skip DELTAP instructions if matched. */
-#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23
-
- static const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules
- [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
- {
- { "Georgia", 0, "Regular", 'k' },
- /* fix various problems with e in different versions */
- { "Trebuchet MS", 14, "Regular", 'e' },
- { "Trebuchet MS", 13, "Regular", 'e' },
- { "Trebuchet MS", 15, "Regular", 'e' },
- { "Trebuchet MS", 0, "Italic", 'v' },
- { "Trebuchet MS", 0, "Italic", 'w' },
- { "Trebuchet MS", 0, "Regular", 'Y' },
- { "Arial", 11, "Regular", 's' },
- /* prevent problems with '3' and others */
- { "Verdana", 10, "Regular", 0 },
- { "Verdana", 9, "Regular", 0 },
- /* Cyrillic small letter short I */
- { "Legacy Sans Fonts", 0, "", 0x438 },
- { "Legacy Sans Fonts", 0, "", 0x439 },
- { "Arial", 10, "Regular", '6' },
- { "Arial", 0, "Bold/BoldItalic Class", 'a' },
- /* Make horizontal stems consistent with the rest */
- { "Arial", 24, "Bold", 'a' },
- { "Arial", 25, "Bold", 'a' },
- { "Arial", 24, "Bold", 's' },
- { "Arial", 25, "Bold", 's' },
- { "Arial", 34, "Bold", 's' },
- { "Arial", 35, "Bold", 's' },
- { "Arial", 36, "Bold", 's' },
- { "Arial", 25, "Regular", 's' },
- { "Arial", 26, "Regular", 's' },
- };
-
-
- /* Always do DELTAP instructions if matched. */
-#define ALWAYS_DO_DELTAP_RULES_SIZE 1
-
- static const SPH_TweakRule ALWAYS_DO_DELTAP_Rules
- [ALWAYS_DO_DELTAP_RULES_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
- /* Don't allow ALIGNRP after IUP. */
-#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1
-
- static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules
- [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
- {
- /* Prevent creation of dents in outline */
- { "-", 0, "", 0 },
- };
-
-
- /* Don't allow DELTAP after IUP. */
-#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1
-
- static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules
- [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
- /* Don't allow CALL after IUP. */
-#define NO_CALL_AFTER_IUP_RULES_SIZE 1
-
- static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules
- [NO_CALL_AFTER_IUP_RULES_SIZE] =
- {
- /* Prevent creation of dents in outline */
- { "-", 0, "", 0 },
- };
-
-
- /* De-embolden these glyphs slightly. */
-#define DEEMBOLDEN_RULES_SIZE 9
-
- static const SPH_TweakRule DEEMBOLDEN_Rules
- [DEEMBOLDEN_RULES_SIZE] =
- {
- { "Courier New", 0, "Bold", 'A' },
- { "Courier New", 0, "Bold", 'W' },
- { "Courier New", 0, "Bold", 'w' },
- { "Courier New", 0, "Bold", 'M' },
- { "Courier New", 0, "Bold", 'X' },
- { "Courier New", 0, "Bold", 'K' },
- { "Courier New", 0, "Bold", 'x' },
- { "Courier New", 0, "Bold", 'z' },
- { "Courier New", 0, "Bold", 'v' },
- };
-
-
- /* Embolden these glyphs slightly. */
-#define EMBOLDEN_RULES_SIZE 2
-
- static const SPH_TweakRule EMBOLDEN_Rules
- [EMBOLDEN_RULES_SIZE] =
- {
- { "Courier New", 0, "Regular", 0 },
- { "Courier New", 0, "Italic", 0 },
- };
-
-
- /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */
- /* similar to Windows XP. */
-#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12
-
- static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules
- [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
- {
- { "Times New Roman", 16, "Italic", '2' },
- { "Times New Roman", 16, "Italic", '5' },
- { "Times New Roman", 16, "Italic", '7' },
- { "Times New Roman", 16, "Regular", '2' },
- { "Times New Roman", 16, "Regular", '5' },
- { "Times New Roman", 16, "Regular", '7' },
- { "Times New Roman", 17, "Italic", '2' },
- { "Times New Roman", 17, "Italic", '5' },
- { "Times New Roman", 17, "Italic", '7' },
- { "Times New Roman", 17, "Regular", '2' },
- { "Times New Roman", 17, "Regular", '5' },
- { "Times New Roman", 17, "Regular", '7' },
- };
-
-
- /* This fudges distance on 2 to get rid of the vanishing stem issue. */
- /* A real solution to this is certainly welcome. */
-#define COURIER_NEW_2_HACK_RULES_SIZE 15
-
- static const SPH_TweakRule COURIER_NEW_2_HACK_Rules
- [COURIER_NEW_2_HACK_RULES_SIZE] =
- {
- { "Courier New", 10, "Regular", '2' },
- { "Courier New", 11, "Regular", '2' },
- { "Courier New", 12, "Regular", '2' },
- { "Courier New", 13, "Regular", '2' },
- { "Courier New", 14, "Regular", '2' },
- { "Courier New", 15, "Regular", '2' },
- { "Courier New", 16, "Regular", '2' },
- { "Courier New", 17, "Regular", '2' },
- { "Courier New", 18, "Regular", '2' },
- { "Courier New", 19, "Regular", '2' },
- { "Courier New", 20, "Regular", '2' },
- { "Courier New", 21, "Regular", '2' },
- { "Courier New", 22, "Regular", '2' },
- { "Courier New", 23, "Regular", '2' },
- { "Courier New", 24, "Regular", '2' },
- };
-
-
-#ifndef FORCE_NATURAL_WIDTHS
-
- /* Use compatible widths with these glyphs. Compatible widths is always */
- /* on when doing B/W TrueType instructing, but is used selectively here, */
- /* typically on glyphs with 3 or more vertical stems. */
-#define COMPATIBLE_WIDTHS_RULES_SIZE 38
-
- static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
- [COMPATIBLE_WIDTHS_RULES_SIZE] =
- {
- { "Arial Unicode MS", 12, "Regular Class", 'm' },
- { "Arial Unicode MS", 14, "Regular Class", 'm' },
- /* Cyrillic small letter sha */
- { "Arial", 10, "Regular Class", 0x448 },
- { "Arial", 11, "Regular Class", 'm' },
- { "Arial", 12, "Regular Class", 'm' },
- /* Cyrillic small letter sha */
- { "Arial", 12, "Regular Class", 0x448 },
- { "Arial", 13, "Regular Class", 0x448 },
- { "Arial", 14, "Regular Class", 'm' },
- /* Cyrillic small letter sha */
- { "Arial", 14, "Regular Class", 0x448 },
- { "Arial", 15, "Regular Class", 0x448 },
- { "Arial", 17, "Regular Class", 'm' },
- { "DejaVu Sans", 15, "Regular Class", 0 },
- { "Microsoft Sans Serif", 11, "Regular Class", 0 },
- { "Microsoft Sans Serif", 12, "Regular Class", 0 },
- { "Segoe UI", 11, "Regular Class", 0 },
- { "Monaco", 0, "Regular Class", 0 },
- { "Segoe UI", 12, "Regular Class", 'm' },
- { "Segoe UI", 14, "Regular Class", 'm' },
- { "Tahoma", 11, "Regular Class", 0 },
- { "Times New Roman", 16, "Regular Class", 'c' },
- { "Times New Roman", 16, "Regular Class", 'm' },
- { "Times New Roman", 16, "Regular Class", 'o' },
- { "Times New Roman", 16, "Regular Class", 'w' },
- { "Trebuchet MS", 11, "Regular Class", 0 },
- { "Trebuchet MS", 12, "Regular Class", 0 },
- { "Trebuchet MS", 14, "Regular Class", 0 },
- { "Trebuchet MS", 15, "Regular Class", 0 },
- { "Ubuntu", 12, "Regular Class", 'm' },
- /* Cyrillic small letter sha */
- { "Verdana", 10, "Regular Class", 0x448 },
- { "Verdana", 11, "Regular Class", 0x448 },
- { "Verdana and Clones", 12, "Regular Class", 'i' },
- { "Verdana and Clones", 12, "Regular Class", 'j' },
- { "Verdana and Clones", 12, "Regular Class", 'l' },
- { "Verdana and Clones", 12, "Regular Class", 'm' },
- { "Verdana and Clones", 13, "Regular Class", 'i' },
- { "Verdana and Clones", 13, "Regular Class", 'j' },
- { "Verdana and Clones", 13, "Regular Class", 'l' },
- { "Verdana and Clones", 14, "Regular Class", 'm' },
- };
-
-
- /* Scaling slightly in the x-direction prior to hinting results in */
- /* more visually pleasing glyphs in certain cases. */
- /* This sometimes needs to be coordinated with compatible width rules. */
- /* A value of 1000 corresponds to a scaled value of 1.0. */
-
-#define X_SCALING_RULES_SIZE 50
-
- static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] =
- {
- { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
- { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
- { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
- { "Arial", 11, "Regular Class", 'm', 975 },
- { "Arial", 12, "Regular Class", 'm', 1050 },
- /* Cyrillic small letter el */
- { "Arial", 13, "Regular Class", 0x43B, 950 },
- { "Arial", 13, "Regular Class", 'o', 950 },
- { "Arial", 13, "Regular Class", 'e', 950 },
- { "Arial", 14, "Regular Class", 'm', 950 },
- /* Cyrillic small letter el */
- { "Arial", 15, "Regular Class", 0x43B, 925 },
- { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
- { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
- { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
- { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
- { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
- { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
- { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
- { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
- { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
- { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
- { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
- { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
- { "Georgia", 10, "", 0, 1050 },
- { "Georgia", 11, "", 0, 1100 },
- { "Georgia", 12, "", 0, 1025 },
- { "Georgia", 13, "", 0, 1050 },
- { "Georgia", 16, "", 0, 1050 },
- { "Georgia", 17, "", 0, 1030 },
- { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
- { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
- { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
- { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
- { "Segoe UI", 12, "Regular Class", 'H', 1050 },
- { "Segoe UI", 12, "Regular Class", 'm', 1050 },
- { "Segoe UI", 14, "Regular Class", 'm', 1050 },
- { "Tahoma", 11, "Regular Class", 'i', 975 },
- { "Tahoma", 11, "Regular Class", 'l', 975 },
- { "Tahoma", 11, "Regular Class", 'j', 900 },
- { "Tahoma", 11, "Regular Class", 'm', 918 },
- { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
- { "Verdana", 12, "Regular Class", 'm', 975 },
- { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
- { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
- { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
- { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
- { "Verdana", 16, "Regular Class", 0, 1050 },
- { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
- { "Times New Roman", 16, "Regular Class", 'm', 918 },
- { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
- { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
- };
-
-#else
-
-#define COMPATIBLE_WIDTHS_RULES_SIZE 1
-
- static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
- [COMPATIBLE_WIDTHS_RULES_SIZE] =
- {
- { "-", 0, "", 0 },
- };
-
-
-#define X_SCALING_RULES_SIZE 1
-
- static const SPH_ScaleRule X_SCALING_Rules
- [X_SCALING_RULES_SIZE] =
- {
- { "-", 0, "", 0, 1000 },
- };
-
-#endif /* FORCE_NATURAL_WIDTHS */
-
-
- static FT_Bool
- is_member_of_family_class( const FT_String* detected_font_name,
- const FT_String* rule_font_name )
- {
- FT_UInt i, j;
-
-
- /* Does font name match rule family? */
- if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 )
- return TRUE;
-
- /* Is font name a wildcard ""? */
- if ( ft_strcmp( rule_font_name, "" ) == 0 )
- return TRUE;
-
- /* Is font name contained in a class list? */
- for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
- {
- if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
- {
- for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
- {
- if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
- continue;
- if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j],
- detected_font_name ) == 0 )
- return TRUE;
- }
- }
- }
-
- return FALSE;
- }
-
-
- static FT_Bool
- is_member_of_style_class( const FT_String* detected_font_style,
- const FT_String* rule_font_style )
- {
- FT_UInt i, j;
-
-
- /* Does font style match rule style? */
- if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 )
- return TRUE;
-
- /* Is font style a wildcard ""? */
- if ( ft_strcmp( rule_font_style, "" ) == 0 )
- return TRUE;
-
- /* Is font style contained in a class list? */
- for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
- {
- if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
- {
- for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
- {
- if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
- continue;
- if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j],
- detected_font_style ) == 0 )
- return TRUE;
- }
- }
- }
-
- return FALSE;
- }
-
-
- FT_LOCAL_DEF( FT_Bool )
- sph_test_tweak( TT_Face face,
- const FT_String* family,
- FT_UInt ppem,
- const FT_String* style,
- FT_UInt glyph_index,
- const SPH_TweakRule* rule,
- FT_UInt num_rules )
- {
- FT_UInt i;
-
-
- /* rule checks may be able to be optimized further */
- for ( i = 0; i < num_rules; i++ )
- {
- if ( family &&
- ( is_member_of_family_class ( family, rule[i].family ) ) )
- if ( rule[i].ppem == 0 ||
- rule[i].ppem == ppem )
- if ( style &&
- is_member_of_style_class ( style, rule[i].style ) )
- if ( rule[i].glyph == 0 ||
- FT_Get_Char_Index( (FT_Face)face,
- rule[i].glyph ) == glyph_index )
- return TRUE;
- }
-
- return FALSE;
- }
-
-
- static FT_UInt
- scale_test_tweak( TT_Face face,
- const FT_String* family,
- FT_UInt ppem,
- const FT_String* style,
- FT_UInt glyph_index,
- const SPH_ScaleRule* rule,
- FT_UInt num_rules )
- {
- FT_UInt i;
-
-
- /* rule checks may be able to be optimized further */
- for ( i = 0; i < num_rules; i++ )
- {
- if ( family &&
- ( is_member_of_family_class ( family, rule[i].family ) ) )
- if ( rule[i].ppem == 0 ||
- rule[i].ppem == ppem )
- if ( style &&
- is_member_of_style_class( style, rule[i].style ) )
- if ( rule[i].glyph == 0 ||
- FT_Get_Char_Index( (FT_Face)face,
- rule[i].glyph ) == glyph_index )
- return rule[i].scale;
- }
-
- return 1000;
- }
-
-
- FT_LOCAL_DEF( FT_UInt )
- sph_test_tweak_x_scaling( TT_Face face,
- const FT_String* family,
- FT_UInt ppem,
- const FT_String* style,
- FT_UInt glyph_index )
- {
- return scale_test_tweak( face, family, ppem, style, glyph_index,
- X_SCALING_Rules, X_SCALING_RULES_SIZE );
- }
-
-
-#define TWEAK_RULES( x ) \
- if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
- x##_Rules, x##_RULES_SIZE ) ) \
- loader->exec->sph_tweak_flags |= SPH_TWEAK_##x
-
-#define TWEAK_RULES_EXCEPTIONS( x ) \
- if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
- x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
- loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x
-
-
- FT_LOCAL_DEF( void )
- sph_set_tweaks( TT_Loader loader,
- FT_UInt glyph_index )
- {
- TT_Face face = loader->face;
- FT_String* family = face->root.family_name;
- FT_UInt ppem = loader->size->metrics->x_ppem;
- FT_String* style = face->root.style_name;
-
-
- /* don't apply rules if style isn't set */
- if ( !face->root.style_name )
- return;
-
-#ifdef SPH_DEBUG_MORE_VERBOSE
- printf( "%s,%d,%s,%c=%d ",
- family, ppem, style, glyph_index, glyph_index );
-#endif
-
- TWEAK_RULES( PIXEL_HINTING );
-
- if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
- {
- loader->exec->ignore_x_mode = FALSE;
- return;
- }
-
- TWEAK_RULES( ALLOW_X_DMOVE );
- TWEAK_RULES( ALWAYS_DO_DELTAP );
- TWEAK_RULES( ALWAYS_SKIP_DELTAP );
- TWEAK_RULES( DEEMBOLDEN );
- TWEAK_RULES( DO_SHPIX );
- TWEAK_RULES( EMBOLDEN );
- TWEAK_RULES( MIAP_HACK );
- TWEAK_RULES( NORMAL_ROUND );
- TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
- TWEAK_RULES( NO_CALL_AFTER_IUP );
- TWEAK_RULES( NO_DELTAP_AFTER_IUP );
- TWEAK_RULES( RASTERIZER_35 );
- TWEAK_RULES( SKIP_IUP );
-
- TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
- TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
-
- TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
-
- TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
- TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
-
- TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
- TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
-
- if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
- {
- if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
- {
- loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
- loader->exec->size->cvt_ready = -1;
-
- tt_size_ready_bytecode(
- loader->exec->size,
- FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
- }
- else
- loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
- }
- else
- {
- if ( loader->exec->rasterizer_version !=
- SPH_OPTION_SET_RASTERIZER_VERSION )
- {
- loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
- loader->exec->size->cvt_ready = -1;
-
- tt_size_ready_bytecode(
- loader->exec->size,
- FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
- }
- else
- loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
- }
-
- if ( IS_HINTED( loader->load_flags ) )
- {
- TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
- TWEAK_RULES( COURIER_NEW_2_HACK );
- }
-
- if ( sph_test_tweak( face, family, ppem, style, glyph_index,
- COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
- loader->exec->face->sph_compatibility_mode = TRUE;
-
-
- if ( IS_HINTED( loader->load_flags ) )
- {
- if ( sph_test_tweak( face, family, ppem, style, glyph_index,
- COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
- loader->exec->compatible_widths |= TRUE;
- }
- }
-
-#else /* !(TT_USE_BYTECODE_INTERPRETER && */
- /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
- /* ANSI C doesn't like empty source files */
- typedef int _tt_subpix_dummy;
-
-#endif /* !(TT_USE_BYTECODE_INTERPRETER && */
- /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
-
-/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h b/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h
deleted file mode 100644
index 62af4c272d11..000000000000
--- a/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.h
- *
- * TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-
-#ifndef TTSUBPIX_H_
-#define TTSUBPIX_H_
-
-#include "ttobjs.h"
-#include "ttinterp.h"
-
-
-FT_BEGIN_HEADER
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
- /**************************************************************************
- *
- * ID flags to identify special functions at FDEF and runtime.
- *
- */
-#define SPH_FDEF_INLINE_DELTA_1 0x0000001
-#define SPH_FDEF_INLINE_DELTA_2 0x0000002
-#define SPH_FDEF_DIAGONAL_STROKE 0x0000004
-#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008
-#define SPH_FDEF_TTFAUTOHINT_1 0x0000010
-#define SPH_FDEF_SPACING_1 0x0000020
-#define SPH_FDEF_SPACING_2 0x0000040
-#define SPH_FDEF_TYPEMAN_STROKES 0x0000080
-#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100
-
-
- /**************************************************************************
- *
- * Tweak flags that are set for each glyph by the below rules.
- *
- */
-#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001UL
-#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002UL
-#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004UL
-#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008UL
-#define SPH_TWEAK_DEEMBOLDEN 0x0000010UL
-#define SPH_TWEAK_DO_SHPIX 0x0000020UL
-#define SPH_TWEAK_EMBOLDEN 0x0000040UL
-#define SPH_TWEAK_MIAP_HACK 0x0000080UL
-#define SPH_TWEAK_NORMAL_ROUND 0x0000100UL
-#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200UL
-#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400UL
-#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800UL
-#define SPH_TWEAK_PIXEL_HINTING 0x0001000UL
-#define SPH_TWEAK_RASTERIZER_35 0x0002000UL
-#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000UL
-#define SPH_TWEAK_SKIP_IUP 0x0008000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000UL
-#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000UL
-#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000UL
-
-
- FT_LOCAL( FT_Bool )
- sph_test_tweak( TT_Face face,
- const FT_String* family,
- FT_UInt ppem,
- const FT_String* style,
- FT_UInt glyph_index,
- const SPH_TweakRule* rule,
- FT_UInt num_rules );
-
- FT_LOCAL( FT_UInt )
- sph_test_tweak_x_scaling( TT_Face face,
- const FT_String* family,
- FT_UInt ppem,
- const FT_String* style,
- FT_UInt glyph_index );
-
- FT_LOCAL( void )
- sph_set_tweaks( TT_Loader loader,
- FT_UInt glyph_index );
-
-
- /* These macros are defined absent a method for setting them */
-#define SPH_OPTION_BITMAP_WIDTHS FALSE
-#define SPH_OPTION_SET_SUBPIXEL TRUE
-#define SPH_OPTION_SET_GRAYSCALE FALSE
-#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE
-#define SPH_OPTION_SET_RASTERIZER_VERSION 38
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-FT_END_HEADER
-
-#endif /* TTSUBPIX_H_ */
-
-
-/* END */
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c b/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c
index a63cd4dc48af..b1a0d23bed62 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c
@@ -4,7 +4,7 @@
*
* AFM support for Type 1 fonts (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h b/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h
index 7f5cdda191f4..92ff627dd0d9 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h
@@ -4,7 +4,7 @@
*
* AFM support for Type 1 fonts (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c b/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c
index 8ed01914a5a5..5ded7714021e 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c
@@ -4,7 +4,7 @@
*
* Type 1 driver interface (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h b/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h
index 5ff52b55b1a8..1cc3d24e7dd2 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h
@@ -4,7 +4,7 @@
*
* High-level Type 1 driver interface (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h b/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h
index 8aeb24ae188b..46bddbc30fd8 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h
@@ -4,7 +4,7 @@
*
* Type 1 error codes (specification only).
*
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c b/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c
index c29e682510c2..b9bc0b56ce88 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c
@@ -4,7 +4,7 @@
*
* Type 1 Glyph Loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -70,8 +70,13 @@
/* For incremental fonts get the character data using the */
/* callback function. */
if ( inc )
+ {
+ /* So `free_glyph_data` knows whether to free it. */
+ char_string->pointer = NULL;
+
error = inc->funcs->get_glyph_data( inc->object,
glyph_index, char_string );
+ }
else
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
@@ -155,6 +160,9 @@
decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v );
}
+ if ( error && inc )
+ inc->funcs->free_glyph_data( inc->object, char_string );
+
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
return error;
@@ -295,7 +303,7 @@
{
advances[nn] = 0;
- FT_TRACE5(( " idx %d: advance height 0 font units\n",
+ FT_TRACE5(( " idx %u: advance height 0 font units\n",
first + nn ));
}
@@ -333,7 +341,7 @@
else
advances[nn] = 0;
- FT_TRACE5(( " idx %d: advance width %ld font unit%s\n",
+ FT_TRACE5(( " idx %u: advance width %ld font unit%s\n",
first + nn,
advances[nn],
advances[nn] == 1 ? "" : "s" ));
@@ -380,7 +388,7 @@
goto Exit;
}
- FT_TRACE1(( "T1_Load_Glyph: glyph index %d\n", glyph_index ));
+ FT_TRACE1(( "T1_Load_Glyph: glyph index %u\n", glyph_index ));
FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
@@ -398,16 +406,12 @@
glyph->y_scale = 0x10000L;
}
- t1glyph->outline.n_points = 0;
- t1glyph->outline.n_contours = 0;
-
hinting = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE ) &&
!( load_flags & FT_LOAD_NO_HINTING ) );
scaled = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE ) );
glyph->hint = hinting;
glyph->scaled = scaled;
- t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
error = decoder_funcs->init( &decoder,
t1glyph->face,
@@ -452,16 +456,12 @@
must_finish_decoder = FALSE;
- /* now, set the metrics -- this is rather simple, as */
- /* the left side bearing is the xMin, and the top side */
- /* bearing the yMax */
if ( !error )
{
- t1glyph->outline.flags &= FT_OUTLINE_OWNER;
- t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
- /* for composite glyphs, return only left side bearing and */
- /* advance width */
+ /* now, set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax; for composite glyphs, return only */
+ /* left side bearing and advance width */
if ( load_flags & FT_LOAD_NO_RECURSE )
{
FT_Slot_Internal internal = t1glyph->internal;
@@ -482,6 +482,13 @@
FT_Glyph_Metrics* metrics = &t1glyph->metrics;
+ t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+ t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+ if ( t1size && t1size->metrics.y_ppem < 24 )
+ t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
/* copy the _unscaled_ advance width */
metrics->horiAdvance =
FIXED_TO_INT( decoder.builder.advance.x );
@@ -504,11 +511,6 @@
FIXED_TO_INT( decoder.builder.advance.y );
}
- t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
- if ( t1size && t1size->metrics.y_ppem < 24 )
- t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
#if 1
/* apply the font matrix, if any */
if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h b/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h
index 17a6a5941e32..6bedd132c5fb 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h
@@ -4,7 +4,7 @@
*
* Type 1 Glyph Loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1load.c b/src/java.desktop/share/native/libfreetype/src/type1/t1load.c
index ee7fb42a517a..0f11445bef06 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1load.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1load.c
@@ -4,7 +4,7 @@
*
* Type 1 font loader (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -471,7 +471,7 @@
nc = num_coords;
if ( num_coords > blend->num_axis )
{
- FT_TRACE2(( "T1_Get_MM_Blend: only using first %d of %d coordinates\n",
+ FT_TRACE2(( "T1_Get_MM_Blend: only using first %u of %u coordinates\n",
blend->num_axis, num_coords ));
nc = blend->num_axis;
}
@@ -640,7 +640,7 @@
{
FT_UNUSED( instance_index );
- return T1_Set_MM_Blend( face, 0, NULL );
+ return T1_Set_MM_WeightVector( face, 0, NULL );
}
@@ -691,7 +691,7 @@
if ( num_coords > blend->num_axis )
{
FT_TRACE2(( "T1_Get_Var_Design:"
- " only using first %d of %d coordinates\n",
+ " only using first %u of %u coordinates\n",
blend->num_axis, num_coords ));
nc = blend->num_axis;
}
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1load.h b/src/java.desktop/share/native/libfreetype/src/type1/t1load.h
index a45efa7cb7ba..2cd8241968d1 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1load.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1load.h
@@ -4,7 +4,7 @@
*
* Type 1 font loader (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c b/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c
index b1b27c31fe3b..7f25208f875d 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c
@@ -4,7 +4,7 @@
*
* Type 1 objects manager (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h b/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h
index 3809370c1e08..6c71977c154d 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h
@@ -4,7 +4,7 @@
*
* Type 1 objects manager (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c b/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c
index 3717ea7c5720..ef643e298f42 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c
@@ -4,7 +4,7 @@
*
* Type 1 parser (body).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h b/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h
index a0a2134d45c0..f4ad426e9e1d 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h
@@ -4,7 +4,7 @@
*
* Type 1 parser (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
diff --git a/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h b/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h
index 5a3d2f1ef087..a526406a411a 100644
--- a/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h
+++ b/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h
@@ -4,7 +4,7 @@
*
* Type 1 tokenizer (specification).
*
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -33,7 +33,7 @@
T1_FIELD_DICT_FONTDICT )
/* we use pointers to detect modifications made by synthetic fonts */
- T1_FIELD_NUM ( "ItalicAngle", italic_angle,
+ T1_FIELD_FIXED ( "ItalicAngle", italic_angle,
T1_FIELD_DICT_FONTDICT )
T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch,
T1_FIELD_DICT_FONTDICT )
diff --git a/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java b/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java
index 63cd890f1dbd..4a3f759c559a 100644
--- a/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java
+++ b/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -67,9 +67,13 @@ public class FormatCharAdvanceTest {
* font.em = 2048
* font.ascent = 1638
* font.descent = 410
- * font.familyname = 'Test'
- * font.fontname = 'Test'
- * font.fullname = 'Test'
+ * font.familyname = 'TTFTest'
+ * font.fontname = 'TTFTest'
+ * font.fullname = 'TTFTest'
+ * #Use below values for Type 1 font
+ * #font.familyname = 'Type1Test'
+ * #font.fontname = 'Type1Test'
+ * #font.fullname = 'Type1Test'
* font.copyright = ''
* font.autoWidth(0, 0, 2048)
*
@@ -107,29 +111,30 @@ public class FormatCharAdvanceTest {
*
* ttf = 'test.ttf' # TrueType
* t64 = 'test.ttf.txt' # TrueType Base64
- * pfb = 'test.pfb' # PostScript Type1
- * p64 = 'test.pfb.txt' # PostScript Type1 Base64
+ * #Use commented lines to generate Type1 font
+ * #pfb = 'test.pfb' # PostScript Type1
+ * #p64 = 'test.pfb.txt' # PostScript Type1 Base64
*
* font.generate(ttf)
- * font.generate(pfb)
+ * #font.generate(pfb)
*
* with open(ttf, 'rb') as f1:
* encoded = base64.b64encode(f1.read())
* with open(t64, 'wb') as f2:
* f2.write(encoded)
*
- * with open(pfb, 'rb') as f3:
- * encoded = base64.b64encode(f3.read())
- * with open(p64, 'wb') as f4:
- * f4.write(encoded)
+ * #with open(pfb, 'rb') as f3:
+ * #encoded = base64.b64encode(f3.read())
+ * #with open(p64, 'wb') as f4:
+ * #f4.write(encoded)
*
*/
- private static final String TTF_BYTES = "AAEAAAANAIAAAwBQRkZUTarBS1AAABbcAAAAHE9TLzKD7vqWAAABWAAAAGBjbWFw11zF/AAAAvwAAANSY3Z0IABEBREAAAZQAAAABGdhc3D//wADAAAW1AAAAAhnbHlmgVJ3qAAAB4gAAAnMaGVhZCqFqboAAADcAAAANmhoZWEIcgJiAAABFAAAACRobXR4L1UevAAAAbgAAAFEbG9jYb8EwZoAAAZUAAABNG1heHAA4ABCAAABOAAAACBuYW1lJWcF2wAAEVQAAAGJcG9zdBSfZd0AABLgAAAD8QABAAAAAQAAzMHptF8PPPUACwgAAAAAAORfr7QAAAAA5F+vtABEAAACZAVVAAAACAACAAAAAAAAAAEAAAVVAAAAuAJYAAAAAAJkAAEAAAAAAAAAAAAAAAAAAAAJAAEAAACZAAgAAgAIAAIAAgAAAAEAAQAAAEAALgABAAEABAJXAZAABQAABTMFmQAAAR4FMwWZAAAD1wBmAhIAAAIABQMAAAAAAACAACADAgAAABECAKgAAAAAUGZFZACAAAn//wZm/mYAuAVVAAAAAAABAAAAAADIAMgAAAAgAAEC7ABEAAAAAAJYAGQCWABkAlgAZAJYAGQCWABkAjkAAAJYAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAAAAFAAAAAwAAACwAAAAEAAAA7AABAAAAAAJMAAMAAQAAACwAAwAKAAAA7AAEAMAAAAAoACAABAAIAA0AIAA5AFoAegCFAK0GBQYcBt0HDwiRCOIYDiAPIC8gb/7///v//wAAAAkAIAAwAEEAYQCFAK0GAAYcBt0HDwiQCOIYDiALICggYP7///n//wAA/+f/2P/R/8v/wf+a+kj6Mvly+UH3wfdx6EbgSuAy4AIBcwAAAAEAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMABAAFAAYAAgBzAHQAdQAMAAAAAAFgAAAAAAAAABwAAAAJAAAADAAAAAMAAAANAAAADQAAAAIAAAAgAAAAIAAAAAcAAAAwAAAAOQAAAAgAAABBAAAAWgAAABIAAABhAAAAegAAACwAAACFAAAAhQAAAEYAAACtAAAArQAAAEcAAAYAAAAGBQAAAEgAAAYcAAAGHAAAAE4AAAbdAAAG3QAAAE8AAAcPAAAHDwAAAFAAAAiQAAAIkQAAAFEAAAjiAAAI4gAAAFMAABgOAAAYDgAAAFQAACALAAAgDwAAAFUAACAoAAAgLwAAAFoAACBgAAAgbwAAAGIAAP7/AAD+/wAAAHIAAP/5AAD/+wAAAHMAARC9AAEQvQAAAHYAARDNAAEQzQAAAHcAATQwAAE0PwAAAHgAAbygAAG8owAAAIgAAdFzAAHRegAAAIwADgABAA4AAQAAAJQADgAgAA4AIQAAAJUADgB+AA4AfwAAAJcAAAEGAAABAAAAAAAAAAEDBAUGAgAAAAAAAAAAAAAAAAAAAAEAAAcAAAAAAAAAAAAAAAAAAAAICQoLDA0ODxARAAAAAAAAABITFBUWFxgZGhscHR4fICEiIyQlJicoKSorAAAAAAAALC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAURAAAALAAsADQAPABEAEwAVABUAFwAZABsAHQAfACEAIwAlACcAKQArAC0ALwAxADMANQA3ADkAOwA9AD8AQQBDAEUARwBJAEsATQBPAFEAUwBVAFcAWQBbAF0AYYBjgGWAZ4BpgGuAbYBvgHGAc4B1gHeAeYB7gH2Af4CBgIOAhYCHgImAi4CNgI+AkYCTgJWAl4CZgJuAnYCfgKGAo4ClgKeAqYCrgK2Ar4CxgLOAtYC3gLmAu4C9gL+AwYDDgMWAx4DJgMuAzYDPgNGA04DVgNeA2YDbgN2A34DhgOOA5YDngOmA64DtgO+A8YDzgPWA94D5gPuA/YD/gQGBA4EFgQeBCYELgQ2BD4ERgROBFYEXgRmBG4EdgR+BIYEjgSWBJ4EpgSuBLYEvgTGBM4E1gTeBOYAAgBEAAACZAVVAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCxAwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIRElIREhRAIg/iQBmP5oBVX6q0QEzQAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAAAAgBkAGQB9ADIAAMABwAANzUhFSE1IRVkAZD+cAGQZGRkZGT//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAAAAAAOAK4AAQAAAAAAAAAAAAIAAQAAAAAAAQAEAA0AAQAAAAAAAgAHACIAAQAAAAAAAwAgAGwAAQAAAAAABAAEAJcAAQAAAAAABQAPALwAAQAAAAAABgAEANYAAwABBAkAAAAAAAAAAwABBAkAAQAIAAMAAwABBAkAAgAOABIAAwABBAkAAwBAACoAAwABBAkABAAIAI0AAwABBAkABQAeAJwAAwABBAkABgAIAMwAAAAAVABlAHMAdAAAVGVzdAAAUgBlAGcAdQBsAGEAcgAAUmVndWxhcgAARgBvAG4AdABGAG8AcgBnAGUAIAAyAC4AMAAgADoAIABUAGUAcwB0ACAAOgAgADMAMAAtADUALQAyADAAMgA1AABGb250Rm9yZ2UgMi4wIDogVGVzdCA6IDMwLTUtMjAyNQAAVABlAHMAdAAAVGVzdAAAVgBlAHIAcwBpAG8AbgAgADAAMAAxAC4AMAAwADAAAFZlcnNpb24gMDAxLjAwMAAAVABlAHMAdAAAVGVzdAAAAAAAAgAAAAAAAP9nAGYAAAAAAAAAAAAAAAAAAAAAAAAAAACZAAAAAQECAQMBBAEFAQYAAwATABQAFQAWABcAGAAZABoAGwAcACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0BBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZB3VuaTAwMEQHdW5pMDAwOQd1bmkwMDBBB3VuaTAwMEIHdW5pMDAwQwd1bmkwMDg1B3VuaTAwQUQHdW5pMDYwMAd1bmkwNjAxB3VuaTA2MDIHdW5pMDYwMwd1bmkwNjA0B3VuaTA2MDUHdW5pMDYxQwd1bmkwNkREB3VuaTA3MEYHdW5pMDg5MAd1bmkwODkxB3VuaTA4RTIHdW5pMTgwRQd1bmkyMDBCB3VuaTIwMEMHdW5pMjAwRAd1bmkyMDBFB3VuaTIwMEYHdW5pMjAyOAd1bmkyMDI5B3VuaTIwMkEHdW5pMjAyQgd1bmkyMDJDB3VuaTIwMkQHdW5pMjAyRQd1bmkyMDJGB3VuaTIwNjAHdW5pMjA2MQd1bmkyMDYyB3VuaTIwNjMHdW5pMjA2NAd1bmkyMDY1B3VuaTIwNjYHdW5pMjA2Nwd1bmkyMDY4B3VuaTIwNjkHdW5pMjA2QQd1bmkyMDZCB3VuaTIwNkMHdW5pMjA2RAd1bmkyMDZFB3VuaTIwNkYHdW5pRkVGRgd1bmlGRkY5B3VuaUZGRkEHdW5pRkZGQgZ1MTEwQkQGdTExMENEBnUxMzQzMAZ1MTM0MzEGdTEzNDMyBnUxMzQzMwZ1MTM0MzQGdTEzNDM1BnUxMzQzNgZ1MTM0MzcGdTEzNDM4BnUxMzQzOQZ1MTM0M0EGdTEzNDNCBnUxMzQzQwZ1MTM0M0QGdTEzNDNFBnUxMzQzRgZ1MUJDQTAGdTFCQ0ExBnUxQkNBMgZ1MUJDQTMGdTFEMTczBnUxRDE3NAZ1MUQxNzUGdTFEMTc2BnUxRDE3NwZ1MUQxNzgGdTFEMTc5BnUxRDE3QQZ1RTAwMDEGdUUwMDIwBnVFMDAyMQZ1RTAwN0UGdUUwMDdGAAAAAAAAAf//AAIAAAABAAAAAOIB6+cAAAAA5F+vtAAAAADkX6+0";
+ private static final String TTF_BYTES = "AAEAAAANAIAAAwBQRkZUTbCUBjwAABcAAAAAHE9TLzKD7vqWAAABWAAAAGBjbWFw11zF/AAAAvwAAANSY3Z0IABEBREAAAZQAAAABGdhc3D//wADAAAW+AAAAAhnbHlmgVJ3qAAAB4gAAAnMaGVhZC1MmToAAADcAAAANmhoZWEIcgJiAAABFAAAACRobXR4L1UevAAAAbgAAAFEbG9jYb8EwZoAAAZUAAABNG1heHAA4ABCAAABOAAAACBuYW1lLzI4NgAAEVQAAAGtcG9zdBSfZd0AABMEAAAD8QABAAAAAQAAp/gvll8PPPUACwgAAAAAAOXDJ3QAAAAA5cMndABEAAACZAVVAAAACAACAAAAAAAAAAEAAAVVAAAAuAJYAAAAAAJkAAEAAAAAAAAAAAAAAAAAAAAJAAEAAACZAAgAAgAIAAIAAgAAAAEAAQAAAEAALgABAAEABAJXAZAABQAABTMFmQAAAR4FMwWZAAAD1wBmAhIAAAIABQMAAAAAAACAACADAgAAABECAKgAAAAAUGZFZACAAAn//wZm/mYAuAVVAAAAAAABAAAAAADIAMgAAAAgAAEC7ABEAAAAAAJYAGQCWABkAlgAZAJYAGQCWABkAjkAAAJYAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAAAAFAAAAAwAAACwAAAAEAAAA7AABAAAAAAJMAAMAAQAAACwAAwAKAAAA7AAEAMAAAAAoACAABAAIAA0AIAA5AFoAegCFAK0GBQYcBt0HDwiRCOIYDiAPIC8gb/7///v//wAAAAkAIAAwAEEAYQCFAK0GAAYcBt0HDwiQCOIYDiALICggYP7///n//wAA/+f/2P/R/8v/wf+a+kj6Mvly+UH3wfdx6EbgSuAy4AIBcwAAAAEAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMABAAFAAYAAgBzAHQAdQAMAAAAAAFgAAAAAAAAABwAAAAJAAAADAAAAAMAAAANAAAADQAAAAIAAAAgAAAAIAAAAAcAAAAwAAAAOQAAAAgAAABBAAAAWgAAABIAAABhAAAAegAAACwAAACFAAAAhQAAAEYAAACtAAAArQAAAEcAAAYAAAAGBQAAAEgAAAYcAAAGHAAAAE4AAAbdAAAG3QAAAE8AAAcPAAAHDwAAAFAAAAiQAAAIkQAAAFEAAAjiAAAI4gAAAFMAABgOAAAYDgAAAFQAACALAAAgDwAAAFUAACAoAAAgLwAAAFoAACBgAAAgbwAAAGIAAP7/AAD+/wAAAHIAAP/5AAD/+wAAAHMAARC9AAEQvQAAAHYAARDNAAEQzQAAAHcAATQwAAE0PwAAAHgAAbygAAG8owAAAIgAAdFzAAHRegAAAIwADgABAA4AAQAAAJQADgAgAA4AIQAAAJUADgB+AA4AfwAAAJcAAAEGAAABAAAAAAAAAAEDBAUGAgAAAAAAAAAAAAAAAAAAAAEAAAcAAAAAAAAAAAAAAAAAAAAICQoLDA0ODxARAAAAAAAAABITFBUWFxgZGhscHR4fICEiIyQlJicoKSorAAAAAAAALC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAURAAAALAAsADQAPABEAEwAVABUAFwAZABsAHQAfACEAIwAlACcAKQArAC0ALwAxADMANQA3ADkAOwA9AD8AQQBDAEUARwBJAEsATQBPAFEAUwBVAFcAWQBbAF0AYYBjgGWAZ4BpgGuAbYBvgHGAc4B1gHeAeYB7gH2Af4CBgIOAhYCHgImAi4CNgI+AkYCTgJWAl4CZgJuAnYCfgKGAo4ClgKeAqYCrgK2Ar4CxgLOAtYC3gLmAu4C9gL+AwYDDgMWAx4DJgMuAzYDPgNGA04DVgNeA2YDbgN2A34DhgOOA5YDngOmA64DtgO+A8YDzgPWA94D5gPuA/YD/gQGBA4EFgQeBCYELgQ2BD4ERgROBFYEXgRmBG4EdgR+BIYEjgSWBJ4EpgSuBLYEvgTGBM4E1gTeBOYAAgBEAAACZAVVAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCxAwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIRElIREhRAIg/iQBmP5oBVX6q0QEzQAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAAAAgBkAGQB9ADIAAMABwAANzUhFSE1IRVkAZD+cAGQZGRkZGT//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAAAAAAOAK4AAQAAAAAAAAAAAAIAAQAAAAAAAQAHABMAAQAAAAAAAgAHACsAAQAAAAAAAwAjAHsAAQAAAAAABAAHAK8AAQAAAAAABQAPANcAAQAAAAAABgAHAPcAAwABBAkAAAAAAAAAAwABBAkAAQAOAAMAAwABBAkAAgAOABsAAwABBAkAAwBGADMAAwABBAkABAAOAJ8AAwABBAkABQAeALcAAwABBAkABgAOAOcAAAAAVABUAEYAVABlAHMAdAAAVFRGVGVzdAAAUgBlAGcAdQBsAGEAcgAAUmVndWxhcgAARgBvAG4AdABGAG8AcgBnAGUAIAAyAC4AMAAgADoAIABUAFQARgBUAGUAcwB0ACAAOgAgADIANAAtADIALQAyADAAMgA2AABGb250Rm9yZ2UgMi4wIDogVFRGVGVzdCA6IDI0LTItMjAyNgAAVABUAEYAVABlAHMAdAAAVFRGVGVzdAAAVgBlAHIAcwBpAG8AbgAgADAAMAAxAC4AMAAwADAAAFZlcnNpb24gMDAxLjAwMAAAVABUAEYAVABlAHMAdAAAVFRGVGVzdAAAAAAAAgAAAAAAAP9nAGYAAAAAAAAAAAAAAAAAAAAAAAAAAACZAAAAAQECAQMBBAEFAQYAAwATABQAFQAWABcAGAAZABoAGwAcACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0BBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZB3VuaTAwMEQHdW5pMDAwOQd1bmkwMDBBB3VuaTAwMEIHdW5pMDAwQwd1bmkwMDg1B3VuaTAwQUQHdW5pMDYwMAd1bmkwNjAxB3VuaTA2MDIHdW5pMDYwMwd1bmkwNjA0B3VuaTA2MDUHdW5pMDYxQwd1bmkwNkREB3VuaTA3MEYHdW5pMDg5MAd1bmkwODkxB3VuaTA4RTIHdW5pMTgwRQd1bmkyMDBCB3VuaTIwMEMHdW5pMjAwRAd1bmkyMDBFB3VuaTIwMEYHdW5pMjAyOAd1bmkyMDI5B3VuaTIwMkEHdW5pMjAyQgd1bmkyMDJDB3VuaTIwMkQHdW5pMjAyRQd1bmkyMDJGB3VuaTIwNjAHdW5pMjA2MQd1bmkyMDYyB3VuaTIwNjMHdW5pMjA2NAd1bmkyMDY1B3VuaTIwNjYHdW5pMjA2Nwd1bmkyMDY4B3VuaTIwNjkHdW5pMjA2QQd1bmkyMDZCB3VuaTIwNkMHdW5pMjA2RAd1bmkyMDZFB3VuaTIwNkYHdW5pRkVGRgd1bmlGRkY5B3VuaUZGRkEHdW5pRkZGQgZ1MTEwQkQGdTExMENEBnUxMzQzMAZ1MTM0MzEGdTEzNDMyBnUxMzQzMwZ1MTM0MzQGdTEzNDM1BnUxMzQzNgZ1MTM0MzcGdTEzNDM4BnUxMzQzOQZ1MTM0M0EGdTEzNDNCBnUxMzQzQwZ1MTM0M0QGdTEzNDNFBnUxMzQzRgZ1MUJDQTAGdTFCQ0ExBnUxQkNBMgZ1MUJDQTMGdTFEMTczBnUxRDE3NAZ1MUQxNzUGdTFEMTc2BnUxRDE3NwZ1MUQxNzgGdTFEMTc5BnUxRDE3QQZ1RTAwMDEGdUUwMDIwBnVFMDAyMQZ1RTAwN0UGdUUwMDdGAAAAAAAAAf//AAIAAAABAAAAAOUNt1MAAAAA5cMndAAAAADlwyd0";
/**
- * Same font as above, but in PostScript Type1 (PFB) format.
+ * Same font as above, but in PostScript Type1 (PFB) format with different font name.
*/
- private static final String TYPE1_BYTES = "gAFSBwAAJSFQUy1BZG9iZUZvbnQtMS4wOiBUZXN0IDAwMS4wMDAKJSVUaXRsZTogVGVzdAolVmVyc2lvbjogMDAxLjAwMAolJUNyZWF0aW9uRGF0ZTogRnJpIE1heSAzMCAyMDo1NTo0OCAyMDI1CiUlQ3JlYXRvcjogRGFuaWVsIEdyZWRsZXIKJSAyMDI1LTUtMzA6IENyZWF0ZWQgd2l0aCBGb250Rm9yZ2UgKGh0dHA6Ly9mb250Zm9yZ2Uub3JnKQolIEdlbmVyYXRlZCBieSBGb250Rm9yZ2UgMjAyMzAxMDEgKGh0dHA6Ly9mb250Zm9yZ2Uuc2YubmV0LykKJSVFbmRDb21tZW50cwoKMTAgZGljdCBiZWdpbgovRm9udFR5cGUgMSBkZWYKL0ZvbnRNYXRyaXggWzAuMDAwNDg4MjgxIDAgMCAwLjAwMDQ4ODI4MSAwIDAgXXJlYWRvbmx5IGRlZgovRm9udE5hbWUgL1Rlc3QgZGVmCi9Gb250QkJveCB7MTAwIDEwMCA1MDAgMjAwIH1yZWFkb25seSBkZWYKL1BhaW50VHlwZSAwIGRlZgovRm9udEluZm8gMTAgZGljdCBkdXAgYmVnaW4KIC92ZXJzaW9uICgwMDEuMDAwKSByZWFkb25seSBkZWYKIC9Ob3RpY2UgKCkgcmVhZG9ubHkgZGVmCiAvRnVsbE5hbWUgKFRlc3QpIHJlYWRvbmx5IGRlZgogL0ZhbWlseU5hbWUgKFRlc3QpIHJlYWRvbmx5IGRlZgogL1dlaWdodCAoUmVndWxhcikgcmVhZG9ubHkgZGVmCiAvRlNUeXBlIDAgZGVmCiAvSXRhbGljQW5nbGUgMCBkZWYKIC9pc0ZpeGVkUGl0Y2ggZmFsc2UgZGVmCiAvVW5kZXJsaW5lUG9zaXRpb24gLTIwNC44IGRlZgogL1VuZGVybGluZVRoaWNrbmVzcyAxMDIuNCBkZWYKZW5kIHJlYWRvbmx5IGRlZgovRW5jb2RpbmcgMjU2IGFycmF5CiAwIDEgMjU1IHsgMSBpbmRleCBleGNoIC8ubm90ZGVmIHB1dH0gZm9yCmR1cCA5L3VuaTAwMDkgcHV0CmR1cCAxMC91bmkwMDBBIHB1dApkdXAgMTEvdW5pMDAwQiBwdXQKZHVwIDEyL3VuaTAwMEMgcHV0CmR1cCAxMy91bmkwMDBEIHB1dApkdXAgMzIvc3BhY2UgcHV0CmR1cCA0OC96ZXJvIHB1dApkdXAgNDkvb25lIHB1dApkdXAgNTAvdHdvIHB1dApkdXAgNTEvdGhyZWUgcHV0CmR1cCA1Mi9mb3VyIHB1dApkdXAgNTMvZml2ZSBwdXQKZHVwIDU0L3NpeCBwdXQKZHVwIDU1L3NldmVuIHB1dApkdXAgNTYvZWlnaHQgcHV0CmR1cCA1Ny9uaW5lIHB1dApkdXAgNjUvQSBwdXQKZHVwIDY2L0IgcHV0CmR1cCA2Ny9DIHB1dApkdXAgNjgvRCBwdXQKZHVwIDY5L0UgcHV0CmR1cCA3MC9GIHB1dApkdXAgNzEvRyBwdXQKZHVwIDcyL0ggcHV0CmR1cCA3My9JIHB1dApkdXAgNzQvSiBwdXQKZHVwIDc1L0sgcHV0CmR1cCA3Ni9MIHB1dApkdXAgNzcvTSBwdXQKZHVwIDc4L04gcHV0CmR1cCA3OS9PIHB1dApkdXAgODAvUCBwdXQKZHVwIDgxL1EgcHV0CmR1cCA4Mi9SIHB1dApkdXAgODMvUyBwdXQKZHVwIDg0L1QgcHV0CmR1cCA4NS9VIHB1dApkdXAgODYvViBwdXQKZHVwIDg3L1cgcHV0CmR1cCA4OC9YIHB1dApkdXAgODkvWSBwdXQKZHVwIDkwL1ogcHV0CmR1cCA5Ny9hIHB1dApkdXAgOTgvYiBwdXQKZHVwIDk5L2MgcHV0CmR1cCAxMDAvZCBwdXQKZHVwIDEwMS9lIHB1dApkdXAgMTAyL2YgcHV0CmR1cCAxMDMvZyBwdXQKZHVwIDEwNC9oIHB1dApkdXAgMTA1L2kgcHV0CmR1cCAxMDYvaiBwdXQKZHVwIDEwNy9rIHB1dApkdXAgMTA4L2wgcHV0CmR1cCAxMDkvbSBwdXQKZHVwIDExMC9uIHB1dApkdXAgMTExL28gcHV0CmR1cCAxMTIvcCBwdXQKZHVwIDExMy9xIHB1dApkdXAgMTE0L3IgcHV0CmR1cCAxMTUvcyBwdXQKZHVwIDExNi90IHB1dApkdXAgMTE3L3UgcHV0CmR1cCAxMTgvdiBwdXQKZHVwIDExOS93IHB1dApkdXAgMTIwL3ggcHV0CmR1cCAxMjEveSBwdXQKZHVwIDEyMi96IHB1dApkdXAgMTMzL3VuaTAwODUgcHV0CmR1cCAxNzMvdW5pMDBBRCBwdXQKcmVhZG9ubHkgZGVmCmN1cnJlbnRkaWN0IGVuZApjdXJyZW50ZmlsZSBlZXhlYwqAAo0WAAB0P4QT82NsqFqf/vtQtLsnMCpcwKtuL5Wb8g0yDDc8ISjQoM5wcrH2cqCqOMPA7OsEtEyxdKHDFhLXH/ogyQlUJWN4Ny95WwvylB9DfwWfQa4FmMAFFf7xhzM1V/Ms4yqe59S6tl2lND+ScH4s/PPozkRuWtrDn8N+zmS2izVs4NcQ9FsefyzXaKvKFDYINmh2GhAJRkFi0FTB9r8sRqMZs8ZkUodjFsE6kmRW02YpWP1WdA1YVnNuYQT4E+0xkVZ3eTTuscVEWua/buWeWxlwi0KH20ubr5iCkavAb953/MMe4XMKlPvGzsx0Slmp9qOOLD0ko2287peB1DvLavHCG/r2rr8MhqsKVoSyFr36sVd9hMSQrwFxpRjVEjtt5HDGcbHwy3ylp8b1oopSl5AQmeoW/oGT0rPr+358A+Qd2/wpQgStXDcDExQWDrdOL7J5Fr7VBDu8NNORXc7c5uKb2iVQq5AOF+Yfa5bH4reIFcWrAItBML9L9b8sOf1QKzGymFzgcDW3EEx07Y07ys95zSLkYtY5lkjm07GFSyM9cuWhRctY6RTcjTAFNdbxOUBXbIGf4Q8nhdXXi3IKhYdqdgKEsWphwKEdQeP7QYqW4bPSB881DjF/e7r6PIkua8MXGI3G1I0C53TIFnHXai5dtVJ4cZhdaTzgoD9K6zYMNsb8Tof6THYx+cRUzPbJmb+VbprjDk96+92jF+P0EwubV0GQMLEdCyPDV1u/vIHPePqSJt2/YjgkXEugRbyqzFwfZJdeAmkzcqs1CU9EiqrwgqbEfdmWWwv9BDxgkWD4omPKAKX1A6asv/UVfH8lebHSbrKddpR8XU/C2I/t7UhI19oTFqIvUL061MrZPiHZaFE9bnvJw+P91hF+MoPs69ddhD4Kj6z6MJYNGlvAZMuUM/RdAUwE3HHhwGiCN3Hqi4V+byVeB95B/8YLQK1CiW/pgfU7TqZ1d5nWGoAXAcAu6UYGvZZ0ChX3AEPlIFJ4x4hXfBo0I/k/TEHus/u5dNm/+ixyBcr/rX/e2yPIBfJkBJDG8x/y7JaxOFAD1NMQ4zWjbzP1uPpiGzRKfCXYLF6YXLfGDKJ1w3IENGwIMXBgqOx6O2v2xkYhcAUkrZ2Nw3xpRrnj2RqGCGwz00AHrl9AU7CNaM8BkSe6d86xT8teVYuOk926Xj4/+Kx6rfu526Ylz91kxebopcMvql6ysRVzzSGsW2ec9ZPJo1Q/WKb+tCvBm8OdUnRi+DldIajpytyl08TmlS+IRUcHZbxoIjxb7ZCvF8hd03yDhs9bsUSO6h7jbhegenLIiQPX7RtsGAg3logZLD0NUjcAm2tKBieMHhMxAD89lVmuMkNj5r6EaixXvkvhgqzhjPExdu30Knife5IEnlCvIlMCh1EXQsY9KRkzeTRTKfnZTJ/idze+cX0nCEGcFrvCCjZRfNuaLRHx73o2KlDHmoYBm1mFEEvfUReQxS987AiVfSF7cs8IrLEqV9qe2mCAv7ATbVUFbnvYxTBYvHL9sc4892rLrjSu/yP5RZmmIMOpTH8CStLw1zGAcXH3W3ZfPjQkEA4jzvo1U5Oi9EkBKqlgqjj2pFLWepwuNG/L3Iyr36frW6NFtqCxyVQYcNwOTnmQjY0LXPAKxyz2l+xyo/gcDY8nqtWms5aqINgemqM0pG2wBt3GawARbEVkkKllyB/WJbRw0GGHktmj73ixkTulD6nHZ+vMd+aS8iKXPa2ASEOPpxp515DZxg+VYZIrM0h4mDdRff4To/8NKs7Kx4IZx2qzlhIKS2zHpLwuY/U2Wt80e9nqMCFEtnS8sKpcy1rrE9FzXsFUNtYE6LdIat4ygQxoq24Y6D3bfDpl3E8wMvECaVCJX8lfBhQcGGU6+Jba1qfQ7jonjQM0zfoOwHrApk/dkPkSdjQy7UM+dZNMtgZf2N46UuWC2YCtcqCN1X+o5SpojTgXNmTjUy3KOy6L4GNYOxutsDhWiah6rJ+FGVL9D51MJvT3l02T1+LpNt8ZeZQSkZpx7NdFFTFA4/SE8zycfBLNm71Q9pjQKa30TnCY9ZkMEH9rnArLV0w2Gi6LoJoWpT7GoAB2Cdvi3x9wGDdt60K6oABWiD5mpAv4KfrJMBn5dRDJVyRPARXxwBUROAc3BxY8St3WuWKqDqqef0t0rlqAXGynPrcAjqFMXc/GBWORQ7W/dTvbu/eZb+apjKEX7szjaY4cSRsNge4gTyCEsfhLrdBkncM7up9jj206tIaqZQILxHAnrVwYplJ5D2EvSSLYvxFEVHSrI19aNJEvDK64tzXCV+P4yOCOuXpBmc15PDlrMQEauqrD+xneCO+CrCbudHXOJsbmvQq56+ovLp5SNBfdEPQpqo5tBgQaNHcEjg/iVt++uLxT3vAEFW5d7WXPMYdy+XqoMmdRDOzey0Mdx5BZ92rNM/LthQa6F54nvzkypM64HdxCYlri8cO3k0G6bp2eWdseP0P4zMc5QikuXc/Dr4NztBYe2yJLbLLesWSB8nOWcl+gd0GMX5PY4P5mn5WJDNStLWPdD9NapzMsyx6lZwR9Tfv/XSmay9LEo9YaaxysWfllDIasUCdvhZVi7LJvPu/0GbuHLOz9mP6prkF8h8KmjBYMlMktouA23G74M+Pkdfbj9KAM8zOYCgQFZUaXx3iZ4m3uBtDPeKjUcdFZSnHdW11eSv5aCz2fMbExV/qnPOSMbkR5rvpR71WwVZP6j3tNWr8jlPQ8d60k8jXPy7d8wjw9obnDEpvKzKreEzjfA0wCovNt7FLH9oxWmO5TF8JMg/U7+ToEv0fPAW475dXTXdue98/k/c+3+LCJNbHzBBx14CzpteKXKqGNA3jwgJUhfDsTISiN4gF222zIi1deY9BspjPl7jergbwh+ZPdfk2BLaPTDeNUycKdeiFoJEd8gKLvjMrnPa9IX4HwR9gJSjsQ0UWhnYuaXdk12zk8sVkGJAJLrphh5tHcd4LwG2rWcVXwM/2zw1YXQR+jffC1uxUEPVaq1fSf9RB6iEb8LgIollE+gDEybc+Dw3Q/gxVe5/Nu0vHHur6B+4YEcxvz3O5cYKUQTxDgG4mXJhqZ6z7etSWINChQyP6PUFFbsUIDXjfuHZ9oF4ce1NNOnn/RIwm/u/+AduDTtqloUooZjqak4VbvmBEZcW75liKm0MggeilL0nl5arItzTwE8OudJDBkJ/xnf1yZIgeFKSODIz5aQrIiSMJX3BGRxHEEQrm1xtwCfjtMPpFhFtG+o5fjMlCnowJ6+/HrG3FdZKn4/gv7qCxF2/3NW2J4OWuXbjEsUlSHu57DFvhrVl/q8jv81OfXhZKutYQWjaDWwOQHR+ym6wvMyQ9YfiiJpBXa+Ig9uGAbERyApc8wsCLcy0d8Msxx9PAfhrDa+Gf2yhYGA57t8iGxEcoI0A4B8zKVqYXKf4AdsrVzE9cUpfRN/HH8OGWyv9mKMTJyGJQql/OH5hYHnvJVKZXIz6l3nL/7gnpYaGtASiV1q+JwO7WSk1pfwT9SE4sFl7uS7f3pu4BwPhcz/wyN82f144yav11mrGqypOMaMDR27/L0sW1c3hWBBa8BMU/EuwF7ldclS9nxmFHOc35RLruyQ26cp1niukcpK42wg3ozqGQLoQRIoin0AWnUwnOmkdBEkILqFCiWgERDZuCB7G3pZJW/32HPgD3byO0lH8JF6OiINsUmM+75Y3qdvuepTHxXwpDa9Isero3x/f+UWGGUO12s+Ou2yQKtLsQaBNSTaGEBVCAtpJ58TgZ+KfVyhgRQdINr7GuGq9iRPQBY00anspxvsrhfffggqOariHO8h0jdEZPJarJJAufQbYgKiACtJ8iG6jlIs3GfWRI0jRYDw+kHPc2/A6fS5XGF360aX1I6iy5J1pZpN+6stJq5MQ8QRHopTJWQ0DW1Pq46BglmHH9av/X4tvLFFyyC4X6OB2jDb9+XwwcuJ2t/352IcJC06IsWKDsr6E6vF3hC3GUBUy9I7JbqlAh7zlYK52MITQzGINZD2p8+TJjmDycEr/UM/JHqBzbJniUzxg8vo2/FjpZggU8NuBsTZ5P/YZSgRsZcVKkhkGYAn+euvrQIiZ2LMwOygD0gW/zy7v+Z1aHfxKig7kkOR1ZuVCFE8FWx1unCnFHtkjFIx9JY4cYHboveIlF2IzNhfnKJncBt7DuZORqfAT3gQDZlIFNx06tSnTe1v5l7u7VSKMXRhc3bbeCqfvO/NSOqfLz1QYlj2b0C5sm0AcUe1RpC7rOu6muPLeJ38DOIhJHzs+wpqBZTHJr9zdnjZl+OyXaAAbgCsxamEQW91iGdRmVHqyT+0+XQxssYOF795eGYpsXy9Bik6Z4apt/AcuZQFu3XthVXvjyVCi0Rj3gXjOkFdT1YaiRe6yPRdBB2GorcxCzQQvjZXTuh5P4a7MD/6W0mJYoh0BzQHYC0O/T9v3d8GepAbQTytL7MWIWk9C2qZ0pPciuIfXNmGRWBUkCCts1BAsW39l4giNBCwDQ6CauWkz8iWaxx2krBQpKl0WyBBSd/SIJUFM4psvYNaGNk+xR18s0OrPqvxQvc3NNgVwpAljSM/wt3IzIcIsJHF/u0T60hXgEv4H0f44/SzROL0iGUZIfRZK6sJRGBQH2ZVrFCJ6ageJX7WTBLVwKAtxgIUK2dXAemsYgGm/CIe3JCmwL/YmEh8I8W4LrWzXq4vNF6/Sq1hQ2r4dndAO+HEZ8nYpPr+9pUCUgSvnN7aVWZpc/xJaj5L4U6W28hVZ2mb+UUKDpq0bSxKdkVr2SC/7Q/8WimMNDYCaExzXQ+RzZyv/4227pn/k3y1avulXGz3ujy+lqdciVVWHmPYyJPhqeoyDEkM6g46KL9kg912jsB1SGP7Yc2l7XENW59mh5RE+fNiW8wWjxW0Oa+xSe2+RTOgRA+Ojq2L8+g9sL7jKw7BPAPjnYTo8gMat4DurAKbJrtaRLZMzXkFyE7heHr9NsLJl/d1JLRwNoGDpnvLjyPNBUjW/2CTEEIyI6yq3oOJivAwe1yiJib7IUTkh5MCBSnEssvxOYJRUaR/ILAHMJpAoEV/VOCfBlh/I55gVYZWa+Y/5/AMs5Po1w9/18Q6V4ichv80Qr+Up7+2s8sV6zM7m78WMmQp3IR6uTJasqI2Vnr99KAY31BJVpBelRq2xjIruSHx/BAr2kSHA+Kuk1I9+Y1dEaSbfUpjcly0WDUh9x1VTkrUu1u6XN/i/SkFeO1k8o2o7s0rVXNI+VipXQt69H+yVDea7AYuvy9Rp2kKuq7o7mgcFCVq1Vbeyv++vDSKdYmKbyQ2N7ubU6u41Td59YNfRldl56ec0bl7hgyMUb/7/ifjdRXOVl1sTTMUiETnT+44vuAiiUeOHRgKmRlLgHp9iMnPPZVF3DqExLV1IPraZO/olA9QIc4bM2g6SPebITaH94rZn80oQzWzBAFUzK/B2vY39XGdPSTAZTFn1yAYcRHIhqWZs9+FtJvBN9f9lUxPFHUs3vyKBC8sFph/yee7KNIKyTinMNAs1+jcnVS4LPqR4L4cn3ancasZ6wBgexKIjjwf8KPkgUcMwZqk+KwDeJbmyGblqsRzSuhrwPq0U+n4n1ktcqI11Y4D/u93UrU04LgZwWPEZPrgjGUgciPrRa3BIJb6oT1s5VSfgiupwHaFYgF5sJ3VD0ZcT1zwdet8tPprxRq00SIZMZKZeVSIWD0ai82pPxH4PYLUGwUbW3ocaYouILRf9sF9DP1gaVfd4SDRUuKUtZRiG6lpSopmFO24N1vWq90caknzY91uUWX2v4+C/JHDd47e4h/g1Lf13euI6csefzsnQDTDsyrh5zSJDo26B81kY5RyKv+AnsvTnTl8uroRsh1KqeIUywpWImmlnnWT8rpNg822BjraGaWc9NHFzkUSmOmD/iJRdfRjno1JaeDVk8KBniY0vnMqdBG1BWRMsnUAhWxHJ4Jn5fXCltO2C5OV+x+jYocNhWw4Mgu3CVZp9erAEPsDEUsY4qaMitjRq6yJPn3nwkQRpFHGbXv187fPU/z8+BQ5/W4Qfg/qEmJKcp1T5VcrwLAlZQTomKAt/7xNlJIxlx9bCMVXnvk3Y8hB7kCTaSQmvjC8IXCHbJyMCFQV7qAKdmaihyV7zmpqWcDqfELQChm2KxmQJ1dPYJ1+jR+aYm3an5bPEoCdbsZauFF8qXHIhx8JKvRGgxPrTGHi8N5FcfuNsCA3xOkoSGX9Sxg6h5KEtoeFdkwf5BKqhJj5pcsBewAHkWng86BzAqt7R+a9TnyvLMWvmpI/0fkpRkbg731aWOnWOvbpz6f+nXSxGgrvs/B6xSgFPDo6Ty3ivL+CGitfK6XwdHA07TV/eK5vd5oyNe/Ay5wMdXiypEUWukN+jiuGmrVMkke/0DmXmtqqY3T45iLrqfgwRhXsT9kEdzcWVqM4OkAEqEzpjI0NHG74cslhQvDPbX/ZRp57/bcOuarHpCDakvzajblF2NXf0Wp0dO0NltExHFoY8myAlBu/SMn3VN6GF5faMq370MevoNi4eNRD8XiGUYh+QzVphqtLIeqyyt6W4MzTjwSLgAB0kITRYcG0KVi89iUgZMQdwIOfMUBmS/q1GpBtTFKqI2TwC3dz9oBnNzwi3Ru9yyNuX1mw1p0Sd8UNY0yVbdb7UrLrd0ldVrx2FWNVCEedkn0npe9xstIJvgMuRLA0DNN7vex3hfvGvV7qCuQi5ssNVYUkoyEjlFR3xCThuVCgwzK77JmvWMpeB0eR0O3SH9KK/1qaAkXK/bhyazFdT+WHrexsFYZuO5I1MiQWJzNDQ9r3act5mt0senky0dQ+Sb233mB+RX2AWxOf9SUcRtkKjiTvfSdcKHmLx7ns2F8MQdwFoKz7j4a7sPsuruL+BMHWuDj/VTfnVmG6nlzIjs92LVWKnZ010UOv156HJYQvhlSV+WzPv8EC/2A2LhBx0g1ZJ3vYQIu2G1AuhcZurtEOfbhcIsS6cq9P2YoRYTYTHeiXHNzKot/25uSAFs85GQhWyMz+2L3HBiszTmSdwtf0ZzHgGEBc90JD6yNfjwqF4FJ7AcuLYw5euNz/VEON3z2C021shibn6LGd4RjflA8XmBGSakJ0nkpplflYaQ9Awcv2eKYR4ebAVjhyErm4zHikUC5Vgtz/0UbghbNcX0RIEESW2GaGtFNYIYNPHJNtj4QMYLK7BrUOnzITF+Kx/FZG6oIeySnU+TJoZIkJBIqGLOYSkw+QuEbCbf1BM5nERddA8z+IFxYz7Goxg4XMpc3+L/Hx29UZzkNSY55Y2Swii1qxBWgBaRGpzI66cKfr6mHES+cbb9vNAdFPuBgJttyT/t3Jf+W5yRYt8M4VyIlEiUjAGqL3bqakDP5IwywMSpYeS1PmqWBsbUcV9bAavsLMnnEHvUue8GboIr+EeBMCk6XPBKFahrRZBTQq802IGDYOi++VjG7805Tleu2pX6H/IY/LDQVLnqVhxDaVonTvQqMffVvSwXp7EFNvR/XKxh+IJxO/W3tQeAi8Jn77E3itRU+tQEl8QQ65psW7FBQXujG6YYWK9XbPUPI/AkdVmaAuQQt7RPni0MhxB0Q8k6BqzhwbpyLMPa/XCkHdJLrO2xGupnrwYvt0OcF7Ia/hN9+HAekLtq8l+HcNGIY/JA2RPYOYGSEgAEVAgAACjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApjbGVhcnRvbWFyawqAAw==";
+ private static final String TYPE1_BYTES = "gAFfBwAAJSFQUy1BZG9iZUZvbnQtMS4wOiBUeXBlMVRlc3QgMDAxLjAwMAolJVRpdGxlOiBUeXBlMVRlc3QKJVZlcnNpb246IDAwMS4wMDAKJSVDcmVhdGlvbkRhdGU6IFR1ZSBGZWIgMjQgMTU6MzQ6MDUgMjAyNgolJUNyZWF0b3I6IEpheWF0aGlydGggUmFvIEQgVgolIDIwMjYtMi0yNDogQ3JlYXRlZCB3aXRoIEZvbnRGb3JnZSAoaHR0cDovL2ZvbnRmb3JnZS5vcmcpCiUgR2VuZXJhdGVkIGJ5IEZvbnRGb3JnZSAyMDI1MTAwOSAoaHR0cDovL2ZvbnRmb3JnZS5zZi5uZXQvKQolJUVuZENvbW1lbnRzCgoxMCBkaWN0IGJlZ2luCi9Gb250VHlwZSAxIGRlZgovRm9udE1hdHJpeCBbMC4wMDA0ODgyODEgMCAwIDAuMDAwNDg4MjgxIDAgMCBdcmVhZG9ubHkgZGVmCi9Gb250TmFtZSAvVHlwZTFUZXN0IGRlZgovRm9udEJCb3ggezEwMCAxMDAgNTAwIDIwMCB9cmVhZG9ubHkgZGVmCi9QYWludFR5cGUgMCBkZWYKL0ZvbnRJbmZvIDkgZGljdCBkdXAgYmVnaW4KIC92ZXJzaW9uICgwMDEuMDAwKSByZWFkb25seSBkZWYKIC9Ob3RpY2UgKCkgcmVhZG9ubHkgZGVmCiAvRnVsbE5hbWUgKFR5cGUxVGVzdCkgcmVhZG9ubHkgZGVmCiAvRmFtaWx5TmFtZSAoVHlwZTFUZXN0KSByZWFkb25seSBkZWYKIC9XZWlnaHQgKFJlZ3VsYXIpIHJlYWRvbmx5IGRlZgogL0l0YWxpY0FuZ2xlIDAgZGVmCiAvaXNGaXhlZFBpdGNoIGZhbHNlIGRlZgogL1VuZGVybGluZVBvc2l0aW9uIC0yMDQuOCBkZWYKIC9VbmRlcmxpbmVUaGlja25lc3MgMTAyLjQgZGVmCmVuZCByZWFkb25seSBkZWYKL0VuY29kaW5nIDI1NiBhcnJheQogMCAxIDI1NSB7IDEgaW5kZXggZXhjaCAvLm5vdGRlZiBwdXR9IGZvcgpkdXAgOS91bmkwMDA5IHB1dApkdXAgMTAvdW5pMDAwQSBwdXQKZHVwIDExL3VuaTAwMEIgcHV0CmR1cCAxMi91bmkwMDBDIHB1dApkdXAgMTMvdW5pMDAwRCBwdXQKZHVwIDMyL3NwYWNlIHB1dApkdXAgNDgvemVybyBwdXQKZHVwIDQ5L29uZSBwdXQKZHVwIDUwL3R3byBwdXQKZHVwIDUxL3RocmVlIHB1dApkdXAgNTIvZm91ciBwdXQKZHVwIDUzL2ZpdmUgcHV0CmR1cCA1NC9zaXggcHV0CmR1cCA1NS9zZXZlbiBwdXQKZHVwIDU2L2VpZ2h0IHB1dApkdXAgNTcvbmluZSBwdXQKZHVwIDY1L0EgcHV0CmR1cCA2Ni9CIHB1dApkdXAgNjcvQyBwdXQKZHVwIDY4L0QgcHV0CmR1cCA2OS9FIHB1dApkdXAgNzAvRiBwdXQKZHVwIDcxL0cgcHV0CmR1cCA3Mi9IIHB1dApkdXAgNzMvSSBwdXQKZHVwIDc0L0ogcHV0CmR1cCA3NS9LIHB1dApkdXAgNzYvTCBwdXQKZHVwIDc3L00gcHV0CmR1cCA3OC9OIHB1dApkdXAgNzkvTyBwdXQKZHVwIDgwL1AgcHV0CmR1cCA4MS9RIHB1dApkdXAgODIvUiBwdXQKZHVwIDgzL1MgcHV0CmR1cCA4NC9UIHB1dApkdXAgODUvVSBwdXQKZHVwIDg2L1YgcHV0CmR1cCA4Ny9XIHB1dApkdXAgODgvWCBwdXQKZHVwIDg5L1kgcHV0CmR1cCA5MC9aIHB1dApkdXAgOTcvYSBwdXQKZHVwIDk4L2IgcHV0CmR1cCA5OS9jIHB1dApkdXAgMTAwL2QgcHV0CmR1cCAxMDEvZSBwdXQKZHVwIDEwMi9mIHB1dApkdXAgMTAzL2cgcHV0CmR1cCAxMDQvaCBwdXQKZHVwIDEwNS9pIHB1dApkdXAgMTA2L2ogcHV0CmR1cCAxMDcvayBwdXQKZHVwIDEwOC9sIHB1dApkdXAgMTA5L20gcHV0CmR1cCAxMTAvbiBwdXQKZHVwIDExMS9vIHB1dApkdXAgMTEyL3AgcHV0CmR1cCAxMTMvcSBwdXQKZHVwIDExNC9yIHB1dApkdXAgMTE1L3MgcHV0CmR1cCAxMTYvdCBwdXQKZHVwIDExNy91IHB1dApkdXAgMTE4L3YgcHV0CmR1cCAxMTkvdyBwdXQKZHVwIDEyMC94IHB1dApkdXAgMTIxL3kgcHV0CmR1cCAxMjIveiBwdXQKZHVwIDEzMy91bmkwMDg1IHB1dApkdXAgMTczL3VuaTAwQUQgcHV0CnJlYWRvbmx5IGRlZgpjdXJyZW50ZGljdCBlbmQKY3VycmVudGZpbGUgZWV4ZWMKgAKNFgAAdD+EE/NjbKhan/77ULS7JzAqXMCrbi+Vm/INMgw3PCEo0KDOcHKx9nKgqjjDwOzrBLRMsXShwxYS1x/6IMkJVCVjeDcveVsL8pQfQ38Fn0GuBZjABRX+8YczNVfzLOMqnufUurZdpTQ/knB+LPzz6M5Eblraw5/Dfs5ktos1bODXEPRbHn8s12iryhQ2CDZodhoQCUZBYtBUwfa/LEajGbPGZFKHYxbBOpJkVtNmKVj9VnQNWFZzbmEE+BPtMZFWd3k07rHFRFrmv27lnlsZcItCh9tLm6+YgpGrwG/ed/zDHuFzCpT7xs7MdEpZqfajjiw9JKNtvO6XgdQ7y2rxwhv69q6/DIarClaEsha9+rFXfYTEkK8BcaUY1RI7beRwxnGx8Mt8pafG9aKKUpeQEJnqFv6Bk9Kz6/t+fAPkHdv8KUIErVw3AxMUFg63Ti+yeRa+1QQ7vDTTkV3O3Obim9olUKuQDhfmH2uWx+K3iBXFqwCLQTC/S/W/LDn9UCsxsphc4HA1txBMdO2NO8rPec0i5GLWOZZI5tOxhUsjPXLloUXLWOkU3I0wBTXW8TlAV2yBn+EPJ4XV14tyCoWHanYChLFqYcChHUHj+0GKluGz0gfPNQ4xf3u6+jyJLmvDFxiNxtSNAud0yBZx12ouXbVSeHGYXWk84KA/Sus2DDbG/E6H+kx2MfnEVMz2yZm/lW6a4w5Pevvdoxfj9BMLm1dBkDCxHQsjw1dbv7yBz3j6kibdv2I4JFxLoEW8qsxcH2SXXgJpM3KrNQlPRIqq8IKmxH3ZllsL/QQ8YJFg+KJjygCl9QOmrL/1FXx/JXmx0m6ynXaUfF1PwtiP7e1ISNfaExaiL1C9OtTK2T4h2WhRPW57ycPj/dYRfjKD7OvXXYQ+Co+s+jCWDRpbwGTLlDP0XQFMBNxx4cBogjdx6ouFfm8lXgfeQf/GC0CtQolv6YH1O06mdXeZ1hqAFwHALulGBr2WdAoV9wBD5SBSeMeIV3waNCP5P0xB7rP7uXTZv/oscgXK/61/3tsjyAXyZASQxvMf8uyWsThQA9TTEOM1o28z9bj6Yhs0Snwl2CxemFy3xgyidcNyBDRsCDFwYKjsejtr9sZGIXAFJK2djcN8aUa549kahghsM9NAB65fQFOwjWjPAZEnunfOsU/LXlWLjpPdul4+P/iseq37udumJc/dZMXm6KXDL6pesrEVc80hrFtnnPWTyaNUP1im/rQrwZvDnVJ0Yvg5XSGo6crcpdPE5pUviEVHB2W8aCI8W+2QrxfIXdN8g4bPW7FEjuoe424XoHpyyIkD1+0MyVNgCVywIoFjugUfAu5NKoFo+7+WyIvtrHlgEuMjEK70a2RhFp7wVuod4VD0EHJ+MWXUglKomSB7mA07KQiQDck++iAwwPmxKLmUdUItfeOcEji8RBoUkcTu9YuNij22HrsBxawVzE8Yz/ZRKqlbHpuuRHao7z2gIobOg8wHb/+lMC1o4vjwayYLSNfFyvf6XivjCkz2KUQlrLX+8WyTVA6JDHsI1xfhI+kr3NTJ2fZBKweobTge72fpGuiVEjV82l52w9UZBH9P70XJUqd1lYIstqLN+mDdVSJ1axsp9sDufLMEFWX9xUlCOyAdOefz02cniXnJcxIVdH8q01OLa5jxMlJ+CBeXO0D4j+r7qY8ZCTyeRT9eEpAykqEajhOoZPjhjtMlw5jgyZJ9COaM30bC3coKF93YSmRQaIkE9b1kw5dGlFvpGGYL4bAzo0SNSkIO00So24z3TISF9aJ1ssBn2072KoV99O/5QN5cWKdDvaSFkMJp0YFRHXNNHe1Zo0kV5Shq0uEygfikR1XDyuLuiycQSHWnFxVr2xSaMnA5CfKwfQu8hQ5ljap6spe1+Qh6Am4TkDa/CaO1QlQ03mRUcyyxFwGZJljNAkI7mVgG6DUlxxVSK8wJMH7otzpS0L2LYTHTG6LV0iXQBjNB4wuH5LqyqTgsiA8x7UASJFYY0RJGrD9moFp/ON0t+NPT6Rfw3Semq239oYpxMQr/mHkHfExaIA0AX31DjfMqWzj4bypd8B9zZFvOogC2EHPobmhYhjzFcbMdVXwnAENC0EVbEMdLzDQFeSFRpDwF6MJ5CyqFS4wD7PsyF/aVlPwi0rLnr6+xygmhFhtpsOi/zVT8qT0BCWBG4+9UZIh6MfLm+JWkLNQcEGmhTglxzIhntDTZkBO9MkYhs2vOM9pAWS9Pjcba8OR6+aiVMOZVReGm7FH3BixWPTHOeqMGpZYH09MRTScHecT7G/TgiZIcUReqM7OdmyExBR2IJ0tLuaEuHxyn7SC5Gdlcf9mL9Kz15sZFzTkZMjJAtCOTPMaHq/0eQIr/Ln1YMDd6O+ApErFrIGDQd4hBA2H8tIZMIuSct/KMzwj83QiB+wvvF/ec6vJCSEjU7FPayLiPt9ELxOKC0p3+k4wfc4PCX0VLozKllmEQ2+m7gkcI+mvWXGkjziNZtg7HsgEZbRTjH2H8LuaonHwNzpASWjt8e6deQzOglya7sRNKamea3s1oGPx1ZAZmGs5EZGtW0wT7h7WbQkM0Pv0Xcmb2d+0MWyOpvThTQOqog9wOrBZp8WQwFMbimf5h3nqrmgeRcmQL5YGrA0lLaShxIB9fiC8RBJ2ndEs8vW4MJU3u95ZJmQUwTDewI2WhsgV4CG9t74y790nLu/OWuRtm83j6FLEvtmgs0fMoE0WAtqrbzB2BLblT4GN7VXbZSE7K8B+zPTlx2Lw1mH4AwW0RK/6Hl6P8Y2KMsVSnLDDhKXxXSpaQQiiMV6lGAT4JLO9dh4cSAl0KVseZ62jLfcpN3T5UpiNAXr/OMqe0Vki/TLdwUCbfNL606j7Ki8v84s/ob3kaoYzKE5HDhgxKRYkd5NXmT321GSDdGW5OG4J5kwcF7KgJ7lY4HwLAkumbF4oMWMDz3FYRK5BxlYA65pSMxhCYKV5XMg2cPDPpLj8S55CI0Nq8WX8vnIY8JhSA2nbnTwzrSU30sN6BpXPILan6UBbNn91PgLOawA9Qnqebuq3BwqHOYAFecMIf3W/70HZ+iFc87AiEPK7kmn2Fm4az69PV3jVBZlIKAYGUHQvTm3+KYnNEGKSoOLB0bUGhklOy3vnbCuZt7Z2i0OpM2d7J9SqaCF1qrmIItsPKwGI6E1XyOhs1pVMwbWUzwHh4EU/wvU0bmcMinR9PWfvyusq4wUeP/rSQoRd7TfFNHZaCg9HJkgDdtjcTjpPBv/SPMNahf6KdknrkRunKE1+XxvdjKxo+7DXcijK8kPwDB5ZAv//BxZ6NEkippShPuCXnlP6huGWMNaM4Ascw+BU3R5P6SHODlrafn48qAqemBBnoUfmCw2mu+su+agNtVYx5MEacrmpyZGaQizFF/IAygncdllch8YCF6upwv0J8ehKxqIrdB5EpS8NwVmSl9HnL4Xkob5/T/PzCK5wCZYkECwKZEF1atSrcoKBeIHzn7FsCGLNDU7WPEseSYZvRNOUmunflZDysYSLBf7XMKkeaLijeB1qrD4P4fone9c9g1KrdZO597AT3DFfL/fTuKfvzLFS2dFJW3JxBhtIAEbVyd7hhE1ik1QulOOh7ZyPiuu60urRcrGU+fQVbXtdCVCZ+NMn/gvFbipQ+4w4Ry8xfBpyWQrIFTyzQ/hyBgecQnA7iJhrSiV56aCErXrHDhNCXvApKd9+rUB6w8Ltrp2ag/AIn3jA414KjLwvcvh2ztTYW9kGsA9c/TQYKYXrgbaWoSd7Z357cmY9I4UOEVad3Fxk8QZ2zWFdvydAyOrGU+7lo6fvirobuADWo1P6/4BSh7ZdzHxs5s3RvDAYrWwoO/WpmMdWzF5RvAXKXXcYhme5QBalZw270QjmB3VOvaZLQgkBFYV/USdi2Pl5yJRxmeRLHxW+9U3gi/vUxowUiFPaJ4hjgzuogct3zF0oJ3ZrSamVut85DZC88fY5RdC/GR53FR+nt51wzu+PPjh2UtQgZTdTD4tfmZ8MGc2BaHiQ+yhEPpXWi2sfkFwkVlOMnHrJOFwKil0Uy8OoHHiDlSQNX22YinDSmcY8silpqltMmVnibm4mQodIocSfNY+DMA6v5oiFFsXUCEiS5P8975OihDJIokTGt4E/z7VQag2vChKPSEMaK6NIhQjGn1qAVq26MDnXkLe1ScmDDVhdBH7F9OiPdGEoGz0R/EHqAiPC6LaGByJwvKm87QgQ0bP/CIWKAGOmV9b9GV18G8nN4+T1xu4bcatp+0RzLNXxPXBMvFYBDvhBv0JqM1Bzkff5VHc8Cly7qfWJ9GPfghDC1cdFtXf/qNzdrCNvEeT5BloKFZ6s7vkDEfGPLqgMxt5T3ywQPJhdh0J5m7HurwNA+BwBycoPts7h33elU2NlSNe7iRbTViFFLirJdYGSlZaelccnNqAJEWC55V5gxbZiA+nym/7KRlEeUpFmLtFBBPKHOsbhK5uNWw2w2cCCJuwlC8FcLoqsGaykaQimUJNrg4r5lDLwcdIPslHivyRywMP4f/rr509DL/ZsvrEZHXpC1UHiuUnpoYp5uD8Sd5t7TCG1pKC5Wqw6QnE3j5Ra0Zd3WaY9MJkTtmj5zAmPvBWtda/uhdM++vqUD5pm2FkmZjpcxdQ+Dw2ebN3eOKQsDcRrNc07d8qWC2XkqAxyolN21qFg4FBcM68Szc1/50XwOK8QyEBhG24XJbMDfwTGOtzKCExUaTje30HoD3Nzzee39rTe8t3aQJ56VVEdDPBsxqjrYHdbEPJFqwRSExlngpbIWjOiEyWu5YbcX0cQgk/TSlnRGV16o9pg2qBbcvWm5gpPZ0Kj3QrxPpmJIUqq6tYoc2zt2LZUbrTnopjvISz8+fm1jIQJt2vpRgnwLwC9uAsf3vBEoZvnxGQKVsG+1B6uVnlK4hKB0retrDEbdcGGpiACMc8IuXH+vQztfpFYR8aCY79MpHm+oHiIUWsBiosbWoYNOZv1D3T28W+A3xBrKABzqhwvymGnMrec/JzNPObaj4szJYJegxC7SyWuNbA8Je5xNon8SKM9KvtSh6MWDOhOMk4eTOyiuwUpUYRiMpazBdMe0msnhuE2qlRvQC08QaDEUZMN+EWEX63wnjN6CfXw5qIdlAHoG9ZypCQy7G3mYVqYLfywMdFBKE7JY+u31XsYp7UNuRkKAN6VGQux6Qym64jGLBO5M5gvzIHmUluXR+y9D6SzcOtocea4Y9/YXggV1MWSmW2dq7hvV58ZYbix1wWwuv10uG8OIUwiaMet6vVag6bIK1RG+7yPB3caz9gCcqoXnU4zlHNYqu6Zcg3226k91SSDWcvy5fHoKSZOtSwkIEb0m+dJURp7QFJ1AeuWoy6oxD6xAM995YBRyLCX3N9gHGiJZ33BbKq85oGrzQN8SeXs6j8+FrglsRqcjvdk7vgZCLRl7qcWsmkFXCzikZsHPn2stZMJm7bVfILwdMTF4A42iV9wy1idF4qXYzAZHLdEP9BDpdGMKRiICY8avlTv0nYMW1qgBz4cXrdmSrBTPV4Ts5/3yDP44/foH/rju3wLoWprGkQMU1cNj66iCCuKnhExh/bRb40wLE1N6H86Le9WYBUbJEJA5Knx3ELAboZ2xK+e8zK2jPZdcv1AGGfPE7V6G7/7YCOepiP4cv+RTru77QaND/sf+eX1N+pb8WDxgTMPQ5/AJeibBWmEO7zw+L8CBY+rAphiofoUzY9U32dBwf82tdPDwvqrtik+HqZfG74h6We9fRJrfUjR3J/5g7P8IpcJAI7XQ6N7IvujSTMCtDtOd5Pf4mzuvFj/y3A5cLXuFT8wvqtm+BaIMLCe0lgWg4h6vtXEeKGmMsCVnZP16QiuaftHgo71UaXH18Z/rafUcV1TirxHs9ddST6hNPZ31IMPVt6L2Z8p3ucsMRPjlqY4SpYjQClVEiUc6R2FPbGstgmH/OU+uDx7oNhRgFV91/h3p/9klZ1PXOHWzTtPN91bKkITWttjft16yhKkY9Qi2vXG/f8BdyNenjFoUHATcsr4n9UtjNFBIptLX7UQFf4KkNnbyeKV1Cqdl3L+NEz8/gXBeAXJgEEHNRBjz9sQLiyj82rL4wgonrKDtxvVRCBVOc3g2BYdnqsKpe7be5GFrhxyYIufRfj64AVfn9tExQC4y7NoQcMUCXHcDXSQaO4DI5kh4hWftJhYRQciNx7okOXWgQakxRz0BLMquW2zr16Eh+a1wMV+RRRbnOQUrdSuOptLp0HeXxDPBmd23mb+o9EaBZopKJcsZ5uVRnRPG5MpSDZBX/dD+ZcFhNxAkwftTJGxbHU2FvDZxZMau4ORlvRpe0jQqK0KAPjVhxygj+efvJhwqE7SjMk92H8tSlUcJNKTPRWlbzC+nXIfQmrUKWHB9WkJYPkygDNksMh29qtDKBoTrPFKd8TjtqAmPPYOARdnuOZ5GBLvk29+HuyIxm1reGzc0gAVPFM4+a5KuvdXP5RDQsfOYhrjfhryXiSjnafEa4Vr8bQV4tCrvM1wB6GwJNUMUIOLnZMKC1Wpa42CVKIjTsED1U11qk0c/z2pdQSW8bkze+S96EspK6YwFRpG+l2w57H45pXKCM/OtEoUFAsNYp0aUI03VLX0vayOPXwZjxfm0Sbxw8GlVveOcDjxP9PubGwJWB3zThbP3mWiciTTtQYHzJ12nStPUWrHe09we4wUPO5jzfTMVhXA/IGP6+xomVdm6BR6Iffn12RP9G+HUeWBB/vSHCL6FMcBSGEKo8kX9sVT43WPthgSJGxH+5cxSVsRZSpa3WEwJI7W6R30TpkUmhLMOROdMF9Oh6+G+73HC6kdt27xFupu9ZkFRCBxpa/QAQxLUKMekm90PTVMdiWBALcRG/5a+GbCJsEwasen3e8NWD8CDFqPPeDNQEhkDNzaWbvtiNttHV9ESmFC5Ty642U6taS7g3yI/aeMBjh6zebr+UmXv17XeNyO6N6KJBOstv8Ry1f/TmkuuQm3fXu3n99fkb5gLZUHIvUuQ+Q3vTnWrPkCt2Ezbp125iAKvlRyhk1pXLvrr/EA1OhtaGnLqEeq5XqBpwh6StXPQXk9qfZT9wNzhylhcM929FxVeGolbk+68k//XdoJhQg4nxUqYBavhqCEpNTvL+tCJP/DOX4MSAH+3VYuzPQGp03X4exr4V3CKf9vCE6BUiBvHjDic5quOPsKCg8oYqU98UUr7f8aF1IwzW5woFt5CcScIS7mxk93T9ZB3WasKAPuMgV97OniMMOLqV1q6x5g1kHT67a7lQG3t1rPIFzDu/YvRh0ro/ldnLOAG7kgcZgBxG+GUlSMJMFzA51cKCE6zulbDK0U4lGyF+0fQzK5J7JGySCNyspkbL2KoioJJPWZ9kEggqZlKQk9ps0HQbBLNKkad1ZVIyuJHrQTddcr6SB8TnUI+FEH9/dyBpfXAx3XCL9xWWSqzEsQ9h24a+oRnfkm9lEQDrR9YpPyFavVP2QhljRuQJ6TXwqrrBe0LbEL7kn3st3w98B99u4MtdP/mbeSDjk5/8iYKLsilg30/mllHfbIv8kue12+JmZJo01gCc+Dehm0rlMPMxeqqrCKlXj5n5FerqqPfkNs/rKfXFFlgu5cl/cBKqP17G4xLPLOLA7wHfabHXZB0vQDeE9SpIAZPmzR9VjXx/quSDUV8p4ABFQIAAAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKY2xlYXJ0b21hcmsKgAM=";
public static void main(String[] args) throws Exception {
diff --git a/test/jdk/java/util/TimeZone/TimeZoneData/VERSION b/test/jdk/java/util/TimeZone/TimeZoneData/VERSION
index 76d146afc713..2f72d7dbcb24 100644
--- a/test/jdk/java/util/TimeZone/TimeZoneData/VERSION
+++ b/test/jdk/java/util/TimeZone/TimeZoneData/VERSION
@@ -1 +1 @@
-tzdata2025c
+tzdata2026a
diff --git a/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java b/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java
index 9bdf4dbfae82..eea0a969e774 100644
--- a/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java
+++ b/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,8 +51,8 @@ private static Dimension test(boolean w3ccheck) {
htmlPane.setEditorKit(kit);
String htmlString = "\n"
- + "\n"
- + "This should be 16 pt.
\n" + + "\n" + + "This should be 32 pt.
\n" + "\n" + ""; @@ -71,10 +71,16 @@ public static void main(String[] args) throws Exception { System.out.println("size with W3C:" + w3cFrameSize); System.out.println("size without W3C:" + stdFrameSize); - float ratio = (float)w3cFrameSize.width / (float)stdFrameSize.width; - System.out.println("w3cFrameSize.width/stdFrameSize.width " + ratio); + float widthRatio = (float)w3cFrameSize.width / (float)stdFrameSize.width; + System.out.println("w3cFrameSize.width/stdFrameSize.width " + widthRatio); - if (!"1.3".equals(String.format(Locale.ENGLISH, "%.1f", ratio))) { + float heightRatio = (float)w3cFrameSize.height / (float)stdFrameSize.height; + System.out.println("w3cFrameSize.height/stdFrameSize.height " + heightRatio); + + float avgRatio = (widthRatio + heightRatio) / 2.0f; + System.out.println("Average ratio of two dimensions " + avgRatio); + + if (!"1.3".equals(String.format(Locale.ENGLISH, "%.1f", avgRatio))) { throw new RuntimeException("HTML font size too large with high-DPI scaling and W3C_LENGTH_UNITS"); } }