gpu: Blur opaque textures correctly

Opaque textures don't clamp to transparent but instead to black.
We didn't consider this, so we were blurring their edges into blackness
not into transparency.

Fix this by adding the GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS flag
and respecting it in the implementation that uses it.

Test included.

Fixes #6980
This commit is contained in:
Benjamin Otte 2024-09-08 07:58:23 +02:00
parent 85abff343e
commit 56fc8f0077
4 changed files with 226 additions and 4 deletions

View File

@ -113,7 +113,12 @@
typedef struct _GskGpuNodeProcessor GskGpuNodeProcessor;
typedef enum {
GSK_GPU_AS_IMAGE_UNUSED,
/* The returned image will be sampled outside the bounds, so it is
* important that it returns the right values.
* In particular, opaque textures must ensure they return transparency
* and images must not be contained in an atlas.
*/
GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS = (1 << 0),
} GskGpuAsImageFlags;
typedef enum {
@ -2214,7 +2219,9 @@ gsk_gpu_get_texture_node_as_image (GskGpuFrame *frame,
return gsk_gpu_get_node_as_image_via_offscreen (frame, flags, ccs, clip_bounds, scale, node, out_bounds);
if (!gdk_color_state_equal (ccs, image_cs) ||
gsk_gpu_image_get_flags (image) & GSK_GPU_IMAGE_STRAIGHT_ALPHA)
gsk_gpu_image_get_flags (image) & GSK_GPU_IMAGE_STRAIGHT_ALPHA ||
((flags & GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS) &&
gdk_memory_format_alpha (gsk_gpu_image_get_format (image)) == GDK_MEMORY_ALPHA_OPAQUE))
{
image = gsk_gpu_copy_image (frame, ccs, image, image_cs, FALSE);
gsk_gpu_cache_cache_texture_image (gsk_gpu_device_get_cache (gsk_gpu_frame_get_device (frame)),
@ -2672,7 +2679,7 @@ gsk_gpu_node_processor_add_blur_node (GskGpuNodeProcessor *self,
gsk_gpu_node_processor_get_clip_bounds (self, &clip_rect);
graphene_rect_inset (&clip_rect, -clip_radius, -clip_radius);
image = gsk_gpu_node_processor_get_node_as_image (self,
0,
GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS,
&clip_rect,
child,
&tex_rect);
@ -2711,7 +2718,7 @@ gsk_gpu_node_processor_add_shadow_node (GskGpuNodeProcessor *self,
clip_bounds.size.height + node->bounds.size.height - child->bounds.size.height);
image = gsk_gpu_node_processor_get_node_as_image (self,
0,
GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS,
&clip_bounds,
child,
&tex_rect);

View File

@ -0,0 +1,213 @@
color-matrix {
matrix: matrix3d(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 256);
/* We allow off by 2 here because this is all happening in float32,
* so rounding errors are common.
* And the shadow should never be > 50% coverage.
*/
offset: 0 0 0 -254;
child: container {
shadow { shadows: black 0 0 10; child: texture { bounds: 0 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 50 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 100 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 150 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 200 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 250 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 300 0 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 0 50 30 30; texture: url('data:;base64,\
SUkqABQAAAD/AAD/AAD/AAD/AAAMAAABAwABAAAAAgAAAAEBAwABAAAAAgAAAAIBAwADAAAAqgAA\
AAMBAwABAAAAAQAAAAYBAwABAAAAAgAAABEBBAABAAAACAAAABIBAwABAAAAAQAAABUBAwABAAAA\
AwAAABcBBAABAAAADAAAABwBAwABAAAAAQAAADEBAgAEAAAAR1RLAFMBAwADAAAAsAAAAAAAAAAI\
AAgACAABAAEAAQA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 50 50 30 30; texture: url('data:;base64,\
SUkqABQAAAD/AAD/AAD/AAD/AAAMAAABAwABAAAAAgAAAAEBAwABAAAAAgAAAAIBAwADAAAAqgAA\
AAMBAwABAAAAAQAAAAYBAwABAAAAAgAAABEBBAABAAAACAAAABIBAwABAAAAAQAAABUBAwABAAAA\
AwAAABcBBAABAAAADAAAABwBAwABAAAAAQAAADEBAgAEAAAAR1RLAFMBAwADAAAAsAAAAAAAAAAI\
AAgACAABAAEAAQA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 100 50 30 30; texture: url('data:;base64,\
SUkqACAAAAD//wAAAAD//wAAAAD//wAAAAD//wAAAAAMAAABAwABAAAAAgAAAAEBAwABAAAAAgAA\
AAIBAwADAAAAtgAAAAMBAwABAAAAAQAAAAYBAwABAAAAAgAAABEBBAABAAAACAAAABIBAwABAAAA\
AQAAABUBAwABAAAAAwAAABcBBAABAAAAGAAAABwBAwABAAAAAQAAADEBAgAEAAAAR1RLAFMBAwAD\
AAAAvAAAAAAAAAAQABAAEAABAAEAAQA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 150 50 30 30; texture: url('data:;base64,\
SUkqACgAAAD//wAAAAD/////AAAAAP////8AAAAA/////wAAAAD//w0AAAEDAAEAAAACAAAAAQED\
AAEAAAACAAAAAgEDAAQAAADKAAAAAwEDAAEAAAABAAAABgEDAAEAAAACAAAAEQEEAAEAAAAIAAAA\
EgEDAAEAAAABAAAAFQEDAAEAAAAEAAAAFwEEAAEAAAAgAAAAHAEDAAEAAAABAAAAMQECAAQAAABH\
VEsAUgEDAAEAAAABAAAAUwEDAAQAAADSAAAAAAAAABAAEAAQABAAAQABAAEAAQA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 200 50 30 30; texture: url('data:;base64,\
SUkqACgAAAD//wAAAAD/////AAAAAP////8AAAAA/////wAAAAD//w0AAAEDAAEAAAACAAAAAQED\
AAEAAAACAAAAAgEDAAQAAADKAAAAAwEDAAEAAAABAAAABgEDAAEAAAACAAAAEQEEAAEAAAAIAAAA\
EgEDAAEAAAABAAAAFQEDAAEAAAAEAAAAFwEEAAEAAAAgAAAAHAEDAAEAAAABAAAAMQECAAQAAABH\
VEsAUgEDAAEAAAACAAAAUwEDAAQAAADSAAAAAAAAABAAEAAQABAAAQABAAEAAQA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 250 50 30 30; texture: url('data:;base64,\
SUkqACAAAAAAPB+ACgAAPB+ACgAAPB+ACgAAPB+ACgAMAAABAwABAAAAAgAAAAEBAwABAAAAAgAA\
AAIBAwADAAAAtgAAAAMBAwABAAAAAQAAAAYBAwABAAAAAgAAABEBBAABAAAACAAAABIBAwABAAAA\
AQAAABUBAwABAAAAAwAAABcBBAABAAAAGAAAABwBAwABAAAAAQAAADEBAgAEAAAAR1RLAFMBAwAD\
AAAAvAAAAAAAAAAQABAAEAADAAMAAwA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 300 50 30 30; texture: url('data:;base64,\
SUkqACgAAAAAPB+ACgAAPAA8H4AKAAA8ADwfgAoAADwAPB+ACgAAPA0AAAEDAAEAAAACAAAAAQED\
AAEAAAACAAAAAgEDAAQAAADKAAAAAwEDAAEAAAABAAAABgEDAAEAAAACAAAAEQEEAAEAAAAIAAAA\
EgEDAAEAAAABAAAAFQEDAAEAAAAEAAAAFwEEAAEAAAAgAAAAHAEDAAEAAAABAAAAMQECAAQAAABH\
VEsAUgEDAAEAAAABAAAAUwEDAAQAAADSAAAAAAAAABAAEAAQABAAAwADAAMAAwA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 0 100 30 30; texture: url('data:;base64,\
SUkqACgAAAAAPB+ACgAAPAA8H4AKAAA8ADwfgAoAADwAPB+ACgAAPA0AAAEDAAEAAAACAAAAAQED\
AAEAAAACAAAAAgEDAAQAAADKAAAAAwEDAAEAAAABAAAABgEDAAEAAAACAAAAEQEEAAEAAAAIAAAA\
EgEDAAEAAAABAAAAFQEDAAEAAAAEAAAAFwEEAAEAAAAgAAAAHAEDAAEAAAABAAAAMQECAAQAAABH\
VEsAUgEDAAEAAAACAAAAUwEDAAQAAADSAAAAAAAAABAAEAAQABAAAwADAAMAAwA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 50 100 30 30; texture: url('data:;base64,\
SUkqADgAAAACAIA/1yL2tcP1JzUCAIA/1yL2tcP1JzUCAIA/1yL2tcP1JzUCAIA/1yL2tcP1JzUM\
AAABAwABAAAAAgAAAAEBAwABAAAAAgAAAAIBAwADAAAAzgAAAAMBAwABAAAAAQAAAAYBAwABAAAA\
AgAAABEBBAABAAAACAAAABIBAwABAAAAAQAAABUBAwABAAAAAwAAABcBBAABAAAAMAAAABwBAwAB\
AAAAAQAAADEBAgAEAAAAR1RLAFMBAwADAAAA1AAAAAAAAAAgACAAIAADAAMAAwA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 100 100 30 30; texture: url('data:;base64,\
SUkqAEgAAAACAIA/1yL2tcP1JzUAAIA/AgCAP9ci9rXD9Sc1AACAPwIAgD/XIva1w/UnNQAAgD8C\
AIA/1yL2tcP1JzUAAIA/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAAAOoAAAADAQMA\
AQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAQAAAAX\
AQQAAQAAAEAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABTAQMABAAAAPIA\
AAAAAAAAIAAgACAAIAADAAMAAwADAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 150 100 30 30; texture: url('data:;base64,\
SUkqAEgAAAACAIA/1yL2tcP1JzUAAIA/AgCAP9ci9rXD9Sc1AACAPwIAgD/XIva1w/UnNQAAgD8C\
AIA/1yL2tcP1JzUAAIA/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAAAOoAAAADAQMA\
AQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAQAAAAX\
AQQAAQAAAEAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABTAQMABAAAAPIA\
AAAAAAAAIAAgACAAIAADAAMAAwADAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 200 100 30 30; texture: url('data:;base64,\
SUkqABAAAABV/1X/Vf9V/w0AAAEDAAEAAAACAAAAAQEDAAEAAAACAAAAAgEDAAIAAAAIAAgAAwED\
AAEAAAABAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAACAAAA\
FwEEAAEAAAAIAAAAHAEDAAEAAAABAAAAMQECAAQAAABHVEsAUgEDAAEAAAABAAAAUwEDAAIAAAAB\
AAEAAAAAAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 250 100 30 30; texture: url('data:;base64,\
SUkqABAAAABV/1X/Vf9V/w0AAAEDAAEAAAACAAAAAQEDAAEAAAACAAAAAgEDAAIAAAAIAAgAAwED\
AAEAAAABAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAACAAAA\
FwEEAAEAAAAIAAAAHAEDAAEAAAABAAAAMQECAAQAAABHVEsAUgEDAAEAAAACAAAAUwEDAAIAAAAB\
AAEAAAAAAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 300 100 30 30; texture: url('data:;base64,\
SUkqAAwAAABVVVVVDAAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMAAQAAAAgAAAADAQMAAQAA\
AAEAAAAGAQMAAQAAAAEAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAEAAAAXAQQA\
AQAAAAQAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBTAQMAAQAAAAEAAAAAAAAA\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 0 150 30 30; texture: url('data:;base64,\
SUkqABgAAABVVf//VVX//1VV//9VVf//DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMAAgAA\
ABAAEAADAQMAAQAAAAEAAAAGAQMAAQAAAAEAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAIAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABT\
AQMAAgAAAAEAAQAAAAAA\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 50 150 30 30; texture: url('data:;base64,\
SUkqABgAAABVVf//VVX//1VV//9VVf//DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMAAgAA\
ABAAEAADAQMAAQAAAAEAAAAGAQMAAQAAAAEAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAIAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMAAgAAAAEAAQAAAAAA\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 100 150 30 30; texture: url('data:;base64,\
SUkqABAAAABVVVVVVVVVVQwAAAEDAAEAAAACAAAAAQEDAAEAAAACAAAAAgEDAAEAAAAQAAAAAwED\
AAEAAAABAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAABAAAA\
FwEEAAEAAAAIAAAAHAEDAAEAAAABAAAAMQECAAQAAABHVEsAUwEDAAEAAAABAAAAAAAAAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 150 150 30 30; texture: url('data:;base64,\
SUkqABAAAAD//////////w0AAAEDAAEAAAACAAAAAQEDAAEAAAACAAAAAgEDAAIAAAAIAAgAAwED\
AAEAAAABAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAACAAAA\
FwEEAAEAAAAIAAAAHAEDAAEAAAABAAAAMQECAAQAAABHVEsAUgEDAAEAAAACAAAAUwEDAAIAAAAB\
AAEAAAAAAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 200 150 30 30; texture: url('data:;base64,\
SUkqABgAAAD/////////////////////DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMAAgAA\
ABAAEAADAQMAAQAAAAEAAAAGAQMAAQAAAAEAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAIAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAIAAABT\
AQMAAgAAAAEAAQAAAAAA\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 250 150 30 30; texture: url('data:;base64,\
SUkqACgAAAAAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPA0AAAEDAAEAAAACAAAAAQED\
AAEAAAACAAAAAgEDAAQAAADKAAAAAwEDAAEAAAABAAAABgEDAAEAAAACAAAAEQEEAAEAAAAIAAAA\
EgEDAAEAAAABAAAAFQEDAAEAAAAEAAAAFwEEAAEAAAAgAAAAHAEDAAEAAAABAAAAMQECAAQAAABH\
VEsAUgEDAAEAAAABAAAAUwEDAAQAAADSAAAAAAAAABAAEAAQABAAAwADAAMAAwA=\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 300 150 30 30; texture: url('data:;base64,\
SUkqAEgAAAABAIA//f9/P/n/fz8AAIA/AQCAP/3/fz/5/38/AACAPwEAgD/9/38/+f9/PwAAgD8B\
AIA//f9/P/n/fz8AAIA/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAAAOoAAAADAQMA\
AQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAQAAAAX\
AQQAAQAAAEAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABTAQMABAAAAPIA\
AAAAAAAAIAAgACAAIAADAAMAAwADAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 0 200 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAD//wAA//8AAP//AAD/DQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAEAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 50 200 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AABe/wAAAP8AAF7/AAAADQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAAAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 100 200 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AACF/wAAAP8AAIX/AAAADQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAAAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 150 200 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAAT/wAAAP8AAAD/AAAADQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAAAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
shadow { shadows: black 0 0 10; child: texture { bounds: 200 200 30 30; texture: url('data:;base64,\
SUkqABgAAAD/AAA7/wAAAP8AADv/AAAADQAAAQMAAQAAAAIAAAABAQMAAQAAAAIAAAACAQMABAAA\
ALoAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAIAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMA\
AQAAAAQAAAAXAQQAAQAAABAAAAAcAQMAAQAAAAEAAAAxAQIABAAAAEdUSwBSAQMAAQAAAAAAAABT\
AQMABAAAAMIAAAAAAAAACAAIAAgACAABAAEAAQABAA==\
'); } }
}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

View File

@ -172,6 +172,7 @@ compare_render_tests = [
'shadow-offset-to-outside-clip',
'shadow-opacity',
'shadow-replay-nocairo',
'shadow-texture-formats',
'shrink-rounded-border',
'stroke',
'stroke-clipped-nogl',
@ -266,6 +267,7 @@ compare_xfails = {
'opacity-overlapping-children': ['rotate'],
'scaled-texture-scale': ['rotate'],
'shadow-opacity': ['rotate'],
'shadow-texture-formats': ['rotate'],
'texture-scale-nearest-vs-linear': ['rotate'],
},
}