From 14fa88fd02d81cdab52c882b98a1130148b72820 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Sat, 4 Jun 2016 14:43:43 +0930 Subject: [PATCH] pdf: fix record-replay-extend test failures --- src/cairo-analysis-surface.c | 7 +- src/cairo-paginated-surface.c | 2 +- src/cairo-pdf-surface-private.h | 1 + src/cairo-pdf-surface.c | 91 +++++++++++------- src/cairo-recording-surface-private.h | 3 +- src/cairo-recording-surface.c | 19 ++-- src/cairo-surface-wrapper-private.h | 1 + src/cairo-surface-wrapper.c | 7 +- ...cord-neg-extents-bounded.pdf.rgb24.ref.png | Bin 520 -> 477 bytes ...rd-neg-extents-unbounded.pdf.rgb24.ref.png | Bin 520 -> 477 bytes ...cord-replay-extend-none.pdf.argb32.ref.png | Bin 0 -> 737 bytes ...ecord-replay-extend-none.pdf.rgb24.ref.png | Bin 0 -> 472 bytes ...ecord-replay-extend-pad.pdf.argb32.ref.png | Bin 0 -> 1111 bytes ...d-replay-extend-reflect.pdf.argb32.ref.png | Bin 0 -> 8821 bytes ...rd-replay-extend-reflect.pdf.rgb24.ref.png | Bin 0 -> 7783 bytes ...rd-replay-extend-repeat.pdf.argb32.ref.png | Bin 0 -> 8785 bytes ...ord-replay-extend-repeat.pdf.rgb24.ref.png | Bin 0 -> 7620 bytes 17 files changed, 81 insertions(+), 50 deletions(-) create mode 100644 test/reference/record-replay-extend-none.pdf.argb32.ref.png create mode 100644 test/reference/record-replay-extend-none.pdf.rgb24.ref.png create mode 100644 test/reference/record-replay-extend-pad.pdf.argb32.ref.png create mode 100644 test/reference/record-replay-extend-reflect.pdf.argb32.ref.png create mode 100644 test/reference/record-replay-extend-reflect.pdf.rgb24.ref.png create mode 100644 test/reference/record-replay-extend-repeat.pdf.argb32.ref.png create mode 100644 test/reference/record-replay-extend-repeat.pdf.rgb24.ref.png diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c index b2a4416aa..9a922ec5c 100644 --- a/src/cairo-analysis-surface.c +++ b/src/cairo-analysis-surface.c @@ -146,6 +146,7 @@ _analyze_recording_surface_pattern (cairo_analysis_surface_t *surface, cairo_surface_t *source, *proxy; cairo_matrix_t p2d, surface_transform; cairo_status_t status, analysis_status; + cairo_bool_t surface_is_unbounded; cairo_bool_t unused; assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE); @@ -175,8 +176,12 @@ _analyze_recording_surface_pattern (cairo_analysis_surface_t *surface, surface_transform = tmp->ctm; status = cairo_matrix_invert (&surface_transform); source = _cairo_surface_get_source (source, NULL); + surface_is_unbounded = (pattern->extend == CAIRO_EXTEND_REPEAT + || pattern->extend == CAIRO_EXTEND_REFLECT); status = _cairo_recording_surface_replay_and_create_regions (source, - &surface_transform, &tmp->base); + &surface_transform, + &tmp->base, + surface_is_unbounded); if (!tmp->first_op) _cairo_box_add_box (&surface->page_bbox, &tmp->page_bbox); diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index d08a407f8..68fa37ce3 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -355,7 +355,7 @@ _paint_page (cairo_paginated_surface_t *surface) surface->backend->set_paginated_mode (surface->target, CAIRO_PAGINATED_MODE_ANALYZE); status = _cairo_recording_surface_replay_and_create_regions (surface->recording_surface, - NULL, analysis); + NULL, analysis, FALSE); if (status) goto FAIL; diff --git a/src/cairo-pdf-surface-private.h b/src/cairo-pdf-surface-private.h index cf1a60881..0229dbc45 100644 --- a/src/cairo-pdf-surface-private.h +++ b/src/cairo-pdf-surface-private.h @@ -166,6 +166,7 @@ struct _cairo_pdf_surface { double width; double height; cairo_rectangle_int_t surface_extents; + cairo_bool_t surface_bounded; cairo_matrix_t cairo_to_pdf; cairo_bool_t in_xobject; diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index af3e56c6f..1dd3c551a 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -380,6 +380,7 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output, surface->surface_extents.y = 0; surface->surface_extents.width = ceil (surface->width); surface->surface_extents.height = ceil (surface->height); + surface->surface_bounded = TRUE; _cairo_array_init (&surface->objects, sizeof (cairo_pdf_object_t)); _cairo_array_init (&surface->pages, sizeof (cairo_pdf_resource_t)); @@ -3028,6 +3029,7 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, { double old_width, old_height; cairo_rectangle_int_t old_surface_extents; + cairo_bool_t old_surface_bounded; cairo_paginated_mode_t old_paginated_mode; cairo_surface_clipper_t old_clipper; cairo_bool_t old_in_xobject; @@ -3069,16 +3071,17 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, old_height = surface->height; old_in_xobject = surface->in_xobject; old_surface_extents = surface->surface_extents; + old_surface_bounded = surface->surface_bounded; old_paginated_mode = surface->paginated_mode; old_clipper = surface->clipper; surface->surface_extents = *extents; _cairo_surface_clipper_init (&surface->clipper, _cairo_pdf_surface_clipper_intersect_clip_path); - _cairo_pdf_surface_set_size_internal (surface, width, height); _cairo_pdf_operators_reset (&surface->pdf_operators); surface->in_xobject = TRUE; surface->surface_extents = *extents; + surface->surface_bounded = FALSE; /* Patterns are emitted after fallback images. The paginated mode * needs to be set to _RENDER while the recording surface is replayed @@ -3131,13 +3134,11 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, _cairo_surface_clipper_reset (&surface->clipper); surface->clipper = old_clipper; - _cairo_pdf_surface_set_size_internal (surface, - old_width, - old_height); _cairo_pdf_operators_reset (&surface->pdf_operators); surface->in_xobject = old_in_xobject; surface->paginated_mode = old_paginated_mode; surface->surface_extents = old_surface_extents; + surface->surface_bounded = old_surface_bounded; err: cairo_surface_destroy (free_me); @@ -3165,16 +3166,16 @@ _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, cairo_extend_t extend = cairo_pattern_get_extend (pattern); double xstep, ystep; cairo_rectangle_int_t pattern_extents; - int pattern_width = 0; /* squelch bogus compiler warning */ - int pattern_height = 0; /* squelch bogus compiler warning */ double x_offset; double y_offset; - char draw_surface[200]; + char draw_surface[50]; + char draw_surface2[200]; cairo_box_double_t bbox; cairo_matrix_t mat; cairo_pdf_source_surface_entry_t *pdf_source; cairo_rectangle_int_t op_extents; + assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE); if (pattern->extend == CAIRO_EXTEND_PAD) { status = _cairo_pdf_surface_add_padded_image_surface (surface, pattern, @@ -3202,8 +3203,6 @@ _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, return status; pattern_extents = pdf_source->extents; - pattern_width = pdf_source->extents.width; - pattern_height = pdf_source->extents.height; if (!pdf_source->bounded) { extend = CAIRO_EXTEND_NONE; @@ -3238,13 +3237,12 @@ _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, * required an answer that's large enough, we don't really * care if it's not as tight as possible.*/ xstep = ystep = ceil ((x2 - x1) + (y2 - y1) + - pattern_width + pattern_height); + pattern_extents.width + pattern_extents.height); } break; - case CAIRO_EXTEND_REPEAT: - xstep = pattern_width; - ystep = pattern_height; + xstep = pattern_extents.width; + ystep = pattern_extents.height; break; case CAIRO_EXTEND_REFLECT: @@ -3303,11 +3301,11 @@ _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, cairo_matrix_translate (&pdf_p2d, x_offset, y_offset); if (((cairo_surface_pattern_t *)pattern)->surface->type != CAIRO_SURFACE_TYPE_RECORDING) { - cairo_matrix_translate (&pdf_p2d, 0.0, pattern_height); + cairo_matrix_translate (&pdf_p2d, 0.0, pdf_source->extents.height); cairo_matrix_scale (&pdf_p2d, 1.0, -1.0); } - _get_bbox_from_extents (pattern_height, &pattern_extents, &bbox); + _get_bbox_from_extents (pattern_extents.height, &pattern_extents, &bbox); _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); status = _cairo_pdf_surface_open_stream (surface, &pdf_pattern->pattern_res, @@ -3330,35 +3328,54 @@ _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, if (unlikely (status)) return status; - if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE && - ((cairo_surface_pattern_t *) pattern)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (((cairo_surface_pattern_t *) pattern)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { snprintf(draw_surface, sizeof (draw_surface), - "/x%d Do\n", + "/x%d Do", pdf_source->surface_res.id); } else { snprintf(draw_surface, sizeof (draw_surface), "q %d 0 0 %d 0 0 cm /x%d Do Q", - pattern_width, - pattern_height, + pdf_source->extents.width, + pdf_source->extents.height, pdf_source->surface_res.id); } if (extend == CAIRO_EXTEND_REFLECT) { - _cairo_output_stream_printf (surface->output, - "q 0 0 %d %d re W n %s Q\n" - "q -1 0 0 1 %d 0 cm 0 0 %d %d re W n %s Q\n" - "q 1 0 0 -1 0 %d cm 0 0 %d %d re W n %s Q\n" - "q -1 0 0 -1 %d %d cm 0 0 %d %d re W n %s Q\n", - pattern_width, pattern_height, - draw_surface, - pattern_width*2, pattern_width, pattern_height, - draw_surface, - pattern_height*2, pattern_width, pattern_height, - draw_surface, - pattern_width*2, pattern_height*2, pattern_width, pattern_height, - draw_surface); + cairo_rectangle_int_t p_extents = pdf_source->extents; + snprintf(draw_surface2, + sizeof (draw_surface2), + "%d %d %d %d re W n %s", + p_extents.x, p_extents.y, + p_extents.width, p_extents.height, + draw_surface); + + _cairo_output_stream_printf (surface->output, "q %s Q\n", draw_surface2); + + cairo_matrix_init_translate (&mat, p_extents.x, p_extents.y); + cairo_matrix_scale (&mat, -1, 1); + cairo_matrix_translate (&mat, -2*p_extents.width, 0); + cairo_matrix_translate (&mat, -p_extents.x, -p_extents.y); + _cairo_output_stream_printf (surface->output, "q "); + _cairo_output_stream_print_matrix (surface->output, &mat); + _cairo_output_stream_printf (surface->output, " cm %s Q\n", draw_surface2); + + cairo_matrix_init_translate (&mat, p_extents.x, p_extents.y); + cairo_matrix_scale (&mat, 1, -1); + cairo_matrix_translate (&mat, 0, -2*p_extents.height); + cairo_matrix_translate (&mat, -p_extents.x, -p_extents.y); + _cairo_output_stream_printf (surface->output, "q "); + _cairo_output_stream_print_matrix (surface->output, &mat); + _cairo_output_stream_printf (surface->output, " cm %s Q\n", draw_surface2); + + cairo_matrix_init_translate (&mat, p_extents.x, p_extents.y); + cairo_matrix_scale (&mat, -1, -1); + cairo_matrix_translate (&mat, -2*p_extents.width, -2*p_extents.height); + cairo_matrix_translate (&mat, -p_extents.x, -p_extents.y); + _cairo_output_stream_printf (surface->output, "q "); + _cairo_output_stream_print_matrix (surface->output, &mat); + _cairo_output_stream_printf (surface->output, " cm %s Q\n", draw_surface2); } else { _cairo_output_stream_printf (surface->output, " %s \n", @@ -4681,9 +4698,10 @@ _cairo_pdf_surface_get_extents (void *abstract_surface, { cairo_pdf_surface_t *surface = abstract_surface; - *rectangle = surface->surface_extents; + if (surface->surface_bounded) + *rectangle = surface->surface_extents; - return TRUE; + return surface->surface_bounded; } static void @@ -6280,9 +6298,11 @@ _cairo_pdf_surface_write_smask_group (cairo_pdf_surface_t *surface, cairo_bool_t old_in_xobject; cairo_int_status_t status; cairo_box_double_t bbox; + cairo_rectangle_int_t old_surface_extents; old_width = surface->width; old_height = surface->height; + old_surface_extents = surface->surface_extents; old_in_xobject = surface->in_xobject; surface->in_xobject = TRUE; _cairo_pdf_surface_set_size_internal (surface, @@ -6352,6 +6372,7 @@ RESTORE_SIZE: _cairo_pdf_surface_set_size_internal (surface, old_width, old_height); + surface->surface_extents = old_surface_extents; _cairo_pdf_operators_reset (&surface->pdf_operators); return status; diff --git a/src/cairo-recording-surface-private.h b/src/cairo-recording-surface-private.h index 9f5216d15..021b73c08 100644 --- a/src/cairo-recording-surface-private.h +++ b/src/cairo-recording-surface-private.h @@ -170,7 +170,8 @@ _cairo_recording_surface_replay_with_clip (cairo_surface_t *surface, cairo_private cairo_status_t _cairo_recording_surface_replay_and_create_regions (cairo_surface_t *surface, const cairo_matrix_t *surface_transform, - cairo_surface_t *target); + cairo_surface_t *target, + cairo_bool_t surface_is_unbounded); cairo_private cairo_status_t _cairo_recording_surface_replay_region (cairo_surface_t *surface, const cairo_rectangle_int_t *surface_extents, diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c index 94d7a5ab4..d35512eaa 100644 --- a/src/cairo-recording-surface.c +++ b/src/cairo-recording-surface.c @@ -725,10 +725,6 @@ _cairo_recording_surface_paint (void *abstract_surface, (surface->base.is_clear || _cairo_pattern_is_opaque_solid (source))))) { _cairo_recording_surface_reset (surface); - if (is_identity_recording_pattern (source)) { - cairo_surface_t *src = ((cairo_surface_pattern_t *)source)->surface; - return _cairo_recording_surface_replay (src, &surface->base); - } } status = _cairo_composite_rectangles_init_for_paint (&composite, @@ -1676,6 +1672,7 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, const cairo_matrix_t *surface_transform, cairo_surface_t *target, const cairo_clip_t *target_clip, + cairo_bool_t surface_is_unbounded, cairo_recording_replay_type_t type, cairo_recording_region_type_t region) { @@ -1708,7 +1705,7 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, if (surface_extents) _cairo_surface_wrapper_intersect_extents (&wrapper, surface_extents); r = &_cairo_unbounded_rectangle; - if (! surface->unbounded) { + if (! surface->unbounded && !surface_is_unbounded) { _cairo_surface_wrapper_intersect_extents (&wrapper, &surface->extents); r = &surface->extents; } @@ -1716,7 +1713,7 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, _cairo_surface_wrapper_set_clip (&wrapper, target_clip); /* Compute the extents of the target clip in recorded device space */ - if (! _cairo_surface_wrapper_get_target_extents (&wrapper, &extents)) + if (! _cairo_surface_wrapper_get_target_extents (&wrapper, surface_is_unbounded, &extents)) goto done; surface->has_bilevel_alpha = TRUE; @@ -2001,7 +1998,7 @@ _cairo_recording_surface_replay (cairo_surface_t *surface, cairo_surface_t *target) { return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, NULL, - target, NULL, + target, NULL, FALSE, CAIRO_RECORDING_REPLAY, CAIRO_RECORDING_REGION_ALL); } @@ -2013,7 +2010,7 @@ _cairo_recording_surface_replay_with_clip (cairo_surface_t *surface, const cairo_clip_t *target_clip) { return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, surface_transform, - target, target_clip, + target, target_clip, FALSE, CAIRO_RECORDING_REPLAY, CAIRO_RECORDING_REGION_ALL); } @@ -2027,10 +2024,12 @@ _cairo_recording_surface_replay_with_clip (cairo_surface_t *surface, cairo_status_t _cairo_recording_surface_replay_and_create_regions (cairo_surface_t *surface, const cairo_matrix_t *surface_transform, - cairo_surface_t *target) + cairo_surface_t *target, + cairo_bool_t surface_is_unbounded) { return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, surface_transform, target, NULL, + surface_is_unbounded, CAIRO_RECORDING_CREATE_REGIONS, CAIRO_RECORDING_REGION_ALL); } @@ -2043,7 +2042,7 @@ _cairo_recording_surface_replay_region (cairo_surface_t *surface, { return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, surface_extents, NULL, - target, NULL, + target, NULL, FALSE, CAIRO_RECORDING_REPLAY, region); } diff --git a/src/cairo-surface-wrapper-private.h b/src/cairo-surface-wrapper-private.h index 6529ebc11..e412fc65c 100644 --- a/src/cairo-surface-wrapper-private.h +++ b/src/cairo-surface-wrapper-private.h @@ -186,6 +186,7 @@ _cairo_surface_wrapper_is_active (cairo_surface_wrapper_t *wrapper) cairo_private cairo_bool_t _cairo_surface_wrapper_get_target_extents (cairo_surface_wrapper_t *wrapper, + cairo_bool_t surface_is_unbounded, cairo_rectangle_int_t *extents); CAIRO_END_DECLS diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c index f69755f0c..b9b4b44a5 100644 --- a/src/cairo-surface-wrapper.c +++ b/src/cairo-surface-wrapper.c @@ -625,12 +625,15 @@ _cairo_surface_wrapper_fini (cairo_surface_wrapper_t *wrapper) cairo_bool_t _cairo_surface_wrapper_get_target_extents (cairo_surface_wrapper_t *wrapper, + cairo_bool_t surface_is_unbounded, cairo_rectangle_int_t *extents) { cairo_rectangle_int_t clip; - cairo_bool_t has_clip; + cairo_bool_t has_clip = FALSE; + + if (!surface_is_unbounded) + has_clip = _cairo_surface_get_extents (wrapper->target, &clip); - has_clip = _cairo_surface_get_extents (wrapper->target, &clip); if (wrapper->clip) { if (has_clip) { if (! _cairo_rectangle_intersect (&clip, diff --git a/test/reference/record-neg-extents-bounded.pdf.rgb24.ref.png b/test/reference/record-neg-extents-bounded.pdf.rgb24.ref.png index 159283651a90cb99151ef233befb842e87fc6765..78feffbba34125e85acb8efb08e8826aacbc4917 100644 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz12~v~q-t_~7?5I1@^*J&_z!{$_AZ|cR5Hoa z#WAE}&fB|ZyP6#YS}z*e&))NYbK2sW^VDB3diI)6EZ*jnoNXu4;w1{y4+I}Fr`>EU zd=mMm`R1{6yVkFLRrR8?q$>2TTKl=G{d(>5SOY>2HFG?4Z1|wyP$8gT!yzEYa>j1H zk8Z4d*eo%r&;Ap4&nb=XPhb1Juk~H_VX3WluRs2?x>_=Gdf?+r8!iMrPJeEkQ(jRs z{cBwGdEalrFQ0@8GqtcY9%^PlHI##&IN=S|X}8;Z=l^*u|L>dS>wQwo62n5T@7uO& zn&SM>zbl^+Cek>Fk1#CXP`yV!ep%+e`)jv-7vH%)_A=Z4dnG1`*DFp; vK@O+0^BL0j#>bf|!ovn?5;G)p8&>^deS1TvuKe)DNRWu9tDnm{r-UW|=n%am literal 520 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz12~v~q-t_~7?5I1@^*J&_z!{$_AZ|cRI=C8 z#WAE}&fB{O^KLnaI9x1blK%HUdUNBI*plcaQG1HGZPU9=K0S!(Rn_j#z5kun=DK?= z;|F^oIhGc7#)pm$6#@bvX5;0%{@dPmPX8!=r`rDKy5ClFuYLbste<-B`SV?O>;7My zeNSHgMZa~thcSKzb_q?5pVpy@?L5D^!25-{yHW5_||M(7ytUx53B4K+4sI} zt>@9%vi9%sgT`+PD)vl!U3oVxZD z_4{S<%$E(WM+N`hwbs<=$>;0m&)NPH&2|2Li(fv`k8B%&4r@RD`(skuv)^;Cz5VEV z?)u8iX8rdS70Jaq?P9Y&t^2*}j85@fsSeB37m;gs#bfi%?S1}#7f63tJ_j1o$bmk; YZ-v>aDUZ68flFVdQ&MBb@0AX^|_5c6? diff --git a/test/reference/record-neg-extents-unbounded.pdf.rgb24.ref.png b/test/reference/record-neg-extents-unbounded.pdf.rgb24.ref.png index 159283651a90cb99151ef233befb842e87fc6765..78feffbba34125e85acb8efb08e8826aacbc4917 100644 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz12~v~q-t_~7?5I1@^*J&_z!{$_AZ|cR5Hoa z#WAE}&fB|ZyP6#YS}z*e&))NYbK2sW^VDB3diI)6EZ*jnoNXu4;w1{y4+I}Fr`>EU zd=mMm`R1{6yVkFLRrR8?q$>2TTKl=G{d(>5SOY>2HFG?4Z1|wyP$8gT!yzEYa>j1H zk8Z4d*eo%r&;Ap4&nb=XPhb1Juk~H_VX3WluRs2?x>_=Gdf?+r8!iMrPJeEkQ(jRs z{cBwGdEalrFQ0@8GqtcY9%^PlHI##&IN=S|X}8;Z=l^*u|L>dS>wQwo62n5T@7uO& zn&SM>zbl^+Cek>Fk1#CXP`yV!ep%+e`)jv-7vH%)_A=Z4dnG1`*DFp; vK@O+0^BL0j#>bf|!ovn?5;G)p8&>^deS1TvuKe)DNRWu9tDnm{r-UW|=n%am literal 520 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz12~v~q-t_~7?5I1@^*J&_z!{$_AZ|cRI=C8 z#WAE}&fB{O^KLnaI9x1blK%HUdUNBI*plcaQG1HGZPU9=K0S!(Rn_j#z5kun=DK?= z;|F^oIhGc7#)pm$6#@bvX5;0%{@dPmPX8!=r`rDKy5ClFuYLbste<-B`SV?O>;7My zeNSHgMZa~thcSKzb_q?5pVpy@?L5D^!25-{yHW5_||M(7ytUx53B4K+4sI} zt>@9%vi9%sgT`+PD)vl!U3oVxZD z_4{S<%$E(WM+N`hwbs<=$>;0m&)NPH&2|2Li(fv`k8B%&4r@RD`(skuv)^;Cz5VEV z?)u8iX8rdS70Jaq?P9Y&t^2*}j85@fsSeB37m;gs#bfi%?S1}#7f63tJ_j1o$bmk; YZ-v>aDUZ68flFVdQ&MBb@0AX^|_5c6? diff --git a/test/reference/record-replay-extend-none.pdf.argb32.ref.png b/test/reference/record-replay-extend-none.pdf.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca0f1009feb52911a576facd62a12bb214906d2 GIT binary patch literal 737 zcmeAS@N?(olHy`uVBq!ia0y~yU@`)-r*JRWG$uv(F z$B>FSZ|@pr9S#s+2+Te4xBtz2ql3MXrzdFM%Vu@T=)Rc0rTE-Vh6N8_@0Vv_s5>dd zpty;}p+kpJK*^h-VO17okJ zi(^Q|oVRy3@--QVI9zo4^FRJrsMy)=Mdr`uY@IS;-@{F%xFh*mN40DI({q9-t{&_hy<+z0Tf)w_@}xmA#^CAd=d#Wz Gp$PyZh+wV& literal 0 HcmV?d00001 diff --git a/test/reference/record-replay-extend-pad.pdf.argb32.ref.png b/test/reference/record-replay-extend-pad.pdf.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..74d30438558fe418747b48bb3ba6bd3cc76e1511 GIT binary patch literal 1111 zcmai!X-pGQ5XWCjLnuPQCgL5df~8mi7tlsc1X9J?%4I=|3QDPnMoXY7hls%hB$|NI z76=6k$O49Pi4v|@@ZyL>1uu?BY_zEdF;Y;

O=)2V*pw?7rX3y#M@X^LDd?0|V@B zm)RnO>;=2{p$Jh4yjI#!@!eV>9)w4ulQf@4{SpRwOEQm~ zU7XczUmzY&SFMiESV8q%K(agq!wJJL*rwz=pF^u>JtEr{zmSy}>4-RZLXOb+JQtMF z%|w1N^b4#;ny;gT%DTj*IP%rVW{nWhrt81VybEm_dB9$K#wTdAyvih&ZRv3$C(Pby zbFF7|A1AK|$qdOQC6{ZBw=1|5g{d!p^5uDV$#;XfLE+K0BjkNmhvLTTgF-k?l-AsLmGR{gu<>eBpYc3b0oV^P%Xb2tl6&p;d zV(4Sey-k^1iYB1YsfVerR+={9f+Av+B}9u{2U26`T81nok4q7ki+Q&7d+Zg_!}P7%*oPA>)?A$6FV{ih zR23ww9&&J~=}0bs*G^Y}8#4e>i#tH20U$4B1HjEbfP0qp0J>WM6De*O%-SLVwgm*t zbOI80iUo$p3e=rzu&jlY!BPP(1!qAi<76ey#uE FjGsQ$wF>|M literal 0 HcmV?d00001 diff --git a/test/reference/record-replay-extend-reflect.pdf.argb32.ref.png b/test/reference/record-replay-extend-reflect.pdf.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..d7845abd0ddcf7fd9fd9c25ef858d174f43d0553 GIT binary patch literal 8821 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 JilvML{tvYycP9V< literal 0 HcmV?d00001 diff --git a/test/reference/record-replay-extend-reflect.pdf.rgb24.ref.png b/test/reference/record-replay-extend-reflect.pdf.rgb24.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..2c47015b5b6843ed410af3ed5cdc219c1e42cc5e GIT binary patch literal 7783 zcma)hcTf{u*e^AqC(?USnt)OSL6X{qBF?WM-3@oIQJX&+}`~KKV~ylb(i?hJ=KKUhDo{LlP1)8RGAk zRAj^>z~6Y};>$rt^DfEx#i#H~aXJYJFSpiRRpa1Sf2J*yJto4(cD5!DtPg%~4zK){ z4s`JVcCvL)#feDwsNcN%H2Cfk{dGpL4ygop%zqmkIik4=WK7%SjAYbt4G@gFpiMG` zJEO82Upf!7-RcR`kDAa=U1# zvy_o*)A-259B@8m&U{scgsU1z?V-j1gwuO@M{aen!OjVI*!ZMFP?n&*Be`89ir>yL z_B4DU`-fib@>~=Ubogwxa9GuSm%H`D0B3~(O_4t5_m$X{8`i20`z}x|t}|x>c|v3c zVNbk1A|%K({jqH0Y26{5m&`#JN&3W z9RGJL&-`9N`buJl%MQjU*859GG0b{jMmk=^cwV{ow#M^m9SI}6IXD#d#y z?6%~m#v#t$H-imxJvZS!X<&yxcjL$-)+eICe4OU*8GVERNgh`Rdk-A7sXX7s{At z39jSgi+z>dUy7tRY<%qFm1AsnvAm>E8>N+4OGGgWayA)Rl@u> z*P)?OC7hI4{41LsefC~qXDzClK*RLz8gF)ReI;=w)&B@HhTKhB4g-@{pRf5>{+UUu zeaNErK7a3;zn}1p_sNBDV@((}i%4 zLix4C=lMFSNIHT2(202;hn=cAQzFO!2Y$)spoud;UsS^rxegwtu`X)@Z;1$?E@`ZM z_VhJd%jtILTSuH&W#?Pq(`qdlA>R3)KGwqFQPmxD^qVsaf9iF@C=m)(5;>ddW`71) zjLJVn+!;a)mQ~o!!87vhjC0EDvB%ZkqqyD_@N)TE z>I+TSTRGwT;}x1pJAJV3&HVw=WPxZ!SN0fM7IsxdZ*FOo(CvFqdSQ7R7yH;b?Xp;` ze`fi|@!HmN?|{hdtnt$vhahEH**T72|3h9URM5Y9UjE>AX+rMhvya}{3xwY^+hgA(<+^Hp#Z@N z9xDQ3e{dq1unNNU!`$PkNx^DVzRoeN{QNUsc>ru;k+=MJPUJ9mb)zE~98?%l6MrN2 z;(jJ`^q-L}a3zrLXs?m_egrJ+J=~a;rA2b_{Hn3KM4X5gov@~X9kKj%K*&7eB7Udm z%6>xH+iu<d)p+=UM+D_U~O_{=jp0WKs*$8@AePP|F}CMd z`|MKHIUg=gc!`$jBvp+`cCR&&(|^8co7@M3s_G)+au}HF2Zb8ismJ8+&Z7!Hw4Y{> zfBZbBDqkhO-!{j*i78f5XJYop#46GW#ITZt`xKIfvqvOzMKblind-oo{A7QYt?yPx z@>rQW@m}nFs^~(mEfoJn>7*j#yf#w@dU(_E=cwdX-y5Q^2k;!yt5BZFH&a0y>{Kae z)R6pnpuRE{swPbN_CVAJ`ZhI&e6vOs z^7SMyYza@H7lx7*(yQ@=q^vOqKOVS)SIoD*(f9I5V8{V@g>jk@hz2V_C=?;DmhybbZ? z?!RjgS0vrY|4~7+kn=Zv>G)i&>8_lI!twR68G?9KQH?-!?KZuHh|9H3>!BipOR_T} zD9N&=<%QQOUa@v&1=nkXkevzfaIys=XZSj%-`e|r1kR(x*4LSV_b zY2?6Pe-D&xR4>`q8-3gB>6-f^J-FkBH2=*Ci+G}EUZNI3Am z2aXQr>@Vw@uJAw}#N)NGc>CqbnygTNhO=9zz;l+l&x*ZWGR{-SxaRJV$l2N!jqV?K z9oX%iFLgxscL~~Hc*U%*HcrZX^w0=(+$VXqK)dK$@$>g&;OHNDPbGJG;9?Do*DUYH z8B;9N)>+?rAMJDZqI^~{^t2OTEv9@P!bnGL@a0{MVhXJg<>;Br9Z^WV5*Bw-WLF4qA$6mc{?BJ$v@|`UyHXfrzK3cNqfpQ)PSy=Mb*Epy$?KIq^+J0KTxp zfDxVlG?YlhC~5x`8g{V(SSB@!8qW8&enI}(;ja1 zeV3V`C!B{M_%$L$;vT3AjS9|+=+!yTD=73iG(y7&dv@`m@>8KHiDmfkR8+pys*`9* zCg)>h;q#d=ZrA{xB+*8cGX+@3!*`gPK9as91y6g28T^jMNZ|WVe=&xD)sW7HPa(IJ z3dUWlLWJnC^uL~ZxLLYf)UuqhgJ$E}OMa!UDOL=Us7E%(j(b zJzR%=S#f535WIL01s*S)U3hwik>nZ=KU^)|_^_nrIN` z!C9si#HYPvFxdz;2T0{JCg=(;-BDG^d?7e4ui6@%JbDPVVCr0w21@Pu4z-_Z(aBRt zMZaPKd?cO^e@*@~-qu@H!8RR8^Cn&uCXi?HarJxY@T0229t|s-q*E_SKLb2huSztmwMf3Vcg|*M+a6C|T}bVit-@oq+6NSo zO5h~G$0?Wj_DPdf)u|ra`iuW2IB7q;>V#dTJ@m>>?K@eT=Mt(ZLS z&pU(772AWjUDZKXU1NYvcnqm-VaWQZyY2B1?0CF$W)k;y%u%su0(&qq-Qnw6&%wZv z;#TKly?=0ohpjw9p@*YG_Ek&U&wn2Kc0%f^?`EVU;1ZUx0TQ%Ou91PL*~FA~;bc3C z04jUXh*oTsa{KH_(A_**^a+UvhAN>G&;mNA`+B+r>qN`(@Qr*FUg%phLYzlDzylGU zCcmy0fF0<+fC}PQSkDNB%PA;c+|0~LhHc2f=JZjjBBXX<0>KBH9-MpB@4L==uvzob zXyLbaYkzxU%8k=v)@2EXPr?wU-FCP{GBk8(1dZX|=f8Elm|-&-a49%)PW|WnEr%kJ z0UM-+Y1n+-huVL6LHV_8mfR9sclX;@5)WS%JsPrGPAxcm3O@+}mMvSJ3B3@!SXO*I z%pV^c>rz#3Kqv*0&pcjV8mf~}O0X^Fkquc7oF9hl5yY0|UR)w>=cpdVVE$vd&``RB z>>^6K6c6W4#?2ATQz#w1wph=aQP#uaHSTkFE{*m;?coSNlJl89<{Q1mq5{Cy;&V1w zE&WFd?DfO#r}i|Us*0_GOMZ}9of%z|J=pg$?|@2VILOS;&BgSJeHL8J^N2{$+qV!t zcq+D?jI(4^LyDVhtDAM!w73oel#-etBy(=m(UUK1WrgYx{X)@Gz{H!bTQta(J4WcO%G^BG8L=Nr`=QtQ zBWx7ZKjS5{Ugi7z4=faX{i}?-g1&*HK8q3*tYq3m%P#7@qH2LNrj1Z3=JlV>Y9IHV zft~;rNL6EZNEJnJf=S3@1p(D(zFCl>4;qBjJj>>jO(C0&5HCxGEwtm6`s!;j&~(;D z^#N7OyPC0jep!X;GYjOA1Y9|4yJ7lQMBezkDX=1V;2mSlG@`hBWO1L=VyC*Ju=jjQ zRj<;yU66;!m+LD@l0HgK?z(SQO-t?>8!8GkzEKt!;~pu2Q_DO)TkTxSL)GV=m>UZv z@e9!mu#Uz_h?J%430&Ll_T0E~io>W1qc*CvMucD4PXJSCDe_skU z))S=%)`6dYYRWe&_{}tWN~n`kUY<(V0%=x`uBh;;$;A@*evF4%_X=Dj$Ozr5)IX)` zc+G2M-mPe^W|Ub7(OoYv2gMi^IgAv0(|{_)1#Vsrq}!d}s9*DPV4FG<%~t6?@?l_L zrxPtO-#VC@_WB|CH7NfEw&YVD=Ot!$L@zW;CW*xI*% zSY3kOWy6Rs7O;Sez<#?H`|KXQm$i?%#`I^6ChOXk7o)XPp;J>p3$`j*qwyD)S=K~1 zkgQa1i7QM^T(mJ-!A(1t^$(z&Im8Q*Gg$nEKKddxAj=I2BY+>9!tI%==D*u5g}h}0 z16T8E!CU_Fe2{U&GP}l+Ikgit9ZRwcO#F3Z1bZ`lCtJW|P+-Gn?IMb+S?L_{r_I>hAjC!^j6WKT^ z+h*%Ec6C~^U<&Ux%Q>>t{u3eBu2w*u6xG|0Kvs*_a-Zl^-;M9TfAvbLM6RhR>|}~0 zXzN2uzt4TN>X*LuMA42vQyW{i*atj@Tz$@=u(O@fSm1NRDtF}sfb9GkAt2D6B*3+e zoMf{VUP#KYgwJp(Y$Xftu}eT3z*BfwbBY1|?}Ju025Gz)`C!)Fn$c@%DKeH9p*i5r z|A^3dli?OB(g*mIUOL#oflg-xWc;+hW!~NM>BFQDaJ8mc2;#pN>{^07i zoC`;RW}2OOisle==biUXQKS2L-d`gX-bayNe^AJ(odnz=ocH}+-sm_dGcF{j;Y@8M zc{r!aCtJ%ObHzA#-x-RhFWX^a3SU(R{5isc#kPxX%{G0UwK#&iH!j6)$^1WGW0YAY z_4&JB-%iLOS)5cfcUYG|&Vhb*6u=vr4Gdf1+ufOME1f%8x}z22$wZMjn9!j*i;$TY zx1Fc874vqp~Ok6kuzvAk%5j>2;c z?s%WMd8m8ZLtepxAN%xJk3U#Nv-K5^J`|xdEgzT9pjl+J)u51TXapxIDbBk29^qAs z*pGF~YBfdRkmFtN=-g`;`T6+zBX@+lOZH=_hoj0(_Yhe#b5m~>OOmP5e!bVa(6Uow z?XXR13figIM@3K`B(1HnKX*(NW=<_hyeGC4^G@bqJjyd28eW`!q0unmS&c6w=pWfV zzN$H4>?TGio@OIc3QfozeKm4`*xQ$Oo6Xcu1&16`n3UjWaNf!kytLqM zcV5(_$4kjPDV(CFCkAxBXC;}TQlVsDFBQA&<&pIWMNB-apT=F{X}lEJnxh^%D})N6 zS;_ca=!di>=B$VZ3!&~8ZaS-3DQjoOqQ%yMU6QhhUCEd!f!E@S;1cVLXX!?FWr8lOO*&8=2olS;EfZT|(I-X9selD?$A~zBR z{kL^;T;I#JIQ6v*u3JQdq{TFqTHEa6hE_ZS8BE_= z{eO2V7|>z{_bU?fhNfG4Tmw1G20#(}{b%dSQ+_2Yndq>*9ETbUO- zu2keDo0gh&E+ZLvC9Ia7RV)YfIg77gqYTBp2R#@&#IfOVzSE_nPC4G@rOrj>%e;Kw zALTo@WC>QOJ#lMZL7fk0*&JtjraO~7SI>O0@__Y|UM|_VyhXb6YO?n!7j&<`ZdT;} z{Tqy2BAq{SCP`F}g9o}xQAg#MimC59^s#T8VmfMcG4x=i*-Ik%mv!*5d8|9&qK6riFa^RF>XzXuu8?T65O zQTW#&+MG_B2#QGljJZc+(ro<#SYRJ|?Uwcn!NkyaSGiG{ZRSJun18+M9D1w(C7bbl zxy5OewNLV9;8Bs+5hSHM&R{;`z6vEysN()*YwTrqP%AOgI`-(@Ct8v8jK^0bpOzSx zu-Lrl<4|dS%W~-m^8G9qepnEj&%-MZ(8Ub@Rje+#>E(F=2{KO{2)Zh)|HZ?M|mU%zTRPcgX0+Y29YOqrLP^w_pdCof7dY$QAO49b%{{Z{m zRHYgEOJCo^-{9sAxq9h*!zyBXE%CA2h28kyy>9hoIfJ#5cvu)xOH&fx9Fu5i=-;hW Hvy1sZ&hyCs literal 0 HcmV?d00001 diff --git a/test/reference/record-replay-extend-repeat.pdf.argb32.ref.png b/test/reference/record-replay-extend-repeat.pdf.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..4df03138944f2bbca7694b6737bc2f9558de18b1 GIT binary patch literal 8785 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 Y_q>Q#kFf)LM+6U`rmb3~{386n09sXPqyPW_ literal 0 HcmV?d00001 diff --git a/test/reference/record-replay-extend-repeat.pdf.rgb24.ref.png b/test/reference/record-replay-extend-repeat.pdf.rgb24.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..7efac20bdbdf67ab361bc8defa8cd45cf0e1b337 GIT binary patch literal 7620 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 literal 0 HcmV?d00001