Commit graph

8369 commits

Author SHA1 Message Date
Werner Lemberg
c6106cffe2 [autofit] Use new y extrema arrays.
* src/autofit/aflatin.c
  (af_glyph_hints_apply_vertical_separation_adjustments): Implement it.
2025-04-15 12:45:09 +02:00
Werner Lemberg
8d49ccd672 [autofit] Provide infrastructure for storing y extrema of contours.
We need this for better positioning support of diacritics.

* src/autofit/afhints.h (AF_GlyphHintsRec): New fields `contour_y_minima`
  and `contour_y_maxima`, together with its embedded variants.

* src/autofit/afhints.c (af_glyph_hints_done, af_glyph_hints_reload): Handle
  new arrays.
2025-04-15 12:45:09 +02:00
Werner Lemberg
53a5e2e65b [autofit] Avoid crash.
Reported as

  https://issues.oss-fuzz.com/issues/410609442

* src/autofit/aflatin.c (af_remove_segments_containing_point): Check `edge`.
2025-04-15 06:58:52 +02:00
Werner Lemberg
558bde6e39 [autofit] Fix just introduced heap buffer overflow
Reported as

  https://issues.oss-fuzz.com/issues/410393975

* src/autofit/afadjust.c [!FT_CONFIG_OPTION_USE_HARFBUZZ]: Synchronize with
  HarfBuzz code.
2025-04-14 21:37:18 +02:00
Werner Lemberg
ae3879c0a1 * docs/CHANGES: Mention Craig's GSoC 2023 project. 2025-04-14 06:51:01 +02:00
Craig White
24ac6c5d6a [autofit] Add GSUB table handling to reverse character map generation.
If HarfBuzz is enabled, the reverse character map generation now considers
GSUB entries when looking for glyphs that correspond to a code point.

* src/autofit/afadjust.c (af_all_glyph_variants_helper,
af_all_glyph_variants) [FT_CONFIG_OPTION_USE_HARFBUZZ]: New functions.

(af_reverse_character_map_new) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Call new
code.
2025-04-14 06:50:00 +02:00
Craig White
771449f14a [autofit] Add tilde-unflattening algorithm.
* src/autofit/aflatin.c (af_find_highest_contour,
af_remove_segments_containing_point,
af_latin_remove_tilde_points_from_edges, af_latin_stretch_tilde,
af_latin_align_tilde): New functions.
(af_latin_hints_apply): Call tilde-unflatting code if necessary.
2025-04-14 06:50:00 +02:00
Craig White
7099b09e96 [autofit] Implement vertical separation adjustment.
* src/autofit/aflatin.c: Include `afadjust.h`.
(af_latin_metrics_init): Call `af_reverse_character_map_new`.
(af_latin_metrics_done): New function.

(af_move_contour_vertically, af_check_contour_horizontal_overlap,
af_glyph_hints_apply_vertical_separation_adjustments): New functions.

(af_latin_hints_apply): Call
`af_glyph_hints_apply_vertical_separation_adjustments`.

(af_latin_writing_system_class): Updated.

* src/autofit/aftypes.h (AF_StyleMetricsRec): Add `reverse_charmap` field.
2025-04-14 06:50:00 +02:00
Craig White
14ac6140fc [autofit] Add code for reverse charmaps and adjustment database lookup.
* src/autofit/aftypes.h (AF_ReverseMapEntry, AF_ReverseCharacterMap): New
structures.

* src/autofit/afadjust.c (af_adjustment_database_lookup,
af_reverse_character_map_entry_compare, af_reverse_character_map_lookup,
af_lookup_vertical_separation_type, af_lookup_tilde_correction_type,
af_reverse_character_map_expand, af_reverse_character_map_new,
af_reverse_character_map_done): New functions.

* src/autofit/afadjust.c: Updated.
2025-04-14 06:50:00 +02:00
Craig White
c46ebd7650 [autofit] Add adjustment database.
* src/autofit/afadjust.c, src/autofit/afadjust.h: New files.

* include/freetype/internal/fttrace.h: Add 'afadjust' component.

* src/autofit/autofit.c: Include `afadjust.c`.

* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afadjust.c`.
2025-04-14 06:50:00 +02:00
Craig White
f0660df3a9 [base] Make find_unicode_charmap a base function.
This is needed for forthcoming changes in the auto-hinter.

* include/freetype/internal/ftobjs.h, src/base/ftobjs.c: Updated.
2025-04-14 06:50:00 +02:00
Alexei Podtelezhnikov
6b6b643f7f * src/bdf/bdflib.c (hdigits): Removed.
Fixes #1325.
2025-04-12 15:06:59 -04:00
Alexei Podtelezhnikov
5416689d95 * include/freetype/internal/ftcalc.h (FT_MSB) [__CC_ARM]: Added. 2025-04-12 12:38:01 -04:00
Alexei Podtelezhnikov
58b3598c2a Typos in macros.
* include/freetype/internal/ftcalc.h: s/_M_X86/_M_IX86/.
* src/truetype/ttinterp.c: s/_M_X86/_M_IX86/.
2025-04-12 09:18:16 -04:00
Alexei Podtelezhnikov
f0acd2038a * docs/CHANGES: Updated. 2025-04-12 08:41:27 -04:00
Alexei Podtelezhnikov
c88bf8a216 [base, truetype] Silence UBSAN.
* src/truetype/ttinterp.c (TT_MulFix14_64): Use unsigned multiplication.
* include/freetype/internal/ftcalc.h (FT_MulFix_64): Ditto.
2025-04-11 22:58:26 -04:00
Alexei Podtelezhnikov
fb99fd63ec [base, truetype] Synchronize MulFix assembly.
* include/freetype/internal/ftcalc.h (FT_MulFix_*),
src/truetype/ttinterp.c (TT_MulFix14_*): Synchronize routines.
2025-04-11 22:57:27 -04:00
Alexei Podtelezhnikov
9175373673 [truetype] Modernize bytecode projections.
With 64-bit platforms widely available, it is more efficient to use
64-bit variables readily. It results in noticeable 10% improvement
in glyph loading speed.

* src/truetype/ttinterp.c (TT_MulFix14, TT_DotFix14) [FT_INT64]:
Prioritize available implementation with arguments adjusted based on
the use cases.
2025-04-10 19:58:48 +00:00
Alexei Podtelezhnikov
9a394e2dd1 [base] Update FT_MulFix inlining.
Resolves inconsistencies in 64-bit multiplication discussed in !355.
Importantly, FT_MulFix arguments and return value is FT_Long,
whatever sizeof FT_Long is on 64-bit platforms: 8 bytes on Linux or
4 bytes on Windows.

* include/freetype/internal/ftcalc.h (FT_MulFix_x86_64): Removed.
(FT_MulFix_64): Generalize and prioritize the inline implementation
for all 64-bit platforms ifdef FT_INT64.
* src/base/ftcalc.c (FT_MulFix)[FT_INT64]: Call 'FT_MulFix_64'.
* src/base/ftbase.c: Include 'ftcalc.c' after the FT_MulFix callers
to enable its inlining.
2025-04-09 16:09:01 +00:00
Alexei Podtelezhnikov
8f67545d72 [base] Update FT_MulFix inlining.
Resolves inconsistencies in 64-bit multiplication discussed in !355.                                                    Importantly, FT_MulFix arguments and return value is FT_Long,                                                           whatever sizeof FT_Long is on 64-bit platforms: 8 bytes on Linux or                                                     4 bytes on Windows.                                                                                                                                                                                                                             * include/freetype/internal/ftcalc.h (FT_MulFix_x86_64): Removed.                                                       (FT_MulFix_64): Generalize and prioritize the inline implementation
for all 64-bit platforms ifdef FT_INT64.                                                                                * src/base/ftcalc.c (FT_MulFix)[FT_INT64]: Call 'FT_MulFix_64'.                                                         * src/base/ftbase.c: Include 'ftcalc.c' after the FT_MulFix callers                                                     to enable its inlining.
2025-04-09 13:37:23 +00:00
Graham Asher
fc67794e15 Missing header wrappers.
* include/freetype/config/integer-types.h, src/smooth/ftgrays.h:
Add missing FT_BEGIN_HEADER and FT_END_HEADER.
* src/smooth/ftgrays.c: Cosmetics.
2025-04-04 19:54:50 -04:00
Alexei Podtelezhnikov
82090e67c2 [bdf] Clarify callback flow.
* src/bdf/bdflib.c (bdf_line_func_t_): Modify callback prototype.
(bdf_parse_*_): Updated.
(bdf_load_font, bdf_readstream_): Delay callback initiation.
2025-03-26 00:26:55 -04:00
Alexei Podtelezhnikov
7ede732490 * src/bdf/bdflib.c (bdf_readstream_): Relocate. 2025-03-25 22:03:23 -04:00
Alexei Podtelezhnikov
56b53a86e0 * src/bdf/bdflib.c (bdf_is_atom_): Do not check tabs. 2025-03-25 21:23:46 -04:00
Alexei Podtelezhnikov
7ddb53fcac * src/bdf/bdflib.c (_bdf_strncmp): Macro removed, callers updated. 2025-03-25 21:22:52 -04:00
Alexei Podtelezhnikov
5d4e649f74 .gitlab-ci.yml: Minor. 2025-02-26 15:35:25 +00:00
Tim-Philipp Müller
316bdc96ce * .gitlab-ci.yml: Switch to arm64 runners for macOS CI. 2025-02-26 15:32:27 +00:00
Behdad Esfahbod
d0c905c62a [sfnt/CPAL] Return early if user requested currently-set palette
Before, we were loading a palette (again and again) even if the
same was requested. Even if the font only had one palette...

For a font like NotoColorEmoji that has over 5000 colors in its
palette, this was dominating the COLRv1 loading times for HarfBuzz
(and I believe all other clients) because they have to set the
palette to get access to the colors.

* src/base/ftcolor.c (FT_Palette_Select): Check the current palette.
2025-02-24 19:13:39 -05:00
Alexei Podtelezhnikov
b1f4785087 * src/bdf/bdflib.c (bdf_parse_start_): Move setup of properties. 2025-01-28 22:49:21 -05:00
Alexei Podtelezhnikov
00a1567a13 [bdf] Treat all comments uniformly.
* src/bdf/bdflib.c (bdf_parse_start_): Reject fonts with initial
COMMENTs.
(bdf_parse_properties_): Skip COMMENTs so that...
(bdf_add_property_): Do not make exception for COMMENT.
(bdf_parse_glyphs_, bdf_add_comments): Updated.
2025-01-24 22:36:56 -05:00
Alexei Podtelezhnikov
fdae51ccb0 * src/bdf/bdflib.c (BDF_SWIDTH_ADJ_): Remove clashing flag and update. 2025-01-24 22:03:00 -05:00
Alexei Podtelezhnikov
bfe793ccec * src/bdf/bdflib.c (bdf_atous_): Remove unnecessary checks. 2025-01-22 21:17:57 -05:00
Alexei Podtelezhnikov
40a7458500 * src/bdf/bdflib.c (bdf_ato{i.ul.s.us}_]): Remove uncecessary checks. 2025-01-22 21:05:22 -05:00
Alexei Podtelezhnikov
56131e4216 [bdf] Postpone font default char handling.
* src/bdf/bdflib.c (bdf_parse_start_, bdf_add_property_): Delay handling
of the default char until...
* src/bdf/bdfdrivr.c (BDF_Face_Init): ... handles all other properties.
2025-01-22 20:47:56 -05:00
Alexei Podtelezhnikov
8bae87065a [bdf] Postpone font spacing handling.
* src/bdf/bdf.h (bdf_font_t): Remove `monowidth`.
* src/bdf/bdflib.c (bdf_parse_start_, bdf_add_property_): Delay handling
of the font spacing until...
* src/bdf/bdfdrivr.c (BDF_Face_Init): ... handles all other properties.
2025-01-22 20:46:43 -05:00
Alexei Podtelezhnikov
c0a7839e7d [bdf] Postpone font ascent and descent handling.
* src/bdf/bdflib.c (bdf_parse_start_, bdf_add_property_): Delay handling
of the font ascent and descent until...
* src/bdf/bdfdrivr.c (BDF_Face_Init): ... handles all other properties.
2025-01-22 19:11:47 -05:00
Alexei Podtelezhnikov
c33da8fbbd * src/bdf/bdflib.c (bdf_parse_start_): Relax the header order.
We now check that the header is complete in no specific order.
2025-01-22 16:59:44 -05:00
Chad Brokaw
a059b237bb * src/truetype/ttgxvar.c (tt_face_vary_cvt): Fix all shared values.
Applying cvar deltas to all shared points was incorrectly omitted.
Fixes #1314.
2025-01-19 22:39:17 -05:00
Alexei Podtelezhnikov
b9e09e33fe * src/bdf/bdflib.c (bdf_parse_glyphs_): Fix tracing. 2025-01-19 12:35:13 -05:00
Alexei Podtelezhnikov
01c22b3668 [bdf] Tokenize input instead of listing.
Instead of cumbersome field list mamangement, we will tokenize input
using custom `bdf_strtok_`.

* src/bdf/bdflib.c (bdf_list_t_, bdf_list_init_, bdf_list_ensure_,
bdf_list_shift_, bdf_list_join_, bdf_list_split_,
bdf_set_default_spacing_): Removed.
(bdf_strtok_): New function which NUL-terminates the first token at
the delimiter position and returns the next token that follows
consequtive delimiters.
(bdf_parse_*_, bdf_load_font): Updated.

* docs/CHANGES: Claim overall 75% performance improvement.
2025-01-19 11:19:10 -05:00
Alexei Podtelezhnikov
ad7dce7751 * src/bdf/bdflib.c (bdf_parse_start_): Prevent another STARTPROPERTIES.
Only one STARTPROPERTIES was permitted in the old flow preventing
leaks and overflows.

See https://issues.oss-fuzz.com/issues/389968131
    https://issues.oss-fuzz.com/issues/390464875
2025-01-17 20:54:14 -05:00
Alexei Podtelezhnikov
e3a3b39dd0 * src/bdf/bdflib.c (bdf_parse_start_): Do not overwrite flags. 2025-01-16 23:25:08 +00:00
Alexei Podtelezhnikov
d4631a2eb3 * src/bdf/bdflib.c (bdf_readstream_): Skip all control characters.
This agrees with specifications and makes the code a lot simpler.
2025-01-16 20:54:33 +00:00
Alexei Podtelezhnikov
02953326d4 * src/bdf/bdflib.c (bdf_parse_start_): Reserve space for artificial properties. 2025-01-16 03:47:14 +00:00
Alexei Podtelezhnikov
ae11e18cbd * src/bdf/bdflib.c (bdf_add_property_): Add extra protection.
See https://issues.oss-fuzz.com/issues/389972472
    https://issues.oss-fuzz.com/issues/389968131
2025-01-15 15:50:12 +00:00
Alexei Podtelezhnikov
a0d86e5650 * src/bdf/bdflib.c: Clean up. 2025-01-14 22:58:04 -05:00
Alexei Podtelezhnikov
a3c68e3b48 [bdf] Use flags instead of options.
* src/bdf/bdf.h (bdf_options_t): Removed.
(BDF_KEEP_COMMENTS, BDF_KEEP_UNENCODED, BDF_CORRECT_METRICS): Updated
to avoid collisions with the other parsing flags.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Use default flags explicitly.
* src/bdf/bdflib.c (bdf_load_font): Use flags as an argument to
initialize the parser.
(bdf_set_fedault_spacing_): Default to BDF_PROPORTIONAL explicitly.
(bdf_parse_*_): Updated.
2025-01-14 22:32:46 -05:00
Alexei Podtelezhnikov
a05c22103d [bdf] Adjust parsing flow and CHARS handling.
* src/bdf/bdflib.c (bdf_readstream_): Remove CHARS exception.
(bdf_parse_glyphs_): Move glyphs allocation...
(bdf_parse_properties_): and missing ascent and descent handling...
(bdf_parse_start_): ...to here under CHARS.
2025-01-14 21:11:33 -05:00
Alexei Podtelezhnikov
0864367ada * src/bdf/bdflib.c (bdf_readstream_): Tweak variables and loop design. 2025-01-14 18:39:50 -05:00
Alexei Podtelezhnikov
ee1310ab5c * src/bdf/bdflib.c (bdf_parse_glyphs_): Free unused glyph_name.
See https://issues.oss-fuzz.com/issues/389330334.
2025-01-13 17:19:31 +00:00