1. 15 Jul, 2021 5 commits
    • Sarthak  Bhardwaj's avatar
      Added macOS builds for CI · 7985d9d3
      Sarthak Bhardwaj authored
    • David Turner's avatar
      [smooth] Implement Bezier quadratic arc flattenning with DDA · 56cc2ad4
      David Turner authored
      Benchmarking shows that this provides a very slighty performance
      boost when rendering fonts with lots of quadratic bezier arcs,
      compared to the recursive arc splitting, but only when SSE2 is
      available, or on 64-bit CPUs.
      On a 2017 Core i5-7300U CPU on Linux/x86_64:
        ./ftbench -p -s10 -t5 -cb .../DroidSansFallbackFull.ttf
          Before: 4.033 us/op  (best of 5 runs for all numbers)
          After:  3.876 us/op
        ./ftbench -p -s60 -t5 -cb .../DroidSansFallbackFull.ttf
          Before: 13.467 us/op
          After:  13.385 us/op
    • David Turner's avatar
      [smooth] Minor speedup to smooth rasterizer · 86b9c934
      David Turner authored
      This speeds up the smooth rasterizer by avoiding a
      conditional branches in the hot path. Namely:
      - Define a fixed "null cell" which will be pointed
        to whenever the current cell is outside of the current
        target region. This avoids a "ras.cell != NULL"
        check in the FT_INTEGRATE() macro.
      - Also use the null cell as a sentinel at the end of
        all ycells[] linked-lists, by setting its x coordinate
        to INT_MAX. This avoids a 'if (!cell)' check in
        gray_set_cell() as well.
      - Slightly change the worker struct fields to perform
        a little less operations during rendering.
      Example results (on a 2013 Corei5-3337U CPU)
        out/ftbench -p -s10 -t5 -bc /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf
          Before: 5.472 us/op
          After:  5.275 us/op
        out/ftbench -p -s60 -t5 -bc /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf
          Before: 17.988 us/op
          After:  17.389 us/op
    • David Turner's avatar
      tests/scripts/download-test-fonts.sh rewrite in Python3 · 5ec7f588
      David Turner authored
      Replaces download-test-fonts.sh with download-test-fonts.py
      which does the same work, and also avoids downloading anything
      if the files are already installed with the right content.
      Now uses the first 8 byte of each file's sha256 hash for the
    • Alexander Richardson's avatar
      Support architectures where `long` is smaller than pointers. · f7c6a06c
      Alexander Richardson authored and Werner Lemberg's avatar Werner Lemberg committed
      I am currently trying to compile FreeType for CHERI-extended ISAs
      (CHERI-RISC-V and Arm's Morello), but I am getting compiler warnings
      from the `FT_UINT_TO_POINTER` macro.  When compiling with the CHERI
      Clang compiler, not using `uinptr_t` for casts between integers an
      pointers results in the following `-Werror` build failures:
      In file included from .../src/truetype/truetype.c:22:
        .../src/truetype/ttgload.c:1925:22: error:
          cast from provenance-free integer type to pointer type will
          give pointer that can not be dereferenced
        node->data = FT_UINT_TO_POINTER( glyph_index );
        .../include/freetype/internal/compiler-macros.h:79:34: note:
          expanded from macro 'FT_UINT_TO_POINTER'
      * include/freetype/internal/compiler-macros.h (FT_UINT_TO_POINTER):
      The ISO C standard compliant fix for this would be to use
      `uintptr_t` from `stdint.h`, but I am not sure if this is supported
      by the minimum compiler version.  Therefore, use the
      compiler-defined `__UINTPTR_TYPE__` macro (supported in GCC 4.6+ and
      Clang since about 3.0) before checking for `_WIN64` and falling back
      to `unsigned long`.
  2. 13 Jul, 2021 3 commits
    • Oleg Oshmyan's avatar
      [base] Fix `FT_Open_Face`'s handling of user-supplied streams. · 5d27b10f
      Oleg Oshmyan authored and Werner Lemberg's avatar Werner Lemberg committed
      This was already true (though undocumented) most of the time, but
      not if `FT_NEW` inside `FT_Stream_New` failed or if the
      `FT_OPEN_XXX` flags were bad.
      Normally, `FT_Open_Face` calls `FT_Stream_New`, which returns the
      user-supplied stream unchanged, and in case of any subsequent error
      in `FT_Open_Face`, the stream is closed via `FT_Stream_Free`.
      Up to now, however, `FT_Stream_New` allocates a new stream even if
      it is already given one by the user.  If this allocation fails, the
      user-supplied stream is not returned to `FT_Open_Face` and never
      closed.  Moreover, the user cannot detect this situation: all they
      see is that `FT_Open_Face` returns `FT_Err_Out_Of_Memory`, but that
      can also happen after a different allocation fails within the main
      body of `FT_Open_Face`, when the user's stream has already been
      closed by `FT_Open_Face`.  It is plausible that the user stream's
      `close` method frees memory allocated for the stream object itself,
      so the user cannot defensively free it upon `FT_Open_Face` failure
      lest it ends up doubly freed.  All in all, this ends up leaking the
      memory/resources used by user's stream.
      Furthermore, `FT_Stream_New` simply returns an error if the
      `FT_OPEN_XXX` flags are unsupported, which can mean either an
      invalid combination of flags or a perfectly innocent
      `FT_OPEN_STREAM` on a FreeType build that lacks stream support.
      With this patch, the user-supplied stream is closed even in these
      cases, so the user can be sure that if `FT_Open_Face` failed, the
      stream is definitely closed.
      * src/base/ftobjs.c (FT_Stream_New): Don't allocate a buffer
      Move error-handling code to make the control flow more obvious.
      Close user-supplied stream if the flags are unsupported.
      `FT_Stream_Open` always sets `pathname.pointer`, so remove the
      redundant (re)assignment.  None of the `FT_Stream_Open...` functions
      uses `stream->memory`, so keep just one assignment at the end,
      shared among all possible control flow paths.
      ('Unsupported flags' that may need a stream closure can be either an
      invalid combination of multiple `FT_OPEN_XXX` mode flags or a clean
      `FT_OPEN_STREAM` flag on a FreeType build that lacks stream
    • Oleg Oshmyan's avatar
      [base] Reject combinations of incompatible `FT_OPEN_XXX` flags. · a4c8f21a
      Oleg Oshmyan authored and Werner Lemberg's avatar Werner Lemberg committed
      The three modes are mutually exclusive, and the documentation of the
      `FT_OPEN_XXX` constants notes this.  However, there was no check to
      validate this in the code, and the documentation on `FT_Open_Args`
      claimed that the corresponding bits were checked in a well-defined
      order, implying it was valid (if useless) to specify more than one.
      Ironically, this documented order did not agree with the actual
      code, so it could not be relied upon; hopefully, nobody did this and
      nobody will be hurt by the new validation.
      Even if multiple mode bits were allowed, they could cause memory
      leaks: if both `FT_OPEN_STREAM` and `stream` are set along with
      either `FT_OPEN_MEMORY` or `FT_OPEN_PATHNAME`, then `FT_Stream_New`
      allocated a new stream but `FT_Open_Face` marked it as an 'external'
      stream, so the stream object was never released.
      * src/base/ftobjs.c (FT_Stream_New): Reject incompatible
      `FT_OPEN_XXX` flags.
    • Anuj Verma's avatar
      [sdf] Improve documentation. · e592982a
      Anuj Verma authored and Werner Lemberg's avatar Werner Lemberg committed
  3. 12 Jul, 2021 7 commits
  4. 05 Jul, 2021 2 commits
  5. 03 Jul, 2021 3 commits
  6. 01 Jul, 2021 3 commits
    • Ben Wagner's avatar
      * src/truetype/ttgxvar.c (tt_set_mm_blend): Test `coords`. · d3dc2da9
      Ben Wagner authored and Werner Lemberg's avatar Werner Lemberg committed
      It is undefined behavior to pass `NULL` to `memcpy`.  `coords' is
      passed to `memcpy` but `TT_Get_MM_Blend` and `TT_Get_Var_Design`
      explictly call `tt_set_mm_blend` with `coords` as `NULL`.  In
      addition, `TT_Set_MM_Blend` has a similar possible issue.
    • Dominik Röttsches's avatar
      [sfnt] Support PaintScale in 'COLR' v1 parsing. · 286da6c5
      Dominik Röttsches authored and Werner Lemberg's avatar Werner Lemberg committed
      * include/freetype/ftcolor.h (FT_PaintFormat): Renumber values, add
      (FT_PaintScale): New structure to represent 'PaintScale*' tables.
      (FT_COLR_Paint): Updated.
      * src/sfnt/ttcolr.c (FT_PaintFormat_Internal): New enumeration.
      (read_paint): Parse 'PaintScale' and friends.
    • Dominik Röttsches's avatar
      [sfnt] Handle fonts without layer list in 'COLR' v1. · 0348c627
      Dominik Röttsches authored and Werner Lemberg's avatar Werner Lemberg committed
      'COLR' v1 fonts do not necessarily need to have a layer list; for
      this reason, 'fontTools' recently started generating fonts in a way
      that drops the layer list if there are no layers in it.  This
      results in the layer list offset becoming zero, which FreeType
      treated as an invalid table.  Fix that and handle the case for layer
      list offset being 0.  This slightly changes how we need to calculate
      the starting offset for paints.
      * src/sfnt/ttcolr.c (tt_face_load_colr): Handle case of layer list
      offset being zero without outright rejecting table.
  7. 30 Jun, 2021 4 commits
  8. 29 Jun, 2021 3 commits
  9. 28 Jun, 2021 2 commits
    • Dominik Röttsches's avatar
      [sfnt] Improve paint limit checks · 7d4e55c3
      Dominik Röttsches authored and Werner Lemberg's avatar Werner Lemberg committed
      Paint tables can appear before the `base_glyphs_v1` offset if the
      font is produced with the layer list before the base glyph list.  In
      this case paint tables can occur after the layer list but before the
      base glyph list.  Checks in the 'COLR' v1 code were rejecting fonts
      with this layout.  Improve these checks by calculating a minimum
      offset after which paint tables can occur and use that in safety
      * src/sfnt/ttcolr.c (Colr, tt_face_load_colr): Declare
      `paint_start_v1` and calculate that as the minimum of the end of
      layer list and base glyph list.
      (get_child_table_pointer, read_paint, tt_face_get_paint_layers):
      Use that in safety checks.
    • Alexei Podtelezhnikov's avatar
      [raster] Clean up vertical sweep. · 3a278381
      Alexei Podtelezhnikov authored
      * src/raster/ftraster.c (black_TWorker): Replace the current line
      offset with the pointer and drop the increment.
      (Function_Sweep_Init): Take values as arguments instead of pointers.
      (Vertical_Sweep_*, Horizontal_Sweep_Init, Draw_Sweep): Updated.
  10. 26 Jun, 2021 2 commits
  11. 25 Jun, 2021 2 commits
    • Alexei Podtelezhnikov's avatar
    • Werner Lemberg's avatar
      [base] Add trace level to logging output. · ff407765
      Werner Lemberg authored
      Some practical debugging work has shown that displaying level X of
      an `FT_TRACEX` macro in the output of `FT2_DEBUG="...  -v"` would be
      very helpful to find out which trace level should be selected.  As
      an example, we now get output like
      [ttobjs:2]    TTF driver
      [ttobjs:2]      SFNT driver
      [sfobjs:2]      not a font using the SFNT container format
      [t1objs:2]    Type 1 driver
      [stream:7]    FT_Stream_EnterFrame: 14 bytes
      * include/freetype/internal/ftdebug.h (FT_LOGGING_TAGX): New macro.
      (FT_LOG): Use it to add the trace level to the logging tag.
      * include/freetype/internal/fttrace.h (FT_MAX_TRACE_LEVEL_LENGTH):
      * docs/DEBUG: Updated.
  12. 24 Jun, 2021 2 commits
    • Alexei Podtelezhnikov's avatar
      [smooth, raster] Fix up and align error codes. · 1e0cef9e
      Alexei Podtelezhnikov authored
      FT_Render_Glyph picked up FAILURE or 1 returned from the raster
      function, which became a confusing error code. Instead, return
      Raster_Overflow in the unlikely event that banding does not help or
      another meaningful error.
      * src/smooth/ftgrays.c (gray_convert_glyph_inner, gray_convert_glyph):
      Use Raster_Overflow when the rendering pool is exhausted and return it
      if banding does not help.
      (gray_raster_render): Use Smooth_Err_Ok.
      * src/raster/ftraster.c (Render_Single_Pass): Return Raster_Overflow
      if banding does not help or another error code.
    • Alexei Podtelezhnikov's avatar
      [smooth, raster] Remove synonymous error macros. · d8ac180c
      Alexei Podtelezhnikov authored
      * src/smooth/ftgays.c [STANDALONE_]: s/ErrRaster_/Smooth_Err_/.
      (gray_convert_glyph_inner): Updated accordingly.
      * src/raster/ftraster.c [STANDALONE_]: Do not abbreviate error macros.
      (New_Profile, End_Profile, Insert_Y_Turn, Line_Up, Bezier_Up,
      Decompose_Curve, Draw_Sweep, Render_Single_Pass, ft_black_render):
      Updated accordingly.
  13. 23 Jun, 2021 1 commit
  14. 22 Jun, 2021 1 commit