From 38c184b494fd5ca4461f7fbcba323b13cbcca5b9 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Sun, 2 Jun 2024 04:13:46 +0800 Subject: [PATCH 01/12] Add support for color glyphs to SVG backend Signed-off-by: Raman Varabets --- src/cairo-surface.c | 13 +++ src/cairo-svg-surface-private.h | 7 ++ src/cairo-svg-surface.c | 161 ++++++++++++++++++++++++++++++-- 3 files changed, 173 insertions(+), 8 deletions(-) diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 86c1837b9..213cb3d29 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -2863,6 +2863,19 @@ composite_color_glyphs (cairo_surface_t *surface, continue; } + cairo_bool_t supports_color_glyph = FALSE; + + if (surface->backend->supports_color_glyph) { + _cairo_scaled_font_thaw_cache (scaled_font); + supports_color_glyph = _cairo_surface_supports_color_glyph (surface, scaled_font, glyphs[glyph_pos].index); + _cairo_scaled_font_freeze_cache (scaled_font); + } + + if (supports_color_glyph) { + glyphs[remaining_glyphs++] = glyphs[glyph_pos]; + continue; + } + status = composite_one_color_glyph (surface, op, source, clip, &glyphs[glyph_pos], scaled_glyph, x_scale, y_scale); diff --git a/src/cairo-svg-surface-private.h b/src/cairo-svg-surface-private.h index e2a194081..72820f152 100644 --- a/src/cairo-svg-surface-private.h +++ b/src/cairo-svg-surface-private.h @@ -45,6 +45,13 @@ #include "cairo-surface-private.h" +typedef struct _cairo_svg_color_glyph { + cairo_hash_entry_t base; + cairo_scaled_font_t *scaled_font; + unsigned long glyph_index; + cairo_bool_t supported; +} cairo_svg_color_glyph_t; + struct _cairo_svg_surface_start { cairo_surface_t base; diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 249f46f53..bf37d5cb5 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -117,6 +117,25 @@ _cairo_svg_source_surface_equal (const void *key_a, const void *key_b) return a->id == b->id; } +static cairo_bool_t +_cairo_svg_color_glyph_equal (const void *key_a, const void *key_b) +{ + const cairo_svg_color_glyph_t *a = key_a; + const cairo_svg_color_glyph_t *b = key_b; + + if (a->scaled_font != b->scaled_font) + return FALSE; + + return (a->glyph_index == b->glyph_index); +} + +static void +_cairo_svg_color_glyph_init_key (cairo_svg_color_glyph_t *key) +{ + key->base.hash = _cairo_hash_uintptr (_CAIRO_HASH_INIT_VALUE, (uintptr_t)key->scaled_font); + key->base.hash = _cairo_hash_uintptr (key->base.hash, key->glyph_index); +} + static void _cairo_svg_source_surface_pluck (void *entry, void *closure) { @@ -526,6 +545,8 @@ typedef struct _cairo_svg_surface { cairo_svg_document_t *document; + cairo_hash_table_t *color_glyphs; + cairo_svg_stream_t xml_node; cairo_array_t page_set; @@ -1080,6 +1101,12 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, surface->document = _cairo_svg_document_reference (document); + surface->color_glyphs = _cairo_hash_table_create (_cairo_svg_color_glyph_equal); + if (unlikely (surface->color_glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP; // FIXME + } + surface->xml_node = _cairo_svg_stream_create (); _cairo_array_init (&surface->page_set, sizeof (cairo_svg_page_t)); @@ -1111,6 +1138,7 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, /* ignore status as we are on the error path */ CLEANUP: + (void) _cairo_hash_table_destroy (surface->color_glyphs); (void) _cairo_svg_stream_destroy (&surface->xml_node); (void) _cairo_svg_document_destroy (document); @@ -1346,6 +1374,56 @@ _cairo_svg_document_emit_outline_glyph_data (cairo_svg_document_t *document, return status; } +static cairo_int_status_t +_cairo_svg_document_emit_color_glyph_data (cairo_svg_document_t *document, + cairo_scaled_font_t *scaled_font, + unsigned long glyph_index) +{ + cairo_status_t status; + + cairo_scaled_glyph_t *scaled_glyph; + status = _cairo_scaled_glyph_lookup (scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE, + NULL, /* foreground color */ + &scaled_glyph); + if (unlikely (status)) { + return status; + } + + cairo_surface_t *paginated_surface = _cairo_svg_surface_create_for_document (document, + CAIRO_CONTENT_COLOR_ALPHA, + 0, + 0, + FALSE); + cairo_svg_surface_t *svg_surface = (cairo_svg_surface_t *) _cairo_paginated_surface_get_target (paginated_surface); + status = paginated_surface->status; + if (unlikely (status)) { + goto cleanup; + } + + cairo_surface_set_fallback_resolution (paginated_surface, + document->owner->x_fallback_resolution, + document->owner->y_fallback_resolution); + + cairo_pattern_t *pattern = cairo_pattern_create_for_surface (scaled_glyph->recording_surface); + _cairo_svg_surface_emit_composite_pattern (//&temporary_stream, + &document->xml_node_glyphs, + svg_surface, + (cairo_surface_pattern_t *) pattern, + invalid_pattern_id, + NULL); + cairo_pattern_destroy (pattern); + +cleanup: + if (status == CAIRO_STATUS_SUCCESS) { + status = cairo_surface_status (paginated_surface); + } + cairo_surface_destroy (paginated_surface); + + return status; +} + static cairo_int_status_t _cairo_svg_document_emit_bitmap_glyph_data (cairo_svg_document_t *document, cairo_scaled_font_t *scaled_font, @@ -1483,7 +1561,7 @@ _cairo_svg_document_emit_bitmap_glyph_data (cairo_svg_document_t *document, goto cleanup; } - cleanup: +cleanup: if (status == CAIRO_STATUS_SUCCESS) { status = cairo_surface_status (paginated_surface); } @@ -1510,13 +1588,19 @@ _cairo_svg_document_emit_glyph (cairo_svg_document_t *document, font_id, subset_glyph_index); - status = _cairo_svg_document_emit_outline_glyph_data (document, - scaled_font, - scaled_font_glyph_index); - if (status == CAIRO_INT_STATUS_UNSUPPORTED) - status = _cairo_svg_document_emit_bitmap_glyph_data (document, - scaled_font, - scaled_font_glyph_index); + status = _cairo_svg_document_emit_color_glyph_data (document, + scaled_font, + scaled_font_glyph_index); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_svg_document_emit_outline_glyph_data (document, + scaled_font, + scaled_font_glyph_index); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_svg_document_emit_bitmap_glyph_data (document, + scaled_font, + scaled_font_glyph_index); + } + } if (unlikely (status)) return status; @@ -4126,6 +4210,63 @@ _cairo_svg_surface_get_supported_mime_types (void *abstract_surface) return _cairo_svg_supported_mime_types; } +static cairo_bool_t +_cairo_svg_surface_supports_color_glyph (void *abstract_surface, + cairo_scaled_font_t *scaled_font, + unsigned long glyph_index) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_color_glyph_t glyph_key; + cairo_svg_color_glyph_t *glyph_entry; + cairo_scaled_glyph_t *scaled_glyph; + cairo_status_t status; + + glyph_key.scaled_font = scaled_font; + glyph_key.glyph_index = glyph_index; + + _cairo_svg_color_glyph_init_key (&glyph_key); + glyph_entry = _cairo_hash_table_lookup (surface->color_glyphs, &glyph_key.base); + if (glyph_entry) + return glyph_entry->supported; + + glyph_entry = _cairo_malloc (sizeof (cairo_svg_color_glyph_t)); + if (glyph_entry == NULL) { + status = _cairo_surface_set_error (&surface->base, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + return FALSE; + } + + glyph_entry->scaled_font = cairo_scaled_font_reference (scaled_font); + glyph_entry->glyph_index = glyph_index; + _cairo_svg_color_glyph_init_key (glyph_entry); + + glyph_entry->supported = FALSE; + _cairo_scaled_font_freeze_cache (scaled_font); + status = _cairo_scaled_glyph_lookup (scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_COLOR_SURFACE, + NULL, /* foreground color */ + &scaled_glyph); + if (unlikely (status)) + goto done; + + glyph_entry->supported = !(scaled_glyph->recording_uses_foreground_color || + scaled_glyph->recording_uses_foreground_marker); + +done: + _cairo_scaled_font_thaw_cache (scaled_font); + + status = _cairo_hash_table_insert (surface->color_glyphs, + &glyph_entry->base); + if (unlikely(status)) { + status = _cairo_surface_set_error (&surface->base, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + return FALSE; + } + + return glyph_entry->supported; +} + static const cairo_surface_backend_t cairo_svg_surface_backend = { CAIRO_SURFACE_TYPE_SVG, _cairo_svg_surface_finish, @@ -4160,6 +4301,10 @@ static const cairo_surface_backend_t cairo_svg_surface_backend = { NULL, /* has_show_text_glyphs */ NULL, /* show_text_glyphs */ _cairo_svg_surface_get_supported_mime_types, + NULL, /* tag */ + _cairo_svg_surface_supports_color_glyph, + NULL, /* analyze_recording_surface */ + NULL, /* command_id */ }; static cairo_status_t From 5aac7156dddf15290b76120d97b3a96d581baee9 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Sun, 2 Jun 2024 18:22:43 +0800 Subject: [PATCH 02/12] Clean up Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index bf37d5cb5..187363e25 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1407,8 +1407,7 @@ _cairo_svg_document_emit_color_glyph_data (cairo_svg_document_t *document, document->owner->y_fallback_resolution); cairo_pattern_t *pattern = cairo_pattern_create_for_surface (scaled_glyph->recording_surface); - _cairo_svg_surface_emit_composite_pattern (//&temporary_stream, - &document->xml_node_glyphs, + _cairo_svg_surface_emit_composite_pattern (&document->xml_node_glyphs, svg_surface, (cairo_surface_pattern_t *) pattern, invalid_pattern_id, From d53079cfcc0452a30954cab4ea932315b4cfb6f5 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Sun, 2 Jun 2024 18:26:40 +0800 Subject: [PATCH 03/12] Free color glyphs hash table properly on error. Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 187363e25..3f08205f1 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1104,7 +1104,7 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, surface->color_glyphs = _cairo_hash_table_create (_cairo_svg_color_glyph_equal); if (unlikely (surface->color_glyphs == NULL)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); - goto CLEANUP; // FIXME + goto CLEANUP1; } surface->xml_node = _cairo_svg_stream_create (); @@ -1113,7 +1113,7 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, surface->source_surfaces = _cairo_hash_table_create (_cairo_svg_source_surface_equal); if (unlikely (surface->source_surfaces == NULL)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); - goto CLEANUP; + goto CLEANUP2; } _cairo_surface_clipper_init (&surface->clipper, _cairo_svg_surface_clipper_intersect_clip_path); @@ -1137,8 +1137,9 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, } /* ignore status as we are on the error path */ - CLEANUP: +CLEANUP2: (void) _cairo_hash_table_destroy (surface->color_glyphs); +CLEANUP1: (void) _cairo_svg_stream_destroy (&surface->xml_node); (void) _cairo_svg_document_destroy (document); From bf652edbf793c725ef70fa65e4bc074e76a95b49 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Sun, 2 Jun 2024 19:35:06 +0800 Subject: [PATCH 04/12] Free color glyphs hash table when SVG surface is destroyed Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 3f08205f1..87f8c9721 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -147,6 +147,18 @@ _cairo_svg_source_surface_pluck (void *entry, void *closure) free (source_surface); } +static void +_cairo_svg_color_glyph_pluck (void *entry, void *closure) +{ + cairo_svg_color_glyph_t *glyph_entry = entry; + cairo_hash_table_t *patterns = closure; + + _cairo_hash_table_remove (patterns, &glyph_entry->base); + cairo_scaled_font_destroy (glyph_entry->scaled_font); + + free (glyph_entry); +} + static void _cairo_svg_paint_init_key (cairo_svg_paint_t *paint) { @@ -1744,6 +1756,11 @@ _cairo_svg_surface_finish (void *abstract_surface) _cairo_hash_table_foreach (surface->source_surfaces, _cairo_svg_source_surface_pluck, surface->source_surfaces); _cairo_hash_table_destroy (surface->source_surfaces); + _cairo_hash_table_foreach (surface->color_glyphs, + _cairo_svg_color_glyph_pluck, + surface->color_glyphs); + _cairo_hash_table_destroy (surface->color_glyphs); + status = _cairo_svg_document_destroy (surface->document); if (final_status == CAIRO_STATUS_SUCCESS) { final_status = status; From da46b016b8efe5d79ead382c74f09d6ded0d7c3f Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Sun, 2 Jun 2024 19:41:25 +0800 Subject: [PATCH 05/12] Fix color bitmap font rendering Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 87f8c9721..a721a91b2 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -4261,7 +4261,7 @@ _cairo_svg_surface_supports_color_glyph (void *abstract_surface _cairo_scaled_font_freeze_cache (scaled_font); status = _cairo_scaled_glyph_lookup (scaled_font, glyph_index, - CAIRO_SCALED_GLYPH_INFO_COLOR_SURFACE, + CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE, NULL, /* foreground color */ &scaled_glyph); if (unlikely (status)) From 74b0f6a3f6144123ffcefbf966a1a72bf159ae66 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Mon, 3 Jun 2024 10:47:51 +0800 Subject: [PATCH 06/12] Implement show_text_glyphs instead of show_glyphs in SVG backend Signed-off-by: Raman Varabets --- src/cairo-surface.c | 13 ------------- src/cairo-svg-surface.c | 31 +++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 213cb3d29..86c1837b9 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -2863,19 +2863,6 @@ composite_color_glyphs (cairo_surface_t *surface, continue; } - cairo_bool_t supports_color_glyph = FALSE; - - if (surface->backend->supports_color_glyph) { - _cairo_scaled_font_thaw_cache (scaled_font); - supports_color_glyph = _cairo_surface_supports_color_glyph (surface, scaled_font, glyphs[glyph_pos].index); - _cairo_scaled_font_freeze_cache (scaled_font); - } - - if (supports_color_glyph) { - glyphs[remaining_glyphs++] = glyphs[glyph_pos]; - continue; - } - status = composite_one_color_glyph (surface, op, source, clip, &glyphs[glyph_pos], scaled_glyph, x_scale, y_scale); diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index a721a91b2..b830d91e0 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -4183,14 +4183,25 @@ _cairo_svg_surface_show_glyphs_impl (cairo_svg_stream_t *output, return status; } +static cairo_bool_t +_cairo_svg_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + static cairo_int_status_t -_cairo_svg_surface_show_glyphs (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font, - const cairo_clip_t *clip) +_cairo_svg_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) { cairo_svg_surface_t *surface = abstract_surface; cairo_int_status_t status; @@ -4314,9 +4325,9 @@ static const cairo_surface_backend_t cairo_svg_surface_backend = { _cairo_svg_surface_stroke, _cairo_svg_surface_fill, _cairo_svg_surface_fill_stroke, - _cairo_svg_surface_show_glyphs, - NULL, /* has_show_text_glyphs */ - NULL, /* show_text_glyphs */ + NULL, /* show_glyphs */ + _cairo_svg_surface_has_show_text_glyphs, + _cairo_svg_surface_show_text_glyphs, _cairo_svg_surface_get_supported_mime_types, NULL, /* tag */ _cairo_svg_surface_supports_color_glyph, From 56b02f9c1db0f1e69e4c205fda012bbfa46360ec Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Tue, 18 Jun 2024 21:35:45 +0800 Subject: [PATCH 07/12] Update SVG reference for ft-color-font test Signed-off-by: Raman Varabets --- .../reference/ft-color-font.svg11.argb32.ref.png | Bin 0 -> 1819 bytes test/reference/ft-color-font.svg11.rgb24.ref.png | Bin 0 -> 1128 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/reference/ft-color-font.svg11.argb32.ref.png create mode 100644 test/reference/ft-color-font.svg11.rgb24.ref.png diff --git a/test/reference/ft-color-font.svg11.argb32.ref.png b/test/reference/ft-color-font.svg11.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..4cda8a3ce745e76964efa2b35cb5c200cde44eac GIT binary patch literal 1819 zcmV+$2juvPP)f9JVxb9Z-kXLplrtZADytwyxfh$%&+5?=yh zYd*BGfkLHFthNZY#V`3F3xc2^D3;Qc5^EHz34;1TC5px>QluIysnQpl=53p|&1QFJ z=g!Q%_j&vugtKyEO;1hz>tnVdR4^62^MwM!2V=m+}ry9K6!D&W=~; z8`ewQ^DWaK+%G*|AijVRFs&fY>6}}KOC7G7C3ZG@y7%JD*W}7oUk`i=7*e5!~`f z=MHjknZu=ElN>wI_(xuCeq!LEQx})W;d)>@J4QR^zDh2IGU2?Pni#0E1Ee$WK&8*cFl4prG&foxL~ zuj_A}qYgB5H1)R#*s+p;%M#wUd33wP{tjs?>$iyDgM`u=y1eJ^DN$*Y_66znklyIQ z$)|d6UF7-i(<+>(qHV%X3AI(uRmFyWF50F#3Abn+SQ}v{e1SgSh%ev?_`<8l8a(p& zIA7iKHnqequz&Nd248+`oUiN|XSQL%m$~=dl*7=3@%@WD|5n{*vcfxiJFpMr|z-f)4nI-ruCEwc!Du)Vw$9>c|S!JOyrA6XB$4 z*WsIWV$khJ5F=CuJ>ED~!x$JE@)r0E5Ba=)Y8C{B*ZFgmyj52PLVx3>)0EX*fI(H% z7K&2_oYRIQ1B!*t0jGfhwLe|(YscuQa5Z64T&!Xk@@rt+;?wJk@Jb((Y&_@Ooyr-74&M`XYO;5={^ zcuixt!uDl=5-__e!eXtNE2)LrS}GZK?;2dxCk%yM_f+P-clLhPS|MFfsTZr-PLuuB z5~#(__TD42L0WdwCSxacGt-4BnN-52 zFg&fk>y~+h2W%)bA*OJx7JBbR9T&yefm)irT=}?({msnv%|fH;cw)~uCr_osB}2L2 zAizx3^3qEQ`}SYt=+QcNe5e$|-umR;{N`#0@2mGF6QFlcpDL95xgFqO0Sxd~qUYio7J zJ%*W?oZcS8Jv%Gx+Btv^xTeE39k%Ico;a5`&Ys^s@;HAgJi_R{`7y1=^+NYl1|9%D zs=`>ko&kOW{81+%(h=)~JgrrJ^@QE`HNaQI1WkkJet=H68g>Lh_&EKmYv;*}b1Tc-eA`fCu&SY=LllZ|>3KVo8a#t9DRO zHUfr#ap0%Raa!^4F!k*4?WVu{TYr5|zeGmcMLjqa%Z+Xf&H|akWvv5*olU8~apI)Z zlRF0=8X&IUR>O2p71=7R%`I*B0eszQa zE`BGx%~ZCRApOFNzY8U=ESAn7%zKx_|XN;!*aQ7(34YHlV9#U zTn0vfSAbuvr0l8*1Gq8#i6QT^UQh2AO<#P6iNikQ2Z9JL&#?7|%cpCT`Rwcq1fCY7iV{ti zyJ^*KV*^e^*x%D|&NqkOd~+_}0a~{e zC4FL9LcAv+upp z`S{yn#g9DS&84-%+fOg+S)W!3iwEVvHErFr zF5bH#&A6rwTBJ=_phG&OMQS!0>*;sq(x22j`!efRG#@i^=_l?>tF%?01F(4NZ1t(< z$9DH$D0}8&%+PT4ndioy?H?;u4J_6ty_<<`zdQaPNXH%C)19EBs6h={IQVr@8GYg> z@Az@=V%Wh$1*z#%r>jQ>%8f`3##G;WS4W)dCd21aDwnmX07WQLu|1;)N6Shfo4vFK za#`!lXbD7asnwX@3ea59;iO{GN?VsVWl~z%M16q~P_@BJM0%3qDq{FFv_{KZaN4_fqh$mE` z5GE69%jWiNo0nLC)I@4xYT^w~JoM7!k)cSPuORK({OXl!d+u7oxTe#nI-of*6`UQZ zmCGiZ(Q8)6(s3n$NFd@vY7*wXk3JdR^;T#iu0F1~V%D#=K7YA0vogh)qD@+WCN)5S z^|};dfIuXG1Y%15FGtTk{95JwOti-HRe2YFHzx*553IA}DFpz10000 Date: Sun, 30 Jun 2024 12:47:50 +0800 Subject: [PATCH 08/12] Fix SVG output for user fonts producing non-color glyphs Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 4 ++++ test/reference/user-font-color.svg11.ref.png | Bin 0 -> 10309 bytes 2 files changed, 4 insertions(+) create mode 100644 test/reference/user-font-color.svg11.ref.png diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index b830d91e0..e8cd8c63f 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1403,6 +1403,10 @@ _cairo_svg_document_emit_color_glyph_data (cairo_svg_document_t *document, if (unlikely (status)) { return status; } + // User fonts always have a recording surface, but they may not be color glyphs. + if (scaled_glyph->color_glyph_set && !scaled_glyph->color_glyph) { + return CAIRO_INT_STATUS_UNSUPPORTED; + } cairo_surface_t *paginated_surface = _cairo_svg_surface_create_for_document (document, CAIRO_CONTENT_COLOR_ALPHA, diff --git a/test/reference/user-font-color.svg11.ref.png b/test/reference/user-font-color.svg11.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..55f4febf35df149c9896f4066986a83b6db57b5e GIT binary patch literal 10309 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 Date: Sun, 30 Jun 2024 13:55:35 +0800 Subject: [PATCH 09/12] ci: expect user-font and ft-color-font to pass on SVG Signed-off-by: Raman Varabets --- .gitlab-ci/ignore-svg11-argb32.txt | 1 - .gitlab-ci/ignore-svg11-rgb24.txt | 2 -- 2 files changed, 3 deletions(-) diff --git a/.gitlab-ci/ignore-svg11-argb32.txt b/.gitlab-ci/ignore-svg11-argb32.txt index 2f53dd340..71365a16e 100644 --- a/.gitlab-ci/ignore-svg11-argb32.txt +++ b/.gitlab-ci/ignore-svg11-argb32.txt @@ -49,4 +49,3 @@ text-rotate text-unhinted-metrics tighten-bounds unbounded-operator -user-font-color diff --git a/.gitlab-ci/ignore-svg11-rgb24.txt b/.gitlab-ci/ignore-svg11-rgb24.txt index 44ddbff0e..d78bfa26f 100644 --- a/.gitlab-ci/ignore-svg11-rgb24.txt +++ b/.gitlab-ci/ignore-svg11-rgb24.txt @@ -28,7 +28,6 @@ filter-bilinear-extents filter-nearest-offset filter-nearest-transformed finer-grained-fallbacks -ft-color-font ft-show-glyphs-positioning ft-text-vertical-layout-type1 ft-text-vertical-layout-type3 @@ -106,4 +105,3 @@ tighten-bounds unbounded-operator xcb-surface-source xlib-surface-source -user-font-color From d41f459c9b8a552d088b085d19811adbcab0094f Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Thu, 4 Jul 2024 22:13:52 +0800 Subject: [PATCH 10/12] Update SVG reference for ft-svg-render-fill test Signed-off-by: Raman Varabets --- test/reference/ft-svg-render-fill.svg.ref.png | Bin 0 -> 1691 bytes .../ft-svg-render-fill.svg.rgb24.ref.png | Bin 2305 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/reference/ft-svg-render-fill.svg.ref.png delete mode 100644 test/reference/ft-svg-render-fill.svg.rgb24.ref.png diff --git a/test/reference/ft-svg-render-fill.svg.ref.png b/test/reference/ft-svg-render-fill.svg.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..685fcee07489208c45c0b6ae9d6660eb3c9aaacb GIT binary patch literal 1691 zcmeAS@N?(olHy`uVBq!ia0vp^4?&oN2}o|d=&B2(*pj^6T^Rm@;DWu&Cj$inJY5_^ zD(1YsdsaWWTITpiv56I4Qc9U2Pu6*)g*gS8P4A7E?9=4>lYPS`y=?A(th2KXSG2b- zcex`it-X5Y1htM00{n_DQ%~&dzSj}`wsOVgUm5q;A5Gb^zvg`YrR{RJ3M+UIe_%M& zWmnDIz$(>hMKsza^m+GxssGmD)<5Sre&qYzUH|vb)U$h+eEoa8{CD^MBWkAdd8^&j z{}oo-Z?nky^8Nh%n|HjU`sDuUZ}dFdKD*fV%0&%IQRJVRzYagn$GlZ3zF$}K`;BhI zZ=u;&YIf}XqvzJ~IEKH}gp0~3?fTj3%F3CuW_2A+vb@uO{PD*r)28w9^G}~X{dUa$ z+TvMHWtU!ixw?Eqm36nZ;pLYJZ-0EN5GzkAy5qO`@vK;LeYyVYSFgs#$ET+!XNHD^ z$jHiGy>{(ZjD6vr*+8vg|CC=Oe0^^7>s;UKxgXLB)n7^`ZtgZOTGvi|#Nbr9Ion~% zlqo)be#ahvlzI1j|KqUG(3|o1A9AM@Tk91T>9(C0ddE@!O)SV@Hyg`>2CBpmS{$cd zdhzt>(&+Z`LXl6QYQ24ZeY;94#N8F+E%$9pHj&EB$+>g?etuTguLm1rWm;{X{irOd ztGoC3qmG_l-JctJeNJ-4cU~Mibm;Yb`6rJwo*1S-|8@ED<+e7q!v=fe-hcd9=cJbkMA zF)=Xk;?0{g@4r9)UOspYDqLCEnk;bLY$V@98!hmM?$)>C>f} zE5CkKU2?pB?b;dlg$YYDOcK-5mTlT}DR6FTYAVnZ(-zm*#oNgFM}7YCB_uXB*OH4> zBX@CIqKur}w(Z+*^K4nV^yz~K2hOcHc<|tqY^Q}2<_2n*r1eU*ef;xBhOfQ5yW98G zm#V$W%F6HOOI_}bii+~unNV1G@tKB*NVl8twCU4*rDEgaw$<;MI(2G>$*fQ7GE8=D z+LTl;!qu|&x_k1*87KGl_xG2zso2=qY}vN$+_`gVcjY==Zr!?dhQH-d%Id(+*Kf$~ zW!k@CLqT=5wSj>ESL?g??}g_xEMB}A7&_tM;d^HEi|EYHOx_rADgV{F6)P%!Cx(WG z>WFRrykxG)s+B7>g*x~A?XUdizOW#|zCRBb*>~@%{+st>-m^b{{=790DladeJ$rVU zo%|%XQXspu^y}BJsRmrEM>ahIdisdh{`>oP?fO;q``Wdz+S=Mj>lQ9lw4N^jjIM_p zGQNCW`gKbF&prEkpM3r~Z{EBjGcMMni!S!|@}AyaBb2Y4o0s=2M}*6(^Jh4dy1IIG zb@em*d=akJrh^a8o%1{Aws3*PznRtw$9J%?P+BUXrTIa{{mU)F^FhA*(g7D>ZNuQ{ L>gTe~DWM4fvoK)m literal 0 HcmV?d00001 diff --git a/test/reference/ft-svg-render-fill.svg.rgb24.ref.png b/test/reference/ft-svg-render-fill.svg.rgb24.ref.png deleted file mode 100644 index ac892036a6b10464413aef052d3c30eaee18df42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmcIm`8ON*7WX=eT4$zthS2CMkG2>=h~11Ocy;Kr6p6J{YwSxHLdz86wPcvFG)10f zgi=zp)S7Ba+98$(kw&CS6QUAZ5KA)YfAG%foAdqLdw;w4e(vXIR zGAbVKE=RQTCIaeTf}K~whR4sWRvMZvLgIE| z?vMZBa(2Vj)k8hZ)TPt}3Gx3*wouu8+?sYLHc-(#TJ_x&`^A1*1OO!APNTWn_fk}& zE?1h#MAS?64kv&Pg9FXr_yJx8v*$4{Dj%T8V zGA#<|+>>}}bSQ~Veg9i!_RR4`HUdc1+N^53w38K5S5k3iU57%N+^>QuO>72;*9>Vt zL?PbI``4@j%$aQW;qDIP5h>g~2teVm zTPL)desTj~q?k1r#12l;gqs- zg@uKQ>P#39E+835CgL1uJHqkn#IVvj4W?eR8;W!{NsA;I*bVK4421G_iX7U$;o+U5IVpt4@W+^O*Jv5lL_5MuR3xFkOC&t&8_Wb#G&d%hQ7}or} z28N=grDfot=sRDd)kY*jm6u->DxGyiW&0hvoxk4^vd$jLMO?c!N2halL?FAYtD&I| z{4X*yGFuS)-Fu#1n?TmWg7%#eWwN{8*WZ|g z*1o#vneYQL{otQ@1@zS=JP-&x;DH!-m*8v~%{Meu%xCrQn*22U4)2D!Q2xrQ>@Aat zfWxKU7Q$O17f;8eYvaKmO5=A=j`l4qELbcSz8Zx>Sz1`ANM5~tiZr)``}sYQk_`uE zZN3|BZ*QMgsxk`l2@bY9)(r^>$rLP7ty&0#sEJzZL@~Gq>w~w;*^8fT@m~f#OJ94l zw};~XJ9?s4Gi8dy;oQaZ*(As8;+kt_5bVDi<>cj&NTjs88s4r5Jv%$w5g7ln`3ref z005wDtW@Zfv^b!d@=`1oCtKN}XQW)@<>a=7+)-~g4vYqe!_|%9D`r#fdT$mMK7!*` zGajmFS>6cl%2=P2g|U;IPAmZqlYqrD9fhE^>h#3n8dh=l9(Z{6x_GA=I{ z6cx$QAU*MniZlSBQoEGkbBWpQjdMuAMs>q5AbYH*K1+MNd!s9QGU~{HGgfVa(Q)Lb z0tlFeNeq^tS>ocuz&*f1lj`Z~JliHLAt*R_AZ2;9HGo)l;D%!`EXvlq`Q0QH6_wdo91=7u%7s|oPxdpidQ>*)OQ?dSD}IaBDQTdyvYigS~e3meEP7x%_u z?^`DDR#%%_T7ZX6QvTdODh(4sY6%GmlQ>5mpudmL*Q&+3<*%li)pQ(!htLe_MNeI8 zL#e)A#9He#PRUt=H(|8-?p*P)s398C+S0OMcfJVI(%RZ(WN6P@=uLCRcPB6{JKW9@ zu-c{Ys;A+@r^w(cV+2aDIQSJV_xNB7Yk^cI*VyNvE|e#OBAF;x*TM)5=>R9K;)J}} zqKMn%i26QCvNdq<#~lJ&Kx}X43j~wT&Vw*bVX!{5sB@oW CRYQ*e From 60c941b0a401a2b76f104350090d1b7520752486 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Thu, 4 Jul 2024 22:15:39 +0800 Subject: [PATCH 11/12] Update SVG reference for ft-svg-render-color test Signed-off-by: Raman Varabets --- test/reference/ft-svg-render-color.svg.ref.png | Bin 0 -> 4779 bytes .../ft-svg-render-color.svg.rgb24.ref.png | Bin 5040 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/reference/ft-svg-render-color.svg.ref.png delete mode 100644 test/reference/ft-svg-render-color.svg.rgb24.ref.png diff --git a/test/reference/ft-svg-render-color.svg.ref.png b/test/reference/ft-svg-render-color.svg.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfdc5f4ef1470da27bfb9ebb08460c0c8421ece GIT binary patch literal 4779 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 literal 0 HcmV?d00001 diff --git a/test/reference/ft-svg-render-color.svg.rgb24.ref.png b/test/reference/ft-svg-render-color.svg.rgb24.ref.png deleted file mode 100644 index fd7d767865d8608f68e8804a32aba50427f6699f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5040 zcmbtYcQ71W*Ox{fq6?yz;L#(>#tKWUh_b9+H%gM#VwEMjD0$Q%LbTPp=q*@1Y(!X{ zRhD4c*cDcyMt!~CpWnMN8Y@8IY-XvJ-b|}9rd)qR2Tmq`JH7cR8*`lbif*>{@GiLqw(%@W;8n#>mUkp zyVGpCR^@;(rhg{<9r*5>$B)!=Vjl6(3O)Gw01_3k3}y;^ry;=Fn{0AHr7iSaU<-Ut zDCVvsIQgA9Fej8UedcxWbf{PDaH_&)pPaKxp02i7Iaz_?(G;KQZ5!Y2=7YJDpVHe5 zLPA;kl=drNFyk#`N{llfQIvW7;V?v~Fdzd32JhYj#KsUE5G>5tKKxywtmrl!uma-L^ng_V zINN;V1#Cc}XTM1{F7uSTv^(iN#KZ+3v#VVUQeru%@NTN#ye%6a*^hu@YA0{Fk&`=i z-%q+bRF9KDWK_3*=}PG*dfHQu*T28dZPnQL=1=cbmVp3r0Azjl`N`|9O;MOH+PVAq zkDnM3K5_uyKi`A_NFN)gS35^99%XQ5Q=cmD@cZFQ-OiTw@OzZd-=L)3?L=;$zhirNn@ato-3`c~MuLs&a{7V_ApJlB7SHJ$(0Q_e`e3N!tdGNNL zN1*b-%vvFrafZKl*y#*+p8TPT`-GX%^Hm~=D&iaE;y8V~NfoCn*nh7%S&mEz-KX=L z&vjE2CpUFYUQrJRT~TZ6J9s$BZDPpw)kE$0PtJ$-msmy9=gf#eZ9A55Pk zfM*N~PRF*HpLEbKVUltmTyl-;g!KO)*MGL{f6>+H_qLx89m554sKPJPw!meym@Gf; zBKqU+1C@6=3t9#q#p?a}Ouo#~Z~4{jp)u;q(3qGW!Tme7flzMILgxh?Sq7@*qNI08 z-F<>PBPusd{H!o3Vy)@)jE06{=S?K@*1UDOY{IE;huZouw9fijK;ruGYOi;~^g0dT zbh3n|5Ru?+if`7#ytuU5lw_mui z-m=c0c}>2`VX1DEN|nbY4?4QC6yi6LS+cD1y_Yb++Fhr)?8)KR+OA0z9TTH>;RLr9 z*6aav$2K;`eoueOvxyZZjX{*LVI$1pYa2X+$-J23Bo1v2Im@;O4-aY3=fXgL99AMo zRLR&OM=$DC&0KRUd~(%Vip`{PnQyqk=AJAZ(~-e(c$L$B8-o!b!V%^K$H2@~dGrq@ z6M8ve-ca(s2hJ|6ZWMlY9lf^1}@JZut~^hIPNep zO^Kzq`wV2DYB|j>T8g9K(eUW0f;m{R)8EnKR#&}$B9Wc_e`wo@>!m*$9}M@?>S~C; zhgA71$#KYY_VXqNLi)^Lk^LLuLL!FYlsOBk*VMI~PqPCZR-f?ByXT?$lF@qOb9Rhh zv<9t^yQIJP@>WQH{a)-6*Vlbq6Khq>wkFi(tRyaqf!g9R2N#APq0OACT6*;C3C)At z>oMD%j);lTH`Z_&CFhn9pTuiEF(VlT)Qf%v(eE2)P?gBjJ?7Bkns z?fEE1UtucGpw_Ezs*v)YgI5i^yHswF)|K9iUOxI-*^JW*)tb^D8Y{}TSf}fKP1a_A z5Xn68ki6=PlNr6YBZ3M@EQHkHW94V{N@Pu{o#j=CkE@d)2T8wyQu`(DMl+`#>UYBs zN-F2Jd<$##eINw`X|sZMC3w`VLE?9$mTHX z^g4O*@}kFD7NOr93WW)FA1!VTOqS8DPox&DaHi)C?L$abdU{kMmk5%1ur;zuoBreQ z@VpK$)S%9cp_0T|e-V(WIKb{D0y#^p!=eYhP=wNc_e9ij{+nvd$Rj7?>p~)55OavU zv^u0*czN`)T%h&Q?~=}s3RjRRe5KYeXGobAMaU=qzNF3xnnHgG9L)cAn%Nf5!C#lNp2~7%M(smTgA1QY2`=ZB+PKJ zSebut6m}J(Yf$Ou8z3i_VmxLjPcGwe;eA|-1GI>2>u$tjd2l6jYd*P?z_Q)U$KGsXK1iapOdoivb`J2Dxd%mIZCleU+%$MPpnu42S zuId*OYw$7GCwX(eIRMMdcO5JJV|!H73!|I*!(90U8k)SPkXbL9 z*S6s@xDA%v?A1w}=kawh!;@!iq2YL+JwUDs-acy8QS@v8i2Yh@FfFC1ej@C1_5#}~ z>0mQas<7GN|9+vYM3usxq={47)ZRMYUnG)ba{as}KfuzmFEz3=^mRHu$W_zooDBYo zjU4DJ8x1*M9t=dm6UNbnQ=S{U=A_oocrtH_q8tnl1+iOf%9~=Fr)Y`{Hyy<>cZ0sx zU^FX6TiNv%@VP%qU#;Mj5u49TrC^}UyluV<^?zS}ZX2QY)0NEouv+>yio1QA|Ady?EmLt}Wjaszjd?>r!nK&-{U7wF#yi>pU_A z4C%T*)=C*GT@x9cLqgf&i~gxtJQS&pSHB@q3(N1SDlIc!E1D~SY=3-ju&62#hCM$cKE!c^Ebv`+7@tYdZ?b-1^ ziYFUY(j7is>YJavqGPSBePsA-X>A|1#4Mz|;~>}9WK+uN#%}L^_S^H?F)NLR>*_k1 zS|rj9dpXX0Yg*zk<^Rc*T`N;Kxwp!V?d%GuaNn@-0=--rGw8W4v#Kc9y!5W7jpV^D zQP>vVYI!pt`IA$3r41S8%Gz(5HyjA9 zISGu#UR_{sr&j*lbP>@KQ><5@{IYp14Cj{4WTpjWBx*>Ni(uz4k6=@MW(w-OVX0ZD zG8aFV-A8)HNvqbv89_@t^vK=Yecw+>QEeMI_&R;8a@8Bt&luVr!aon(2IoZ9W)J5) zej%Bkcy#M6mPlsQ#5t#7BGSs=+e$y_HcrUM(!#CY3)hXkB)uPtU*)XyGnZ!YzCg_x zM_G|QqRa6J1;R9vzoA%>9fprpSMqnNZ~(VKWw6tkP-y#|AkE)E@Np}f#XeNiM6q0} zg+(ersmHBlQOa7!_m7{KS-fD2SBq|Y%B-{|B2v-SNOek}%S_niK2cOv0q}f1wVx-c zn6c86q0MR&YwbO=bPV+!LENRf^rCAQ4PWlgNWZjmKnky&QCx%eXQAX|jr~~KUkt}v zW^E)`-;A+^Y&&P5_Lgn``c@g6DU9|Jmy!FZP>Y~@_)@_Xr~YwBAOVSlcLs>dZB7Zr z=t8eI7P3r52ARq}b?hm56<2w^I-Z^T{_~3)CoVdW;rOX)<2;mm6Ps#${5#s zn%ldkWc}A>N!E^kL!{g#hEmf9*#}*HN|&!x0h0b{`xCd~an7cBb7m;DdH7+gV8}+K zoeJSBKP6NV;MQqXgalAV_H^?lT<>W?GujXNRUbTbt~z`=qbjM@lo~qG?&8xJ@5p*J zI^*NOvUn<+9`~-$2d!ayMHHtn+=#nk!zDMn%@PrOGP1YhjkKN3}jbhwL5EhHp zSeQ)FgYEyx+0!kc_4WH;?UL0_6HA3ZpnrGv+}~)|o@FtFH3>N%wiJC$Aptz6(y!S4OCS?`w>rfo%5d>;56$?t^?EI@lXGYZKu3JjWAoq4< z;Pc=%k^>ha`4U~m$D;!uh`nHgw~uExA!(Y3M7@!PEvJeanHngisBr{M!zN@b6|XBU zwBJAsbsz{T$c;egdQIxsR525x9w@FXK4rq$*GnSW)9(|fMHHjed8o%2qave7+l1b| zEL5Lq@$Pi|%OtN%^=Z{7Tcn^14Jyr?QW=>-SM!6-JMDU~ibh$b@zLX3WFzV8@#82o zug!1K0NP*<{zXWwKlqfrs~L0PTz#jDa%V&|w`#0*#Vu-X$m_eY`V+r;R`!8OrwYA0 z36j{#p@1o)qFOFM<1{bSNG?q@K=k=J}#iFbe1fRe=+6CBVgLkpbjzAlf4`?1 zsBh1Bwp91Ij0O=i;wFg&63?p&4g_tYy$XQiA&sr;FR+pcKZ_b`1jO!zv&mjHq9)6WMt4Ka~B3~ql7J-bVP^NL1}37&EXnGzah8)UU> z&&i8}Y*k6}b-p#q|H0xM7ME@f&pHIyZVx1eb>%$`+AA#dyz8N|>E_h&n!^#9_q}$R1H*f2Z!IrKl83nl!s~8eNl~f@CrMDwo$am?q%ex>LRh zt3#kL>t3>w(|k6DSfx-llO2GJAcC`4-P2%=aoCRv@qzx6Q-e{?g#e9X&0-_>y9!I6 z8rju@PTXHAv7UP{g;D7g>F##sjoCOi#wdX_z|-+1D( pw&z*4VE;cosft_wWgFp~-*onqc%)-{&}9pbN=M58T=U32;$Hy}3_1V+ From 02a04f6edbcb7823abf7ec7c7b10b0a69b8578b8 Mon Sep 17 00:00:00 2001 From: Raman Varabets Date: Mon, 1 Jul 2024 19:16:50 +0800 Subject: [PATCH 12/12] I have no idea what I'm doing Signed-off-by: Raman Varabets --- src/cairo-svg-surface.c | 22 ++++++++++++++++++ test/reference/ft-svg-render-doc.svg.ref.png | Bin 0 -> 11081 bytes .../ft-svg-render-doc.svg.rgb24.ref.png | Bin 13060 -> 0 bytes 3 files changed, 22 insertions(+) create mode 100644 test/reference/ft-svg-render-doc.svg.ref.png delete mode 100644 test/reference/ft-svg-render-doc.svg.rgb24.ref.png diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index e8cd8c63f..dbff5a19f 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -2535,6 +2535,28 @@ _cairo_svg_surface_emit_composite_recording_pattern (cairo_svg_stream_t *output, return status; } + // FIXME error handling order + cairo_svg_paint_t *paint_entry = _cairo_calloc (sizeof (cairo_svg_paint_t)); + if (paint_entry == NULL) { + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + cairo_rectangle_int_t extents; + cairo_bool_t is_bounded; + // how to get extents ??? + is_bounded =_cairo_surface_get_extents (pattern->surface, &extents); + //assert (is_bounded); ??? + paint_entry->source_id = surface->source_id; + paint_entry->box.p1.x = extents.x; + paint_entry->box.p1.y = extents.y; + paint_entry->box.p2.x = extents.x + extents.width; + paint_entry->box.p2.y = extents.y + extents.height; + _cairo_svg_paint_box_add_padding (&paint_entry->box); + + _cairo_array_init (&paint_entry->paint_elements, sizeof (cairo_svg_paint_element_t)); + _cairo_svg_paint_init_key (paint_entry); + status = _cairo_hash_table_insert (document->paints, &paint_entry->base); + surface->transitive_paint_used = TRUE; } diff --git a/test/reference/ft-svg-render-doc.svg.ref.png b/test/reference/ft-svg-render-doc.svg.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..a223689806c0930240c0644254049c718e0709d1 GIT binary patch literal 11081 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 literal 0 HcmV?d00001 diff --git a/test/reference/ft-svg-render-doc.svg.rgb24.ref.png b/test/reference/ft-svg-render-doc.svg.rgb24.ref.png deleted file mode 100644 index 791feb90918ee40b5fa58095522198f2a28aed20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13060 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