Commit Graph

8130 Commits

Author SHA1 Message Date
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
Alexei Podtelezhnikov f02bffad0f * src/truetype/ttgload.c (load_truetype_glyph): Rearrange. 2024-10-14 11:47:31 +00:00
suzuki toshiya 5f2abe76fe * autogen.sh: Fix for Solaris 10.
o Replace `test -e` by `test -d` (directory) and `-h`
  (symlink), because pre-POSIX /bin/sh of Solaris 10
  does not support `test -e`.
o Replace the combination of `head` and `sed ...` by
  single sed command `sed -n 1...p`.  GNU libtoolize
  with Solaris 10 /bin/sh complains "Broken Pipe" for
  the closure of stdout by `head`.  Let `sed` receive
  all stdout and discard.
2024-10-14 10:26:17 +09:00
Alexei Podtelezhnikov 089ccb1bfa * src/smooth/ftgrays.c (gray_convert_glyph): Clear stack pointers.
Fixes a dangling pointer warning, see #1299.
2024-10-13 12:14:43 -04:00
suzuki toshiya 5f20c89215 apinames: Fix a buffer overrun for VMS platform.
Some output formats may rewrite symbol names during the output,
like the concatenation of "64__" suffix on VMS.  To estimate
sufficient size to store symbol name, pass the output format
info to `names_add`.  For VMS, `names_add` allocates longer
buffer to append "64__".

* apinames.c (SUFFIX_VMS_64ADDR): New macro of "64__".
(main): Pass the format info to `read_header_file`.
(read_header_file): Pass the format info to `names_add`.
(names_add): Receive the format info, and reserve the symbol
name buffer 4 byte longer in the case of VMS, to append the
suffix in `names_dump`.
2024-10-13 21:18:47 +09:00
suzuki toshiya 26b545f368 apinames: Fix out-of-scope reference of a static array.
* apinames.c (names_dump): For WATCOM_LBC format, the
  DLL name with no suffix is constructed on a static
  array temp[], but the scope is closed before use it.
  The declaration of temp[] is moved to the wider
  scope for the dumping part to refer it.
2024-10-13 11:39:14 +09:00
Alexei Podtelezhnikov 7c09421d83 * vms_make.com: Format rules.
Use tabs in rules only à la Makefile.
2024-10-12 08:22:51 -04:00
Marian Klymov b4ca23bed1 * meson.build: Define DLL_EXPORT for shared library only.
Fixes #1298.
2024-10-12 10:57:59 +00:00
Benoit Pierre 78ff353509 * meson.build: Minor improvements. 2024-10-12 10:51:25 +00:00
Benoit Pierre 34aed655f1 * meson.build: Fix `bzip2` option handling. 2024-10-12 10:49:46 +00:00
Benoit Pierre f4c2a44ea9 * meson.build: Add support for compiling with error strings.
* meson_options.txt: Document it.
2024-10-12 10:47:38 +00:00
suzuki toshiya 0dd4eef68f Fix help message of apinames.
* src/tools/apinames.c: The first header file must be
  given after the options.  All arguments after the
  first header file are dealt as header files to be
  parsed, regardless with their leading "-".

  For example,
  "apinames include/freetype/freetype.h -dFREETYPE.DLL"
  warns "unable to open -dFREETYPE.DLL".

  Thus, the "header1" must be given after the arguments
  to be parsed as the options.
2024-10-10 15:56:22 +09:00
Jouk Jansen c82745878d Minor fixes for OpenVMS.
* vms_name.com: Suppress a warning with the latest Clang compiler.

* builds/vms/apinames_vms.bash: Use absolute path to avoid dependency on the
  environment.
2024-09-21 06:41:47 +02:00
Alexei Podtelezhnikov 83af801b55 * src/sfnt/ttsbit.c (tt_face_load_sbix_image): Respect metrics_only.
Also fixes recursive flip.
2024-09-07 13:44:57 -04:00
Alexei Podtelezhnikov 3008032062 * src/sfnt/ttsbit.c (tt_face_load_sbix_image): Tweak loop. 2024-09-06 13:43:47 +00:00