Commit Graph

8144 Commits

Author SHA1 Message Date
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
Alexei Podtelezhnikov f219996754 * src/bdf/bdflib.c (bdf_parse_glyphs_): Store glyph as soon as possible. 2025-01-13 03:48:28 +00:00
Alexei Podtelezhnikov aab40d5cc4 * src/bdf/bdflib.c (bdf_parse_glyphs_): Avoid possible leak. 2025-01-12 00:24:42 -05:00
Alexei Podtelezhnikov bbc445e165 [bdf] Speed up bitmap parsing.
A dedicated parser of bitmap data with minimal error checking and
no string comparisons helps to improve performance.

* src/bdf/bdflib.c (bdf_parse_bitmap_): New dedicated bitmap parser.
(bdf_parse_glyphs_): Pass to `bdf_parse_bitmap_` on BITMAP.
2025-01-11 23:11:07 -05:00
Alexei Podtelezhnikov 4433c7b7ba * src/bdf/bdflib.c (a2i): Formatting. 2025-01-11 18:54:04 -05:00
Alexei Podtelezhnikov ff5872b4da * src/bdf/bdflib.c (bdf_parse_*_): Minor improvements. 2025-01-10 22:55:13 -05:00
Alexei Podtelezhnikov cf451e5ff3 * src/bdf/bdf.h (bdf_font_t): Correct `internal` type.
* src/bdf/bdflib.c (*): Update users.
2025-01-10 22:31:07 -05:00
Alexei Podtelezhnikov 8d536080ec * builds/windows/ftsystem.c: Fix ancient condition. 2025-01-10 22:44:40 +00:00
Alexei Podtelezhnikov 1f57020ff3 * src/bdf/bdflib.c (bdf_parse_start_): Fix tracing labels. 2025-01-10 03:23:41 +00:00
Alexei Podtelezhnikov 704d540527 * MSBuild.rsp: Force console color for mintty. 2025-01-09 15:18:55 +00:00
Heiko Lewin 1400b20ae8 * CMakeLists.txt: Use modern IMPORTED targets.
This resolves build problems with newer libPNG versions by switching
to using IMPORTED CMake targets for common libraries where provided.
To do this the required CMake version is raised to version 3.12.
Doing this seems justified as using IMPORTED targets is a cleaner
and more powerful solution that can leverage advanced and CMake-specific
features that may be utilized by the referred dependencies' CMake modules.

Resolves #1311.
2025-01-09 13:21:50 +00:00
Alexei Podtelezhnikov 73318c864a [cff] Remove size/slot checks.
After the previous commit, cff_glyph_load is no longer called
without first checking for valid size and glyph objects in
FT_Glyph_Load and these checks can be removed downstream.

* src/cff/cffdrivr.c (cff_glyph_load): Remove `size` and `glyph` checks.
* src/cff/cffgload.c (cff_slot_load): Ditto.
2025-01-08 15:45:32 -05:00
Alexei Podtelezhnikov c7a255b462 * src/cff/cffdrivr.c (cff_get_advances): Do only fast advances.
Otherwise, let TT_Get_Advances fall back on cff_load_glyph to do
slow advances. This avoids unchecked access to cff_load_glyph and
this is how tt_get_advances is implemented.
2025-01-07 19:52:29 -05:00
Alexei Podtelezhnikov 81330e1f8a * src/truetype/ttgload.c (TT_Load_Glyph): Consolidate flag setting. 2025-01-03 22:54:20 -05:00
Alexei Podtelezhnikov 5245fd69fd Delay FT_GLYPH_FORMAT_OUTLINE assignmets.
This assignmets used to be done prematurely before errors were checked
and outlines were actually loaded. Delaying the assignment provides
certain protection against careless usage of malformed input that
should now remain FT_GLYPH_FORMAT_NONE.

* src/cff/cffgload.c (cff_slot_load): Ditto.
* src/cid/cidgload.c (cid_slot_load_glyph): Ditto.
* src/pfr/pfrobjs.c (pfr_slot_load): Ditto.
* src/truetype/ttgload.c (TT_Load_Glyph): Ditto.
* src/type1/t1gload.c (T1_Load_Glyph): Ditto.
2025-01-03 21:26:10 -05:00
Alexei Podtelezhnikov afc7000cac * builds/compiler/gcc-dev.mk: Silence some warnings. 2025-01-03 18:17:49 +00:00
Alexei Podtelezhnikov 64f8b7fbd0 Remove superfluous outline zeroing.
This is already done by `ft_glyphslot_clear`.

* src/cff/cffgload.c (cff_slot_load): Do not zero outline fields.
* src/cid/cidgload.c (cid_slot_load_glyph: Ditto.
* src/pfr/pfrobjs.c (pfr_slot_load): Ditto.
* src/truetype/ttgload.c (load_sbit_image): Ditto.
* src/type1/t1gload.c (T1_Load_Glyph): Ditto.
2025-01-02 18:22:24 +00:00
Alexei Podtelezhnikov 10b3b14da2 * src/truetype/ttobjs.c: Abbreviate tracing. 2025-01-01 23:04:14 -05:00
Alexei Podtelezhnikov 1beb83fd12 * src/sfnt/ttsbit.c (tt_face_load_sbix_image): Refactor `flip`. 2025-01-01 22:28:36 -05:00
Alexei Podtelezhnikov abed051e06 [truetype] Consolidate bitmap strike handling.
* src/truetype/ttgload.c (TT_Load_Glyph): Relocate omitted whitespace
strike handling from here...
(load_sbit_image): ... to here.
2025-01-01 14:40:58 -05:00
Alexei Podtelezhnikov 4ef8eed11b [truetype] Ingnore FT_LOAD_NO_BITMAP in bitmap-only fonts.
For consistency with other bitmap-only fonts, we should ignore this
flag of the font is not scalable.

* src/truetype/ttgload.c (TT_Load_Glyph): Check if face is scalable
when checking for FT_LOAD_NO_BITMAP.

* docs/CHANGES: Start new chapter wtith this change.
2024-12-31 16:25:50 -05:00
Ben Wagner 38272bf853 [ftstroke] Fix invalid pointer assignement to `arc`
In `FT_Stroker_ConicTo` and `FT_Stroker_CubicTo` there is a `bez_stack`.
`arc` is initialized with `arc = bez_stack` and is never set to point
into any different object. The main loop looks like `while ( arc >=
bez_stack )` which is depending on a later `arc -= 2` (or `arc -= 3`) to
make `arc` point to before `bez_stack`. However, using pointer
subtraction to make `arc` point outside the array is undefined behavior,
and attempting to use the value in the loop predicate is "very"
undefined behavior. (C99 "Additive operators" 6.5.6.8.)

This particular undefined behavior was discovered as either hangs or
MemorySantizer issues after "[InstCombine] Infer nuw for gep inbounds
from base of object" [0]. With this change, clang can infer that `arc`
must always point into the `bez_stack` object and therefore cannot be at
a "negative index" so the predicate is always true.

[0] e21ab4d16b

* src/base/ftstroke.c (FT_Stroker_ConicTo, FT_Stroker_CubicTo): test
loop exit condition (there are no more arcs to process) before
decrementing `arc`

Fixes: #1307
2024-12-16 14:39:10 -05:00
Ben Wagner 59320b2d3c [cff] Fix leak of cmap data
When `sfnt->load_face` succeeds it has already loaded any (optional)
cmap data. As a result, a subsequent call to `sfnt->load_cmap` will
overwrite the cmap data pointer with a new copy of the data but not free
the old, leading to a leak.

This is a fix for "* src/cff/cffobjs.c (cff_face_init): Better handling
of Type0 fonts.". This still allows the cmap to be missing but avoids
the leak by only calling `sfnt->load_cmap` when there is no `head`
table (the font data is not being loaded as OpenType/CFF).

* src/cff/cffobjs.c (cff_face_init): Fix leak

Fixes: #1306
2024-12-04 16:55:10 -05:00
Honnesh Ramachandra 3f3e3de34e * src/cff/cffobjs.c (cff_face_init): Better handling of Type0 fonts.
This issue relates to the PDF specification and its usage of CFF-based
embedded Type0 fonts.  For Type0 fonts containing CID-keyed descendant
CFF-based fonts, the glyph index is the CID present in the content stream.
As a result, there is no requirement for a 'cmap' table to be present in the
font since the glyph indices are derived directly from the CIDs.  FreeType
throws an error when it doesn’t find a 'cmap' table for such an Open Type
font containing CFF outlines.  This commit relaxes this requirement for a
'cmap' table for such fonts.
2024-11-06 06:28:41 +01:00
suzuki toshiya 0ae7e60737 Download the latest gnu-config files in `make dist`.
* builds/toplevel.mk: In `make dist`, checkout gnu-config
git repository at savannah, copy the latest versions of
`config.guess` and `config.sub` to builds/unix/.  Also
the latest version of `gitlog-to-changelog` is used to
generate `ChangeLog`.
2024-10-18 14:08:19 +09:00
Behdad Esfahbod 1394436633 Move generic destroy to later in the face and size destruction.
* src/base/ftobjs.c (destroy_size, destroy_face): This is such that the
  generic destroy can be used to call `FT_Done_Library`.  For that to work,
  it needs to call it *after* having removed the face from the respective
  module.
2024-10-16 05:08:22 +02:00