From 72b447dc5a36ce052b77d741c50cb044579258c1 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 10:22:12 +0100 Subject: [PATCH 01/24] MSVC: Add necessary includes Fixes the following warnings: ../cairo/test/cairo-test.c(317): warning C4013: '_access' undefined; assuming extern returning int ../cairo/test/pdf-tagged-text.c(553): warning C4013: 'open' undefined; assuming extern returning int ../cairo/test/pdf-tagged-text.c(562): warning C4013: 'close' undefined; assuming extern returning int ../cairo/test/any2ppm.c(118): warning C4013: 'write' undefined; assuming extern returning int ../cairo/test/any2ppm.c(887): warning C4013: '_setmode' undefined; assuming extern returning int --- test/any2ppm.c | 4 ++++ test/cairo-test.c | 1 + test/pdf-tagged-text.c | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/test/any2ppm.c b/test/any2ppm.c index f601ec835..c0efdede1 100644 --- a/test/any2ppm.c +++ b/test/any2ppm.c @@ -87,6 +87,10 @@ #include #endif +#ifdef _WIN32 +#include +#endif + #if HAVE_UNISTD_H && HAVE_SIGNAL_H && HAVE_SYS_STAT_H && HAVE_SYS_SOCKET_H && (HAVE_POLL_H || HAVE_SYS_POLL_H) && HAVE_SYS_UN_H #include #include diff --git a/test/cairo-test.c b/test/cairo-test.c index 49dfadb15..347ade7a8 100644 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -67,6 +67,7 @@ #ifdef _MSC_VER #include #include +#include #define F_OK 0 #define HAVE_MKDIR 1 #define mkdir _mkdir diff --git a/test/pdf-tagged-text.c b/test/pdf-tagged-text.c index 094b1c8b0..5e58d2b71 100644 --- a/test/pdf-tagged-text.c +++ b/test/pdf-tagged-text.c @@ -41,6 +41,13 @@ #include #endif +#ifdef _WIN32 +#include +#include +#include +#include +#endif + #include #if CAIRO_HAS_PDF_SURFACE From 25dd4b12fd86fc1a9ff2faf32e6b669479cdc1b0 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 10:44:25 +0100 Subject: [PATCH 02/24] MSVC: Error-out on use of undefined function --- meson.build | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meson.build b/meson.build index 11525ea84..2fb22007b 100644 --- a/meson.build +++ b/meson.build @@ -97,6 +97,8 @@ if cc.get_id() == 'msvc' '/wd4305', # Don't warn about _cairo_status -> _cairo_int_status conversion '/wd5286', + # Turn " undefined, assuming extern returning int" to an error + '/we4013', language : ['c', 'cpp']) add_project_arguments('-D_CRT_SECURE_NO_WARNINGS', language : ['c', 'cpp']) endif From 57f17fd8f4db663338bd7dba523c25450b080425 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 10:27:22 +0100 Subject: [PATCH 03/24] MSVC: Do not warn on use of POSIX functions without underscore We follow the UNIX convention that POSIX functions don't have an underscore. --- meson.build | 4 +++- src/cairo-compiler-private.h | 9 --------- test/cairo-test.c | 1 - test/cairo-test.h | 5 ----- util/cairo-script/cairo-script-operators.c | 1 - 5 files changed, 3 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 2fb22007b..0251a88ed 100644 --- a/meson.build +++ b/meson.build @@ -100,7 +100,9 @@ if cc.get_id() == 'msvc' # Turn " undefined, assuming extern returning int" to an error '/we4013', language : ['c', 'cpp']) - add_project_arguments('-D_CRT_SECURE_NO_WARNINGS', language : ['c', 'cpp']) + add_project_arguments(['-D_CRT_SECURE_NO_WARNINGS', + '-D_CRT_NONSTDC_NO_WARNINGS', + ], language : ['c', 'cpp']) endif add_project_arguments('-D_GNU_SOURCE', language: ['c', 'cpp']) diff --git a/src/cairo-compiler-private.h b/src/cairo-compiler-private.h index 1aaced394..90fd28019 100644 --- a/src/cairo-compiler-private.h +++ b/src/cairo-compiler-private.h @@ -154,20 +154,11 @@ #endif #if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER) -#define access _access #ifndef R_OK #define R_OK 4 #endif -#define fdopen _fdopen -#define hypot _hypot #define pclose _pclose #define popen _popen -#define strdup _strdup -#define unlink _unlink -#if defined (_MSC_VER) && _MSC_VER < 1900 - #define vsnprintf _vsnprintf - #define snprintf _snprintf -#endif #endif #if defined(_MSC_VER) && defined(_M_IX86) diff --git a/test/cairo-test.c b/test/cairo-test.c index 347ade7a8..f6e25647c 100644 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -70,7 +70,6 @@ #include #define F_OK 0 #define HAVE_MKDIR 1 -#define mkdir _mkdir #endif #ifndef FALSE diff --git a/test/cairo-test.h b/test/cairo-test.h index b70654654..4a853c0d1 100644 --- a/test/cairo-test.h +++ b/test/cairo-test.h @@ -56,12 +56,7 @@ typedef unsigned __int64 uint64_t; #ifdef _MSC_VER #define _USE_MATH_DEFINES - #include -#if _MSC_VER <= 1600 -#define isnan(x) _isnan(x) -#endif - #endif #if HAVE_FENV_H diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c index a5eca6ffc..27116ca6d 100644 --- a/util/cairo-script/cairo-script-operators.c +++ b/util/cairo-script/cairo-script-operators.c @@ -48,7 +48,6 @@ #ifdef _MSC_VER #define _USE_MATH_DEFINES /* for M_LN2, M_PI and M_SQRT2 on win32 */ -#define snprintf _snprintf #endif #include From 7aff4a0a982722e544f7279a2468940a82bc7d7f Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 10:34:33 +0100 Subject: [PATCH 04/24] MSVC: Define _USE_MATH_DEFINES via meson.build --- meson.build | 1 + perf/micro/pythagoras-tree.c | 2 +- src/cairoint.h | 3 --- test/cairo-test.h | 1 - util/cairo-script/cairo-script-operators.c | 4 ---- 5 files changed, 2 insertions(+), 9 deletions(-) diff --git a/meson.build b/meson.build index 0251a88ed..98e007bca 100644 --- a/meson.build +++ b/meson.build @@ -102,6 +102,7 @@ if cc.get_id() == 'msvc' language : ['c', 'cpp']) add_project_arguments(['-D_CRT_SECURE_NO_WARNINGS', '-D_CRT_NONSTDC_NO_WARNINGS', + '-D_USE_MATH_DEFINES', ], language : ['c', 'cpp']) endif diff --git a/perf/micro/pythagoras-tree.c b/perf/micro/pythagoras-tree.c index 9d3ca1155..6581e4ed6 100644 --- a/perf/micro/pythagoras-tree.c +++ b/perf/micro/pythagoras-tree.c @@ -24,7 +24,7 @@ */ #include "cairo-perf.h" -#define _USE_MATH_DEFINES /* for M_SQRT2 on win32 */ + #include static void diff --git a/src/cairoint.h b/src/cairoint.h index b18a579be..fa8f5d395 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -55,9 +55,6 @@ #include #include -#ifdef _MSC_VER -#define _USE_MATH_DEFINES -#endif #include #include #include diff --git a/test/cairo-test.h b/test/cairo-test.h index 4a853c0d1..0a36cd7a3 100644 --- a/test/cairo-test.h +++ b/test/cairo-test.h @@ -55,7 +55,6 @@ typedef unsigned __int64 uint64_t; #endif #ifdef _MSC_VER -#define _USE_MATH_DEFINES #include #endif diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c index 27116ca6d..301080b31 100644 --- a/util/cairo-script/cairo-script-operators.c +++ b/util/cairo-script/cairo-script-operators.c @@ -46,10 +46,6 @@ #include /* mkstemp */ #include -#ifdef _MSC_VER -#define _USE_MATH_DEFINES /* for M_LN2, M_PI and M_SQRT2 on win32 */ -#endif - #include #include /* INT_MAX */ #include From 5fc7d491012af358752357309059e165a4363820 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 11:53:20 +0100 Subject: [PATCH 05/24] MSVC: Disable warning C4267 --- meson.build | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meson.build b/meson.build index 98e007bca..8aac984af 100644 --- a/meson.build +++ b/meson.build @@ -95,6 +95,8 @@ if cc.get_id() == 'msvc' add_project_arguments('/wd4244', '/wd4146', # Don't warn about double -> float truncation '/wd4305', + # Don't warn about size_t -> smaller integral truncation + '/wd4267', # Don't warn about _cairo_status -> _cairo_int_status conversion '/wd5286', # Turn " undefined, assuming extern returning int" to an error From 5679baa526a91e17686b029b88130bba6542ce4a Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 11:54:11 +0100 Subject: [PATCH 06/24] cairo-script: Fix warnings --- util/cairo-script/cairo-script-objects.c | 14 +++++++------- util/cairo-script/cairo-script-operators.c | 2 +- util/cairo-script/cairo-script-private.h | 6 +++--- util/cairo-script/cairo-script-scanner.c | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/util/cairo-script/cairo-script-objects.c b/util/cairo-script/cairo-script-objects.c index 2d7937be3..f5dbff92a 100644 --- a/util/cairo-script/cairo-script-objects.c +++ b/util/cairo-script/cairo-script-objects.c @@ -139,9 +139,9 @@ _csi_array_execute (csi_t *ctx, csi_array_t *array) for (i = 0; i < array->stack.len; i++) { csi_object_t *obj = &array->stack.objects[i]; - if (obj->type & CSI_OBJECT_ATTR_EXECUTABLE) { + if (obj->type & (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE) { if (obj->type == (CSI_OBJECT_TYPE_ARRAY | - CSI_OBJECT_ATTR_EXECUTABLE)) + (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE)) { status = _csi_push_ostack_copy (ctx, &array->stack.objects[i]); } @@ -618,12 +618,12 @@ csi_object_execute (csi_t *ctx, csi_object_t *obj) csi_object_t indirect; INDIRECT: - switch (obj->type & CSI_OBJECT_TYPE_MASK) { + switch (obj->type & (csi_object_type_t) CSI_OBJECT_TYPE_MASK) { case CSI_OBJECT_TYPE_NAME: status = _csi_name_lookup (ctx, obj->datum.name, &indirect); if (_csi_unlikely (status)) return status; - if (indirect.type & CSI_OBJECT_ATTR_EXECUTABLE) { + if (indirect.type & (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE) { obj = &indirect; goto INDIRECT; } else @@ -648,7 +648,7 @@ csi_object_t * csi_object_reference (csi_object_t *obj) { if (CSI_OBJECT_IS_CAIRO (obj)) { - switch (obj->type & CSI_OBJECT_TYPE_MASK) { + switch (obj->type & (csi_object_type_t) CSI_OBJECT_TYPE_MASK) { case CSI_OBJECT_TYPE_CONTEXT: cairo_reference (obj->datum.cr); break; @@ -677,7 +677,7 @@ csi_object_free (csi_t *ctx, csi_object_t *obj) { if (CSI_OBJECT_IS_CAIRO (obj)) { - switch (obj->type & CSI_OBJECT_TYPE_MASK) { + switch (obj->type & (csi_object_type_t) CSI_OBJECT_TYPE_MASK) { case CSI_OBJECT_TYPE_CONTEXT: cairo_destroy (obj->datum.cr); break; @@ -698,7 +698,7 @@ csi_object_free (csi_t *ctx, if (--obj->datum.object->ref) return; - switch (obj->type & CSI_OBJECT_TYPE_MASK) { + switch (obj->type & (csi_object_type_t) CSI_OBJECT_TYPE_MASK) { case CSI_OBJECT_TYPE_ARRAY: csi_array_free (ctx, obj->datum.array); break; diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c index 301080b31..6fd084957 100644 --- a/util/cairo-script/cairo-script-operators.c +++ b/util/cairo-script/cairo-script-operators.c @@ -896,7 +896,7 @@ _bind_substitute (csi_t *ctx, csi_array_t *array) for (i = 0; i < n; i++) { csi_object_t *obj = &array->stack.objects[i]; - if (obj->type == (CSI_OBJECT_TYPE_NAME | CSI_OBJECT_ATTR_EXECUTABLE)) { + if (obj->type == (CSI_OBJECT_TYPE_NAME | (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE)) { csi_dictionary_entry_t *entry; entry = _csi_hash_table_lookup (&dict->hash_table, diff --git a/util/cairo-script/cairo-script-private.h b/util/cairo-script/cairo-script-private.h index 74ede82f5..a8f0c8190 100644 --- a/util/cairo-script/cairo-script-private.h +++ b/util/cairo-script/cairo-script-private.h @@ -731,7 +731,7 @@ static inline void csi_operator_new (csi_object_t *obj, csi_operator_t op) { - obj->type = CSI_OBJECT_TYPE_OPERATOR | CSI_OBJECT_ATTR_EXECUTABLE; + obj->type = CSI_OBJECT_TYPE_OPERATOR | (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE; obj->datum.op = op; } @@ -853,13 +853,13 @@ _csi_stack_exch (csi_stack_t *stack); static inline csi_object_type_t csi_object_get_type (const csi_object_t *obj) { - return obj->type & CSI_OBJECT_TYPE_MASK; + return obj->type & (csi_object_type_t) CSI_OBJECT_TYPE_MASK; } static inline csi_boolean_t csi_object_is_procedure (const csi_object_t *obj) { - return obj->type == (CSI_OBJECT_TYPE_ARRAY | CSI_OBJECT_ATTR_EXECUTABLE); + return obj->type == (CSI_OBJECT_TYPE_ARRAY | (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE); } static inline csi_boolean_t diff --git a/util/cairo-script/cairo-script-scanner.c b/util/cairo-script/cairo-script-scanner.c index 167cd7a1e..eb719787d 100644 --- a/util/cairo-script/cairo-script-scanner.c +++ b/util/cairo-script/cairo-script-scanner.c @@ -503,7 +503,7 @@ token_end (csi_t *ctx, csi_scanner_t *scan, csi_file_t *src) status = csi_array_append (ctx, scan->build_procedure.datum.array, &obj); - } else if (obj.type & CSI_OBJECT_ATTR_EXECUTABLE) { + } else if (obj.type & (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE) { status = scan_execute (ctx, &obj); csi_object_free (ctx, &obj); } else { @@ -1037,7 +1037,7 @@ scan_none: status = csi_array_append (ctx, scan->build_procedure.datum.array, &obj); - } else if (obj.type & CSI_OBJECT_ATTR_EXECUTABLE) { + } else if (obj.type & (csi_object_type_t) CSI_OBJECT_ATTR_EXECUTABLE) { status = scan_execute (ctx, &obj); csi_object_free (ctx, &obj); } else { From 7d14d2a90ef05743537c4952c243b5f55c8066e3 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 14:34:12 +0100 Subject: [PATCH 07/24] Fix compilation with clang-cl Works around https://github.com/llvm/llvm-project/issues/25679 --- meson.build | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 8aac984af..5c2af15eb 100644 --- a/meson.build +++ b/meson.build @@ -155,9 +155,13 @@ check_headers = [ check_types = [ ['uint64_t', {'headers': ['stdint.h']}], ['uint128_t', {'headers': ['stdint.h']}], - ['__uint128_t'] ] +# https://github.com/llvm/llvm-project/issues/25679 +if cc.get_id() != 'clang-cl' + check_types += [ ['__uint128_t'] ] +endif + check_funcs = [ 'alarm', 'ctime_r', From 1d3f17e293648bd58f3ecbe1bda301d653f290b9 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 14:35:28 +0100 Subject: [PATCH 08/24] Fix warnings on clang-cl --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 5c2af15eb..a02fd8d2c 100644 --- a/meson.build +++ b/meson.build @@ -90,7 +90,7 @@ if cc.get_id() != 'msvc' conf.set('WARN_UNUSED_RESULT', warn_unused_result) endif -if cc.get_id() == 'msvc' +if cc.get_argument_syntax() == 'msvc' # Basic usage in the cairo type system that causes spammy and useless warnings add_project_arguments('/wd4244', '/wd4146', # Don't warn about double -> float truncation From d885fd341a9f2b804f6fbb3ca9afeec0bc601d5a Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 15:54:24 +0100 Subject: [PATCH 09/24] font/GDI: Drop check for Windows >= XP --- src/win32/cairo-win32-font.c | 40 ++++++++---------------------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/src/win32/cairo-win32-font.c b/src/win32/cairo-win32-font.c index 21c19a141..e87ce18df 100644 --- a/src/win32/cairo-win32-font.c +++ b/src/win32/cairo-win32-font.c @@ -248,23 +248,6 @@ _compute_transform (cairo_win32_scaled_font_t *scaled_font, return CAIRO_STATUS_SUCCESS; } -static cairo_bool_t -_have_cleartype_quality (void) -{ - OSVERSIONINFO version_info; - - version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - - if (!GetVersionEx (&version_info)) { - _cairo_win32_print_api_error (__FUNCTION__, "GetVersionEx"); - return FALSE; - } - - return (version_info.dwMajorVersion > 5 || - (version_info.dwMajorVersion == 5 && - version_info.dwMinorVersion >= 1)); /* XP or newer */ -} - BYTE cairo_win32_get_system_text_quality (void) { @@ -277,18 +260,16 @@ cairo_win32_get_system_text_quality (void) } if (font_smoothing) { - if (_have_cleartype_quality ()) { - if (!SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, - 0, &smoothing_type, 0)) { - _cairo_win32_print_api_error (__FUNCTION__, "SystemParametersInfo"); - return DEFAULT_QUALITY; - } + if (!SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, + 0, &smoothing_type, 0)) { + _cairo_win32_print_api_error (__FUNCTION__, "SystemParametersInfo"); + return DEFAULT_QUALITY; + } - if (smoothing_type == FE_FONTSMOOTHINGCLEARTYPE) - return CLEARTYPE_QUALITY; - } + if (smoothing_type == FE_FONTSMOOTHINGCLEARTYPE) + return CLEARTYPE_QUALITY; - return ANTIALIASED_QUALITY; + return ANTIALIASED_QUALITY; } else { return DEFAULT_QUALITY; } @@ -346,10 +327,7 @@ _win32_scaled_font_create (LOGFONTW *logfont, break; case CAIRO_ANTIALIAS_SUBPIXEL: case CAIRO_ANTIALIAS_BEST: - if (_have_cleartype_quality ()) - f->quality = CLEARTYPE_QUALITY; - else - f->quality = ANTIALIASED_QUALITY; + f->quality = CLEARTYPE_QUALITY; break; case CAIRO_ANTIALIAS_DEFAULT: ASSERT_NOT_REACHED; From cb4325f013e47426ae92d139a5cbb316a74d2e22 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 15:57:20 +0100 Subject: [PATCH 10/24] Drop register qualifier Fixes the following warning on CLangCL: ..\cairo\src\cairoint.h(178,5): warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register] --- src/cairoint.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cairoint.h b/src/cairoint.h index fa8f5d395..6f009bfd7 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -175,7 +175,7 @@ _cairo_popcount (uint32_t mask) #if defined (__GNUC__) return __builtin_popcount (mask); #else - register int y; + int y; y = (mask >> 1) &033333333333; y = mask - y - ((y >>1) & 033333333333); From 53eaaf6505227f34c9ba16258481ce6d4c8df03d Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 16:01:15 +0100 Subject: [PATCH 11/24] Drop assert Fixes #929 --- src/cairo-colr-glyph-render.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cairo-colr-glyph-render.c b/src/cairo-colr-glyph-render.c index d28e0ba16..d3e523d25 100644 --- a/src/cairo-colr-glyph-render.c +++ b/src/cairo-colr-glyph-render.c @@ -1095,8 +1095,6 @@ draw_paint (cairo_colr_glyph_render_t *render, FT_Vector orig_delta; cairo_status_t status = CAIRO_STATUS_SUCCESS; - assert (cairo_status (cr) == CAIRO_STATUS_SUCCESS); - if (!FT_Get_Paint (render->face, *paint, &p)) return CAIRO_STATUS_NO_MEMORY; From 21afef05af297361609989c89b33393d160cb808 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 16:04:11 +0100 Subject: [PATCH 12/24] font/GDI: Add static specifier to function Fixes the following warning: Compiling C object src/libcairo-2.dll.p/win32_cairo-win32-font.c.obj ../cairo/src/win32/cairo-win32-font.c:1322:1: warning: no previous declaration for '_cairo_compute_glyph_mask' [-Wmissing-declarations] 1322 | _cairo_compute_glyph_mask (cairo_surface_t *surface, | ^~~~~~~~~~~~~~~~~~~~~~~~~ --- src/win32/cairo-win32-font.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32/cairo-win32-font.c b/src/win32/cairo-win32-font.c index e87ce18df..50cd7f029 100644 --- a/src/win32/cairo-win32-font.c +++ b/src/win32/cairo-win32-font.c @@ -1318,7 +1318,7 @@ _cairo_win32_scaled_font_load_type1_data (void *abstract_font, length); } -cairo_surface_t * +static cairo_surface_t * _cairo_compute_glyph_mask (cairo_surface_t *surface, int quality) { From ec88bcd217cd3dc4f4a9cd9ea4d98ff9b22b5033 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 16:14:12 +0100 Subject: [PATCH 13/24] Add cairo_nonstring attribute Fixes the following warnings on GCC: ../cairo/src/cairo-base64-stream.c:52:1: warning: initializer-string for array of 'char' truncates N UL terminator but destination lacks 'nonstring' attribute (65 chars into 64 available) [-Wunterminat ed-string-initialization] 52 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ References: https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Common-Variable-Attributes.html --- src/cairo-base64-stream.c | 2 +- src/cairo-compiler-private.h | 6 ++++++ src/cairo-svg-surface.c | 2 +- src/cairo-type1-fallback.c | 6 +++--- src/cairo-type1-subset.c | 4 ++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/cairo-base64-stream.c b/src/cairo-base64-stream.c index 95f706668..aa78bbb8a 100644 --- a/src/cairo-base64-stream.c +++ b/src/cairo-base64-stream.c @@ -48,7 +48,7 @@ typedef struct _cairo_base64_stream { unsigned char src[3]; } cairo_base64_stream_t; -static char const base64_table[64] = +static char const cairo_nonstring base64_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static cairo_status_t diff --git a/src/cairo-compiler-private.h b/src/cairo-compiler-private.h index 90fd28019..4e8da4dbc 100644 --- a/src/cairo-compiler-private.h +++ b/src/cairo-compiler-private.h @@ -148,6 +148,12 @@ #define unlikely(expr) (expr) #endif +#if defined (__GNUC__) +#define cairo_nonstring __attribute__((nonstring)) +#else +#define cairo_nonstring +#endif + #if !defined(__GNUC__) && !defined (__clang__) #undef __attribute__ #define __attribute__(x) diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 249f46f53..f4f9df007 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1885,7 +1885,7 @@ typedef struct { unsigned char src[3]; } base64_write_closure_t; -static char const base64_table[64] = +static char const cairo_nonstring base64_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static cairo_status_t diff --git a/src/cairo-type1-fallback.c b/src/cairo-type1-fallback.c index d0bbc62f0..b22b8a7f4 100644 --- a/src/cairo-type1-fallback.c +++ b/src/cairo-type1-fallback.c @@ -492,7 +492,7 @@ cairo_type1_font_write_header (cairo_type1_font_t *font, const char *name) { unsigned int i; - const char spaces[50] = " "; + const char cairo_nonstring spaces[50] = " "; _cairo_output_stream_printf (font->output, "%%!FontType1-1.1 %s 1.0\n" @@ -555,7 +555,7 @@ cairo_type1_write_stream_encrypted (void *closure, { const unsigned char *in, *end; uint16_t c, p; - static const char hex_digits[16] = "0123456789abcdef"; + static const char cairo_nonstring hex_digits[16] = "0123456789abcdef"; char digits[3]; cairo_type1_font_t *font = closure; @@ -642,7 +642,7 @@ static void cairo_type1_font_write_trailer(cairo_type1_font_t *font) { int i; - static const char zeros[65] = + static const char cairo_nonstring zeros[65] = "0000000000000000000000000000000000000000000000000000000000000000\n"; for (i = 0; i < 8; i++) diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c index 5c3766e3a..426332515 100644 --- a/src/cairo-type1-subset.c +++ b/src/cairo-type1-subset.c @@ -606,7 +606,7 @@ cairo_type1_font_subset_write_encrypted (cairo_type1_font_subset_t *font, { const unsigned char *in, *end; int c, p; - static const char hex_digits[16] = "0123456789abcdef"; + static const char cairo_nonstring hex_digits[16] = "0123456789abcdef"; char digits[3]; in = (const unsigned char *) data; @@ -1543,7 +1543,7 @@ cairo_type1_font_subset_write_trailer(cairo_type1_font_subset_t *font) { const char *cleartomark_token; int i; - static const char zeros[65] = + static const char cairo_nonstring zeros[65] = "0000000000000000000000000000000000000000000000000000000000000000\n"; From 542ad4a959aae1b07e5550da33f63d52373ee3b4 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 16:17:04 +0100 Subject: [PATCH 14/24] cairo-win32-system.c: Include cairo-win32-private.h Fixes the following warning: Compiling C object src/libcairo-2.dll.p/win32_cairo-win32-system.c.obj ../cairo/src/win32/cairo-win32-system.c:62:1: warning: no previous declaration for '_cairo_win32_print_api_error' [-Wmissing-declarations] 62 | _cairo_win32_print_api_error (const char *context, const char *api) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../cairo/src/win32/cairo-win32-system.c:92:1: warning: no previous declaration for '_cairo_win32_load_library_from_system32' [-Wmissing-declarations] 92 | _cairo_win32_load_library_from_system32 (const wchar_t *name) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- src/win32/cairo-win32-system.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/win32/cairo-win32-system.c b/src/win32/cairo-win32-system.c index c5ef24e8d..4947e4e44 100644 --- a/src/win32/cairo-win32-system.c +++ b/src/win32/cairo-win32-system.c @@ -46,6 +46,8 @@ #include "cairoint.h" +#include "cairo-win32-private.h" + #include /** From 181e71d013d5e3551ffb763aeb4358f7fdb1eda7 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 16:21:24 +0100 Subject: [PATCH 15/24] Boilerplate/Win32: Fix infinite loop ../cairo/boilerplate/cairo-boilerplate-win32.c:128:28: warning: comparison is always true due to limited range of data type [-Wtype-limits] 128 | for (BYTE i = 0; i <= 255; i++) { | ^~ --- boilerplate/cairo-boilerplate-win32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boilerplate/cairo-boilerplate-win32.c b/boilerplate/cairo-boilerplate-win32.c index be1890f7f..28e410858 100644 --- a/boilerplate/cairo-boilerplate-win32.c +++ b/boilerplate/cairo-boilerplate-win32.c @@ -125,7 +125,7 @@ _cairo_boilerplate_win32_create_ddb_surface (const char *name, if (pixel_bits <= 8) { assert (pixel_bits == 8); - for (BYTE i = 0; i <= 255; i++) { + for (int i = 0; i < 256; i++) { bitmap_desc.color_table[i].rgbBlue = i; bitmap_desc.color_table[i].rgbGreen = i; bitmap_desc.color_table[i].rgbRed = i; From dc136311e9d6956c551128ab31fe3d2734c29f25 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 17:43:50 +0100 Subject: [PATCH 16/24] perf: Use access also on Windows Also fixes the following warnings on ClangCL: Compiling C object perf/cairo-analyse-trace.exe.p/cairo-analyse-trace.c.obj ../cairo/perf/cairo-analyse-trace.c(384,18): warning: unused variable 'i' [-Wunused-variable] 384 | unsigned int i; | ^ 1 warning generated. Compiling C object perf/cairo-perf-trace.exe.p/cairo-perf-trace.c.obj ../cairo/perf/cairo-perf-trace.c(552,18): warning: unused variable 'i' [-Wunused-variable] 552 | unsigned int i; | ^ 1 warning generated. --- perf/cairo-analyse-trace.c | 10 +++++----- perf/cairo-perf-trace.c | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/perf/cairo-analyse-trace.c b/perf/cairo-analyse-trace.c index dda33a2e0..d6a6b2e54 100644 --- a/perf/cairo-analyse-trace.c +++ b/perf/cairo-analyse-trace.c @@ -50,6 +50,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + #ifdef _MSC_VER #include "dirent-win32.h" @@ -381,16 +385,12 @@ cairo_perf_fini (cairo_perf_t *perf) static cairo_bool_t have_trace_filenames (cairo_perf_t *perf) { - unsigned int i; - if (perf->num_names == 0) return FALSE; -#if HAVE_UNISTD_H - for (i = 0; i < perf->num_names; i++) + for (unsigned int i = 0; i < perf->num_names; i++) if (access (perf->names[i], R_OK) == 0) return TRUE; -#endif return FALSE; } diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c index 991a8a5e0..078e963e2 100644 --- a/perf/cairo-perf-trace.c +++ b/perf/cairo-perf-trace.c @@ -51,6 +51,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + #ifdef _MSC_VER #include "dirent-win32.h" @@ -549,16 +553,12 @@ cairo_perf_fini (cairo_perf_t *perf) static cairo_bool_t have_trace_filenames (cairo_perf_t *perf) { - unsigned int i; - if (perf->num_names == 0) return FALSE; -#if HAVE_UNISTD_H - for (i = 0; i < perf->num_names; i++) + for (unsigned int i = 0; i < perf->num_names; i++) if (access (perf->names[i], R_OK) == 0) return TRUE; -#endif return FALSE; } From 28484f7da18118bb0f837f5ad984b11e8f4f98df Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 17:50:36 +0100 Subject: [PATCH 17/24] Handle new PIXMAN_a16b16g16r16 format in switch Introduced in Pixman 0.46.0. References: https://gitlab.freedesktop.org/pixman/pixman/-/merge_requests/52 --- meson.build | 3 +++ src/cairo-image-surface.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/meson.build b/meson.build index a02fd8d2c..2aee4ba3e 100644 --- a/meson.build +++ b/meson.build @@ -681,6 +681,9 @@ if pixman_dep.found() if pixman_dep.version().version_compare('>= 0.42.3') conf.set('HAS_PIXMAN_r8g8b8_sRGB', 1) endif + if pixman_dep.version().version_compare('>= 0.46.0') + conf.set('HAS_PIXMAN_a16b16g16r16', 1) + endif if pixman_dep.type_name() == 'internal' internal_deps += [pixman_dep] else diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index f18366b63..88f531a8a 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -113,6 +113,9 @@ _cairo_format_from_pixman_format (pixman_format_code_t pixman_format) case PIXMAN_a8r8g8b8_sRGB: #if HAS_PIXMAN_r8g8b8_sRGB case PIXMAN_r8g8b8_sRGB: +#endif +#if HAS_PIXMAN_a16b16g16r16 + case PIXMAN_a16b16g16r16: #endif case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_b5g6r5: From f36c6f7e610b19a30b75704d93207fe66ff41c24 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 17:58:38 +0100 Subject: [PATCH 18/24] Handle all enum values in switches Fixes -Wswitch-enum warnings on GCC --- src/win32/cairo-dwrite-font.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/win32/cairo-dwrite-font.cpp b/src/win32/cairo-dwrite-font.cpp index aca908723..05a306a6b 100644 --- a/src/win32/cairo-dwrite-font.cpp +++ b/src/win32/cairo-dwrite-font.cpp @@ -256,6 +256,10 @@ _create_rendering_params(IDWriteRenderingParams *params, modified = TRUE; } break; + case CAIRO_ANTIALIAS_BEST: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_DEFAULT: default: break; } @@ -273,6 +277,9 @@ _create_rendering_params(IDWriteRenderingParams *params, modified = TRUE; } break; + case CAIRO_SUBPIXEL_ORDER_DEFAULT: + case CAIRO_SUBPIXEL_ORDER_VRGB: + case CAIRO_SUBPIXEL_ORDER_VBGR: default: break; } From 4f970fd349d675f76bd789ba680ddcad6a33f1fa Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:01:50 +0100 Subject: [PATCH 19/24] Make function static Fixes the following warning: ../cairo/src/win32/cairo-dwrite-font.cpp:519:1: warning: no previous declaration for 'void _cairo_dwrite_glyph_run_from_glyphs(...)' [-Wmissing-declarations] 519 | _cairo_dwrite_glyph_run_from_glyphs(cairo_glyph_t *glyphs, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- src/win32/cairo-dwrite-font.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32/cairo-dwrite-font.cpp b/src/win32/cairo-dwrite-font.cpp index 05a306a6b..c8bb4a4a4 100644 --- a/src/win32/cairo-dwrite-font.cpp +++ b/src/win32/cairo-dwrite-font.cpp @@ -515,7 +515,7 @@ read_short(const char *buf) return be16_to_cpu(*(unsigned short*)buf); } -void +static void _cairo_dwrite_glyph_run_from_glyphs(cairo_glyph_t *glyphs, int num_glyphs, cairo_dwrite_scaled_font_t *scaled_font, From 31c80beed1010b30bf51c4b4166b3798828ba639 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:12:04 +0100 Subject: [PATCH 20/24] Meson: drop -Werror-implicit-function-declaration Implicit function declaration was removed in C99. GCC and CLang have kept supporting it in C99 mode until GCC 14 and CLang 15. There's little reason for enabling the relative -Werror. This also fixes a warning when compiling C++ code: Compiling C++ object src/libcairo-2.dll.p/win32_cairo-dwrite-font.cpp.obj cc1plus.exe: warning: '-Werror=' argument '-Werror=implicit-function-declaration' is not valid for C++ References: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91092#c21 --- meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/meson.build b/meson.build index 2aee4ba3e..584a57144 100644 --- a/meson.build +++ b/meson.build @@ -44,7 +44,6 @@ cflags = [] if cc.get_id() != 'msvc' cflags += [ '-Wmissing-declarations', - '-Werror-implicit-function-declaration', '-Wpointer-arith', '-Wwrite-strings', '-Wsign-compare', From b36f49dd11516595c56b4584cdcc71328c74fb0b Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:19:17 +0100 Subject: [PATCH 21/24] cairo-script: Fix unused variable warning --- util/cairo-script/cairo-script-operators.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c index 6fd084957..8c610bda8 100644 --- a/util/cairo-script/cairo-script-operators.c +++ b/util/cairo-script/cairo-script-operators.c @@ -1921,7 +1921,6 @@ _ft_create_for_pattern (csi_t *ctx, cairo_font_face_t *font_face; FcPattern *pattern, *resolved; csi_status_t status; - struct mmap_vec vec; void *bytes; _csi_blob_init (&tmpl, (uint8_t *) string->string, string->len); @@ -1996,7 +1995,9 @@ retry: data->blob.len = tmpl.len; data->bytes = NULL; data->face = NULL; + #ifdef HAVE_MMAP + struct mmap_vec vec; vec.bytes = tmpl.bytes; vec.num_bytes = tmpl.len; data->blob.bytes = _mmap_bytes (&vec, 1); From a63d15a577d74c8f46dddbf684aa9fbcd04181e1 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:26:27 +0100 Subject: [PATCH 22/24] cairo-test: Do not define HAVE_MKDIR on MSVC It's already defined by Meson. Fixes the following warning: --- test/cairo-test.c | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cairo-test.c b/test/cairo-test.c index f6e25647c..204a3d7ea 100644 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -69,7 +69,6 @@ #include #include #define F_OK 0 -#define HAVE_MKDIR 1 #endif #ifndef FALSE From 75ca66c31d86cc67fc4e49c2953d6736dd5b2da4 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:37:52 +0100 Subject: [PATCH 23/24] Properly check for mkdir on Windows We have to include direct.h --- meson-cc-tests/mkdir-variant-1.c | 5 +++-- meson-cc-tests/mkdir-variant-2.c | 5 +++-- meson.build | 5 ----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/meson-cc-tests/mkdir-variant-1.c b/meson-cc-tests/mkdir-variant-1.c index 88910d107..f8da5b3b0 100644 --- a/meson-cc-tests/mkdir-variant-1.c +++ b/meson-cc-tests/mkdir-variant-1.c @@ -1,8 +1,9 @@ #ifdef HAVE_SYS_STAT_H #include #endif -#ifdef HAVE_IO_H -#include +#ifdef _WIN32 +#define _CRT_NONSTDC_NO_WARNINGS +#include #endif int main(int ac, char **av) diff --git a/meson-cc-tests/mkdir-variant-2.c b/meson-cc-tests/mkdir-variant-2.c index d0ab7b298..b41bd5e47 100644 --- a/meson-cc-tests/mkdir-variant-2.c +++ b/meson-cc-tests/mkdir-variant-2.c @@ -1,8 +1,9 @@ #ifdef HAVE_SYS_STAT_H #include #endif -#ifdef HAVE_IO_H -#include +#ifdef _WIN32 +#define _CRT_NONSTDC_NO_WARNINGS +#include #endif int main(int ac, char **av) diff --git a/meson.build b/meson.build index 584a57144..65d88caef 100644 --- a/meson.build +++ b/meson.build @@ -142,7 +142,6 @@ check_headers = [ ['fenv.h'], ['sys/wait.h'], ['sys/stat.h'], - ['io.h'], ['fenv.h', {'check-funcs': ['feenableexcept', 'fedisableexcept', 'feclearexcept']}], ['xlocale.h'], ['sys/ioctl.h'], @@ -798,10 +797,6 @@ if conf.get('HAVE_SYS_STAT_H', 0) == 1 test_mkdir_c_args += ['-DHAVE_SYS_STAT_H'] endif -if conf.get('HAVE_IO_H', 0) == 1 - test_mkdir_c_args += ['-DHAVE_IO_H'] -endif - if cc.links(files('meson-cc-tests/mkdir-variant-1.c'), args: test_mkdir_c_args) conf.set('HAVE_MKDIR', 1) elif cc.links(files('meson-cc-tests/mkdir-variant-2.c'), args: test_mkdir_c_args) From df6dc62198ef1c160f65ebd8f554efa941ff4d80 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 27 Mar 2026 18:42:10 +0100 Subject: [PATCH 24/24] cairoint.h: Add call to abort in ASSERT_NOT_REACHED Fixes the following warning on ClangCL: ../cairo/src/cairo-colr-glyph-render.c(196,1): warning: non-void function does not return a value in all control paths [-Wreturn-type] 196 | } | ^ 1 warning generated. --- src/cairoint.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cairoint.h b/src/cairoint.h index 6f009bfd7..75e8a08d4 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -140,7 +140,10 @@ CAIRO_BEGIN_DECLS #define ASSERT_NOT_REACHED \ do { \ assert (!"reached"); \ + abort (); \ } while (0) + + #define COMPILE_TIME_ASSERT1(condition, line) \ typedef int compile_time_assertion_at_line_##line##_failed [(condition)?1:-1] #define COMPILE_TIME_ASSERT0(condition, line) COMPILE_TIME_ASSERT1(condition, line)