Merge branch 'wip/otte/for-main' into 'main'

gpu: Don't oversize node image

Closes #6380 and #6425

See merge request GNOME/gtk!6899
This commit is contained in:
Benjamin Otte 2024-02-13 21:14:20 +00:00
commit afb75bedfe
6 changed files with 79 additions and 26 deletions

View File

@ -748,6 +748,8 @@ gsk_gpu_node_processor_create_offscreen (GskGpuFrame *frame,
gsk_render_node_get_preferred_depth (node), gsk_render_node_get_preferred_depth (node),
scale, scale,
viewport); viewport);
if (image == NULL)
return NULL;
gsk_gpu_node_processor_add_node (&self, node); gsk_gpu_node_processor_add_node (&self, node);
@ -950,9 +952,13 @@ gsk_gpu_node_processor_get_node_as_image (GskGpuNodeProcessor *self,
{ {
if (!gsk_gpu_node_processor_clip_node_bounds (self, node, &clip)) if (!gsk_gpu_node_processor_clip_node_bounds (self, node, &clip))
return NULL; return NULL;
clip_bounds = &clip;
} }
rect_round_to_pixels (clip_bounds, &self->scale, &self->offset, &clip); else
{
if (!gsk_rect_intersection (clip_bounds, &node->bounds, &clip))
return NULL;
}
rect_round_to_pixels (&clip, &self->scale, &self->offset, &clip);
image = gsk_gpu_get_node_as_image (self->frame, image = gsk_gpu_get_node_as_image (self->frame,
&clip, &clip,
@ -997,36 +1003,25 @@ gsk_gpu_node_processor_blur_op (GskGpuNodeProcessor *self,
graphene_vec2_t direction; graphene_vec2_t direction;
graphene_rect_t clip_rect, intermediate_rect; graphene_rect_t clip_rect, intermediate_rect;
graphene_point_t real_offset; graphene_point_t real_offset;
int width, height;
float clip_radius; float clip_radius;
clip_radius = gsk_cairo_blur_compute_pixels (blur_radius / 2.0); clip_radius = gsk_cairo_blur_compute_pixels (blur_radius / 2.0);
/* FIXME: Handle clip radius growing the clip too much */ /* FIXME: Handle clip radius growing the clip too much */
gsk_gpu_node_processor_get_clip_bounds (self, &clip_rect); gsk_gpu_node_processor_get_clip_bounds (self, &clip_rect);
clip_rect.origin.x -= shadow_offset->x;
clip_rect.origin.y -= shadow_offset->y;
graphene_rect_inset (&clip_rect, 0.f, -clip_radius); graphene_rect_inset (&clip_rect, 0.f, -clip_radius);
if (!gsk_rect_intersection (rect, &clip_rect, &intermediate_rect)) if (!gsk_rect_intersection (rect, &clip_rect, &intermediate_rect))
return; return;
width = ceilf (graphene_vec2_get_x (&self->scale) * intermediate_rect.size.width); rect_round_to_pixels (&intermediate_rect, &self->scale, &self->offset, &intermediate_rect);
height = ceilf (graphene_vec2_get_y (&self->scale) * intermediate_rect.size.height);
intermediate = gsk_gpu_device_create_offscreen_image (gsk_gpu_frame_get_device (self->frame), intermediate = gsk_gpu_node_processor_init_draw (&other,
FALSE, self->frame,
source_depth, source_depth,
width, height); &self->scale,
&intermediate_rect);
gsk_gpu_node_processor_init (&other,
self->frame,
source_desc,
intermediate,
&(cairo_rectangle_int_t) { 0, 0, width, height },
&intermediate_rect);
gsk_gpu_render_pass_begin_op (other.frame,
intermediate,
&(cairo_rectangle_int_t) { 0, 0, width, height },
GSK_RENDER_PASS_OFFSCREEN);
gsk_gpu_node_processor_sync_globals (&other, 0); gsk_gpu_node_processor_sync_globals (&other, 0);
@ -1040,11 +1035,7 @@ gsk_gpu_node_processor_blur_op (GskGpuNodeProcessor *self,
source_rect, source_rect,
&direction); &direction);
gsk_gpu_render_pass_end_op (other.frame, gsk_gpu_node_processor_finish_draw (&other, intermediate);
intermediate,
GSK_RENDER_PASS_OFFSCREEN);
gsk_gpu_node_processor_finish (&other);
real_offset = GRAPHENE_POINT_INIT (self->offset.x + shadow_offset->x, real_offset = GRAPHENE_POINT_INIT (self->offset.x + shadow_offset->x,
self->offset.y + shadow_offset->y); self->offset.y + shadow_offset->y);

View File

@ -0,0 +1,10 @@
clip {
clip: -20000 0 50 50;
child: shadow {
shadows: red -20000 0 0;
child: color {
bounds: 0 0 50 50;
color: blue;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View File

@ -0,0 +1,50 @@
clip {
clip: 10 -10 40 20;
child: shadow {
shadows: red 60 0 1;
child: color {
bounds: -25 -25 50 50;
color: blue;
}
}
}
clip {
clip: -50 -10 40 20;
child: shadow {
shadows: red -60 0 1;
child: color {
bounds: -25 -25 50 50;
color: blue;
}
}
}
clip {
clip: -10 10 20 40;
child: shadow {
shadows: red 0 60 1;
child: color {
bounds: -25 -25 50 50;
color: blue;
}
}
}
clip {
clip: -10 -50 20 40;
child: shadow {
shadows: red 0 -60 1;
child: color {
bounds: -25 -25 50 50;
color: blue;
}
}
}
/* cover the blur */
border {
outline: -37 -37 74 74;
colors: black;
widths: 4;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

View File

@ -137,7 +137,9 @@ compare_render_tests = [
'scale0-crash', 'scale0-crash',
'shadow-behind', 'shadow-behind',
'shadow-clip-contents', 'shadow-clip-contents',
'shadow-huge-offset',
'shadow-in-opacity', 'shadow-in-opacity',
'shadow-offset-clip',
'shadow-offset-to-outside-clip', 'shadow-offset-to-outside-clip',
'shadow-opacity', 'shadow-opacity',
'shrink-rounded-border', 'shrink-rounded-border',