Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fcft for openSUSE:Factory checked in at 2025-12-28 19:19:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fcft (Old) and /work/SRC/openSUSE:Factory/.fcft.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fcft" Sun Dec 28 19:19:26 2025 rev:25 rq:1324500 version:3.3.3 Changes: -------- --- /work/SRC/openSUSE:Factory/fcft/fcft.changes 2025-07-17 17:19:55.010626498 +0200 +++ /work/SRC/openSUSE:Factory/.fcft.new.1928/fcft.changes 2025-12-28 19:19:44.512238451 +0100 @@ -1,0 +2,7 @@ +Sat Dec 27 18:48:51 UTC 2025 - Arnav Singh <[email protected]> + +- Update to 3.3.3: + * Failure to set LCD filter is no longer fatal + * COLRv1 fonts are now rejected or ignored as they are not supported. + +------------------------------------------------------------------- Old: ---- fcft-3.3.2.tar.gz fcft-3.3.2.tar.gz.sig New: ---- fcft-3.3.3.tar.gz fcft-3.3.3.tar.gz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fcft.spec ++++++ --- /var/tmp/diff_new_pack.ErGKTU/_old 2025-12-28 19:19:45.364273434 +0100 +++ /var/tmp/diff_new_pack.ErGKTU/_new 2025-12-28 19:19:45.368273598 +0100 @@ -1,7 +1,7 @@ # # spec file for package fcft # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define libname libfcft4 Name: fcft -Version: 3.3.2 +Version: 3.3.3 Release: 0 Summary: A library for font loading and glyph rasterization using FreeType/pixman License: MIT ++++++ fcft-3.3.2.tar.gz -> fcft-3.3.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/CHANGELOG.md new/fcft-3.3.3/CHANGELOG.md --- old/fcft-3.3.2/CHANGELOG.md 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/CHANGELOG.md 2025-12-27 12:27:58.000000000 +0100 @@ -1,5 +1,6 @@ # Changelog +* [3.3.3](#3-3-3) * [3.3.2](#3-3-2) * [3.3.1](#3-3-1) * [3.3.0](#3-3-0) @@ -46,6 +47,16 @@ * [1.1.7](#1-1-7) +## 3.3.3 + +### Changed + +* Failure to set LCD filter is no longer fatal +* Reject COLRv1 fonts; they are not supported. If the primary font is + a COLRv1 font, error out. If a fallback font is COLRv1, skip it, and + try the next fallback font instead. + + ## 3.3.2 ### Fixed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/PKGBUILD new/fcft-3.3.3/PKGBUILD --- old/fcft-3.3.2/PKGBUILD 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/PKGBUILD 2025-12-27 12:27:58.000000000 +0100 @@ -1,5 +1,5 @@ pkgname=fcft -pkgver=3.3.2 +pkgver=3.3.3 pkgrel=1 pkgdesc="Simple font loading and glyph rasterization library" changelog=CHANGELOG.md diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/README.md new/fcft-3.3.3/README.md --- old/fcft-3.3.2/README.md 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/README.md 2025-12-27 12:27:58.000000000 +0100 @@ -103,6 +103,7 @@ ## Not supported * Subpixel positioning +* COLRv1 Remember, this is a _simple_ library, not a full blown layout engine. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_capabilities.3.scd new/fcft-3.3.3/doc/fcft_capabilities.3.scd --- old/fcft-3.3.2/doc/fcft_capabilities.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_capabilities.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_capabilities(3) "3.3.2" "fcft" +fcft_capabilities(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_clone.3.scd new/fcft-3.3.3/doc/fcft_clone.3.scd --- old/fcft-3.3.2/doc/fcft_clone.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_clone.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_clone(3) "3.3.2" "fcft" +fcft_clone(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_destroy.3.scd new/fcft-3.3.3/doc/fcft_destroy.3.scd --- old/fcft-3.3.2/doc/fcft_destroy.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_destroy.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_destroy(3) "3.3.2" "fcft" +fcft_destroy(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_fini.3.scd new/fcft-3.3.3/doc/fcft_fini.3.scd --- old/fcft-3.3.2/doc/fcft_fini.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_fini.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_fini(3) "3.3.2" "fcft" +fcft_fini(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_font_options_create.3.scd new/fcft-3.3.3/doc/fcft_font_options_create.3.scd --- old/fcft-3.3.2/doc/fcft_font_options_create.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_font_options_create.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_font_options_create(3) "3.3.2" "fcft" +fcft_font_options_create(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_font_options_destroy.3.scd new/fcft-3.3.3/doc/fcft_font_options_destroy.3.scd --- old/fcft-3.3.2/doc/fcft_font_options_destroy.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_font_options_destroy.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_font_options_destroy(3) "3.3.2" "fcft" +fcft_font_options_destroy(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_from_name.3.scd new/fcft-3.3.3/doc/fcft_from_name.3.scd --- old/fcft-3.3.2/doc/fcft_from_name.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_from_name.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_from_name(3) "3.3.2" "fcft" +fcft_from_name(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_from_name2.3.scd new/fcft-3.3.3/doc/fcft_from_name2.3.scd --- old/fcft-3.3.2/doc/fcft_from_name2.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_from_name2.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_from_name(3) "3.3.2" "fcft" +fcft_from_name(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_init.3.scd new/fcft-3.3.3/doc/fcft_init.3.scd --- old/fcft-3.3.2/doc/fcft_init.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_init.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_init(3) "3.3.2" "fcft" +fcft_init(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_kerning.3.scd new/fcft-3.3.3/doc/fcft_kerning.3.scd --- old/fcft-3.3.2/doc/fcft_kerning.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_kerning.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_kerning(3) "3.3.2" "fcft" +fcft_kerning(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_log_init.3.scd new/fcft-3.3.3/doc/fcft_log_init.3.scd --- old/fcft-3.3.2/doc/fcft_log_init.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_log_init.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_log_init(3) "3.3.2" "fcft" +fcft_log_init(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_precompose.3.scd new/fcft-3.3.3/doc/fcft_precompose.3.scd --- old/fcft-3.3.2/doc/fcft_precompose.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_precompose.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_precompose(3) "3.3.2" "fcft" +fcft_precompose(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_rasterize_char_utf32.3.scd new/fcft-3.3.3/doc/fcft_rasterize_char_utf32.3.scd --- old/fcft-3.3.2/doc/fcft_rasterize_char_utf32.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_rasterize_char_utf32.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_rasterize_char_utf32(3) "3.3.2" "fcft" +fcft_rasterize_char_utf32(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_rasterize_grapheme_utf32.3.scd new/fcft-3.3.3/doc/fcft_rasterize_grapheme_utf32.3.scd --- old/fcft-3.3.2/doc/fcft_rasterize_grapheme_utf32.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_rasterize_grapheme_utf32.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_rasterize_grapheme_utf32(3) "3.3.2" "fcft" +fcft_rasterize_grapheme_utf32(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_rasterize_text_run_utf32.3.scd new/fcft-3.3.3/doc/fcft_rasterize_text_run_utf32.3.scd --- old/fcft-3.3.2/doc/fcft_rasterize_text_run_utf32.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_rasterize_text_run_utf32.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_rasterize_text_run_utf32(3) "3.3.2" "fcft" +fcft_rasterize_text_run_utf32(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_set_emoji_presentation.3.scd new/fcft-3.3.3/doc/fcft_set_emoji_presentation.3.scd --- old/fcft-3.3.2/doc/fcft_set_emoji_presentation.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_set_emoji_presentation.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_set_emoji_presentation(3) "3.3.2" "fcft" +fcft_set_emoji_presentation(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_set_scaling_filter.3.scd new/fcft-3.3.3/doc/fcft_set_scaling_filter.3.scd --- old/fcft-3.3.2/doc/fcft_set_scaling_filter.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_set_scaling_filter.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_set_scaling_filter(3) "3.3.2" "fcft" +fcft_set_scaling_filter(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/doc/fcft_text_run_destroy.3.scd new/fcft-3.3.3/doc/fcft_text_run_destroy.3.scd --- old/fcft-3.3.2/doc/fcft_text_run_destroy.3.scd 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/doc/fcft_text_run_destroy.3.scd 2025-12-27 12:27:58.000000000 +0100 @@ -1,4 +1,4 @@ -fcft_text_run_destroy(3) "3.3.2" "fcft" +fcft_text_run_destroy(3) "3.3.3" "fcft" # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/fcft.c new/fcft-3.3.3/fcft.c --- old/fcft-3.3.2/fcft.c 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/fcft.c 2025-12-27 12:27:58.000000000 +0100 @@ -1,12 +1,13 @@ #include "fcft/fcft.h" -#include <stdlib.h> -#include <stdint.h> -#include <stdbool.h> -#include <math.h> #include <assert.h> -#include <threads.h> +#include <byteswap.h> #include <locale.h> +#include <math.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> +#include <threads.h> #include <wchar.h> /* TODO: remove */ @@ -18,6 +19,7 @@ #include FT_LCD_FILTER_H #include FT_TRUETYPE_TABLES_H #include FT_SYNTHESIS_H +#include FT_TRUETYPE_TAGS_H #include <fontconfig/fontconfig.h> #if defined(FCFT_HAVE_HARFBUZZ) @@ -589,7 +591,7 @@ static bool instantiate_pattern(FcPattern *pattern, double req_pt_size, double req_px_size, - struct instance *font) + struct instance *font, bool is_primary) { FcChar8 *face_file = NULL; if (FcPatternGetString(pattern, FC_FT_FACE, 0, &face_file) != FcResultMatch && @@ -647,6 +649,56 @@ goto err_done_face; } + do { + /* + * Detect (and reject) COLRv1 fonts by reading the COLR table + * and checking the version field. + * + * // Big-endian + * struct COLRHeaderV0 { + * uint16_t version; + * uint16_t numBaseGlyphRecords; + * uint32_t baseGlyphRecordsOffset; + * uint32_t layerRecordsOffset; + * }; + * + * struct COLRHeaderV1 { + * struct COLRHeaderV0 v0; + * uint32_t clipListOffset; + * uint32_t varIndexMapOffset; + * uint32_t itemVariationStoreOffset; + * }; + */ + + uint16_t version; + FT_ULong length = sizeof(version); + + if ((ft_err = FT_Load_Sfnt_Table(ft_face, TTAG_COLR, 0, (FT_Byte *)&version, &length)) != FT_Err_Ok) { + /* Stay silent, and assume we failed simply because the table doesn't exist */ + //LOG_ERR("%s: failed to load COLR table: %s", face_file, FT_Error_String(ft_err)); + break; + } + + if (length < sizeof(version)) { + LOG_ERR("%s: failed to read version field from the COLR table", face_file); + goto err_done_face; + } + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + version = bswap_16(version); +#endif + + LOG_DBG("%s: COLR: version=%d", version); + + if (version >= 1) { + if (is_primary) + LOG_ERR("%s: COLRv1 not supported", face_file); + else + LOG_WARN("%s: skipping, COLRv1 not supported", face_file); + goto err_done_face; + } + } while (0); + FcBool scalable; if (FcPatternGetBool(pattern, FC_SCALABLE, 0, &scalable) != FcResultMatch) scalable = FcTrue; @@ -767,6 +819,8 @@ if (FcPatternGetInteger(pattern, FC_LCD_FILTER, 0, &fc_lcdfilter) != FcResultMatch) fc_lcdfilter = FC_LCD_DEFAULT; + font->lcd_filter = FT_LCD_FILTER_DEFAULT; + switch (fc_lcdfilter) { case FC_LCD_NONE: font->lcd_filter = FT_LCD_FILTER_NONE; break; case FC_LCD_DEFAULT: font->lcd_filter = FT_LCD_FILTER_DEFAULT; break; @@ -1153,7 +1207,7 @@ struct instance *primary = malloc(sizeof(*primary)); if (primary == NULL || - !instantiate_pattern(pattern, req_pt_size, req_px_size, primary)) + !instantiate_pattern(pattern, req_pt_size, req_px_size, primary, true)) { ; } else @@ -1383,9 +1437,8 @@ FT_Error err = FT_Library_SetLcdFilter(ft_lib, inst->lcd_filter); if (err != FT_Err_Ok) { - LOG_ERR("failed to set LCD filter: %s", ft_error_string(err)); - mtx_unlock(&ft_lock); - goto err; + LOG_WARN("failed to set LCD filter (%d): %s", + inst->lcd_filter, ft_error_string(err)); } } @@ -2037,7 +2090,7 @@ if (!instantiate_pattern( it->item.pattern, it->item.req_pt_size, it->item.req_px_size, - inst)) + inst, false)) { /* Remove, so that we don't have to keep trying to * instantiate it */ @@ -2291,7 +2344,7 @@ if (!instantiate_pattern( it->item.pattern, it->item.req_pt_size, it->item.req_px_size, - *inst)) + *inst, false)) { /* Remove, so that we don't have to keep trying to * instantiate it */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fcft-3.3.2/meson.build new/fcft-3.3.3/meson.build --- old/fcft-3.3.2/meson.build 2025-07-16 11:40:37.000000000 +0200 +++ new/fcft-3.3.3/meson.build 2025-12-27 12:27:58.000000000 +0100 @@ -1,5 +1,5 @@ project('fcft', 'c', - version: '3.3.2', # Don't forget to update version in man pages + version: '3.3.3', # Don't forget to update version in man pages license: 'MIT', meson_version: '>=0.58.0', default_options: [ @@ -20,7 +20,7 @@ so_version = [ '4', # MAJOR: increment on non-backward compatible ABI changes '3', # MINOR: increment with backward compatible ABI changes - '2', # PATCH: increment with non-ABI affecting changes + '3', # PATCH: increment with non-ABI affecting changes ] is_debug_build = get_option('buildtype').startswith('debug')
