diff --git a/gsk/gpu/gskgpuframe.c b/gsk/gpu/gskgpuframe.c index fa8f0d7a10..f28ded21fc 100644 --- a/gsk/gpu/gskgpuframe.c +++ b/gsk/gpu/gskgpuframe.c @@ -220,7 +220,7 @@ gsk_gpu_frame_seal_ops (GskGpuFrame *self) { GskGpuFramePrivate *priv = gsk_gpu_frame_get_instance_private (self); GskGpuOp *last, *op; - guint i; + gsize i; priv->first_op = (GskGpuOp *) gsk_gpu_ops_index (&priv->ops, 0); diff --git a/gsk/gpu/shaders/gskgpuborder.glsl b/gsk/gpu/shaders/gskgpuborder.glsl index e1b0a86acd..f53d88d271 100644 --- a/gsk/gpu/shaders/gskgpuborder.glsl +++ b/gsk/gpu/shaders/gskgpuborder.glsl @@ -18,37 +18,68 @@ vec4 compute_color (void) { uint triangle_index = uint (GSK_VERTEX_INDEX) / 3u; - uint index; + uint index, fallback; switch (triangle_index) { case 2u * SLICE_TOP_LEFT + 1u: + index = TOP; + fallback = LEFT; + break; case 2u * SLICE_TOP: case 2u * SLICE_TOP + 1u: + index = TOP; + fallback = TOP; + break; case 2u * SLICE_TOP_RIGHT: index = TOP; + fallback = RIGHT; break; case 2u * SLICE_TOP_RIGHT + 1u: + index = RIGHT; + fallback = TOP; + break; case 2u * SLICE_RIGHT: case 2u * SLICE_RIGHT + 1u: + index = RIGHT; + fallback = RIGHT; + break; case 2u * SLICE_BOTTOM_RIGHT: index = RIGHT; + fallback = BOTTOM; break; case 2u * SLICE_BOTTOM_RIGHT + 1u: + index = BOTTOM; + fallback = RIGHT; + break; case 2u * SLICE_BOTTOM: case 2u * SLICE_BOTTOM + 1u: + index = BOTTOM; + fallback = BOTTOM; + break; case 2u * SLICE_BOTTOM_LEFT: index = BOTTOM; + fallback = LEFT; break; case 2u * SLICE_BOTTOM_LEFT + 1u: + index = LEFT; + fallback = BOTTOM; + break; case 2u * SLICE_LEFT: case 2u * SLICE_LEFT + 1u: + index = LEFT; + fallback = LEFT; + break; case 2u * SLICE_TOP_LEFT: index = LEFT; + fallback = TOP; break; } - return color_premultiply (in_border_colors[index]); + if (in_border_widths[index] > 0.0) + return color_premultiply (in_border_colors[index]); + else + return color_premultiply (in_border_colors[fallback]); } void diff --git a/testsuite/gsk/compare/border-zero-width-color.node b/testsuite/gsk/compare/border-zero-width-color.node new file mode 100644 index 0000000000..5987c176bf --- /dev/null +++ b/testsuite/gsk/compare/border-zero-width-color.node @@ -0,0 +1,8 @@ +clip { + clip: 0 0 50 50; + child: border { + colors: rgb(255,0,0) rgb(0,255,0); + outline: -15 -15 80 80 / 40; + widths: 40 0; + } +} diff --git a/testsuite/gsk/compare/border-zero-width-color.png b/testsuite/gsk/compare/border-zero-width-color.png new file mode 100644 index 0000000000..e3295db442 Binary files /dev/null and b/testsuite/gsk/compare/border-zero-width-color.png differ diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index d8dc7e64da..87d6384c9e 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -27,6 +27,7 @@ compare_render_tests = [ 'border-bottom-right', 'border-one-rounded', 'border-opacity', + 'border-zero-width-color', 'borders-rotated', 'borders-scaled', 'clip-contained',