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

gpu: Draw proper shadows again

Closes #6888

See merge request GNOME/gtk!7518
This commit is contained in:
Benjamin Otte
2024-07-30 00:19:37 +00:00
10 changed files with 45 additions and 10 deletions

View File

@@ -2445,8 +2445,8 @@ gsk_gl_render_job_visit_blurred_outset_shadow_node (GskGLRenderJob *job,
const GskRenderNode *node) const GskRenderNode *node)
{ {
const GskRoundedRect *outline = gsk_outset_shadow_node_get_outline (node); const GskRoundedRect *outline = gsk_outset_shadow_node_get_outline (node);
float scale_x = job->scale_x; float scale_x = fabsf (job->scale_x);
float scale_y = job->scale_y; float scale_y = fabsf (job->scale_y);
float blur_radius = gsk_outset_shadow_node_get_blur_radius (node); float blur_radius = gsk_outset_shadow_node_get_blur_radius (node);
float blur_extra = blur_radius * 2.0f; /* 2.0 = shader radius_multiplier */ float blur_extra = blur_radius * 2.0f; /* 2.0 = shader radius_multiplier */
float half_blur_extra = blur_extra / 2.0f; float half_blur_extra = blur_extra / 2.0f;
@@ -2577,8 +2577,8 @@ gsk_gl_render_job_visit_blurred_outset_shadow_node (GskGLRenderJob *job,
&offscreen, &offscreen,
texture_width, texture_width,
texture_height, texture_height,
blur_radius * fabsf (scale_x), blur_radius * scale_x,
blur_radius * fabsf (scale_y)); blur_radius * scale_y);
gsk_gl_shadow_library_insert (job->driver->shadows_library, gsk_gl_shadow_library_insert (job->driver->shadows_library,
&scaled_outline, &scaled_outline,

View File

@@ -2104,7 +2104,7 @@ gsk_gpu_node_processor_add_inset_shadow_node (GskGpuNodeProcessor *self,
spread = gsk_inset_shadow_node_get_spread (node); spread = gsk_inset_shadow_node_get_spread (node);
blur_radius = gsk_inset_shadow_node_get_blur_radius (node); blur_radius = gsk_inset_shadow_node_get_blur_radius (node);
if (blur_radius == 0) if (blur_radius < 0.01)
{ {
float color[4]; float color[4];
@@ -2156,7 +2156,7 @@ gsk_gpu_node_processor_add_outset_shadow_node (GskGpuNodeProcessor *self,
dx = gsk_outset_shadow_node_get_dx (node); dx = gsk_outset_shadow_node_get_dx (node);
dy = gsk_outset_shadow_node_get_dy (node); dy = gsk_outset_shadow_node_get_dy (node);
if (blur_radius == 0) if (blur_radius < 0.01)
{ {
GskRoundedRect outline; GskRoundedRect outline;
float color[4]; float color[4];

View File

@@ -111,14 +111,18 @@ blur_corner (vec2 p,
if (min (r.x, r.y) <= 0.0) if (min (r.x, r.y) <= 0.0)
return 0.0; return 0.0;
p /= _sigma;
r /= _sigma;
float result = 0.0; float result = 0.0;
float step = max (1.0, r.y / 8.0); float start = max (p.y - 3.0, 0.0);
for (float y = 0.5 * step; y <= r.y; y += step) float end = min (p.y + 3.0, r.y);
float step = (end - start) / 7.0;
for (float y = start; y <= end; y += step)
{ {
float x = r.x - ellipse_x (r, r.y - y); float x = r.x - ellipse_x (r, r.y - y);
result -= gauss (p.y - y, _sigma.y) * erf_range (vec2 (- p.x, x - p.x), _sigma.x); result -= gauss (p.y - y, 1.0) * erf_range (vec2 (- p.x, x - p.x), 1.0);
} }
return result; return step * result;
} }
float float

View File

@@ -0,0 +1,10 @@
clip {
clip: 1400 1400 20 20;
child: color-matrix {
matrix: matrix3d(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255);
child: outset-shadow {
blur: 1000;
outline: 0 0 1000 1000 / 1000 0 1000 0;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

View File

@@ -0,0 +1,11 @@
color {
bounds: 0 0 100 100;
color: rgba(0,0,0,0);
}
clip {
clip: 10 10 20 20;
child: outset-shadow {
blur: 0.00001;
outline: 0 0 100 100 / 100 0 100 0;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

View File

@@ -0,0 +1,7 @@
clip {
clip: 0 0 15 15;
child: outset-shadow {
blur: 10;
outline: 0 0 100 100 / 100 0 100 0;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -119,6 +119,9 @@ compare_render_tests = [
'opacity-colormatrix-combinations', 'opacity-colormatrix-combinations',
'opacity-overdraw', 'opacity-overdraw',
'opacity-overlapping-children', 'opacity-overlapping-children',
'outset-shadow-corner-blur',
'outset-shadow-corner-blur-huge-nocairo-nogl',
'outset-shadow-corner-blur-tiny',
'outset_shadow_offset_both', 'outset_shadow_offset_both',
'outset_shadow_offset_x', 'outset_shadow_offset_x',
'outset_shadow_offset_y', 'outset_shadow_offset_y',