diff --git a/webrender/res/ps_border_corner.glsl b/webrender/res/ps_border_corner.glsl index f78863cd4e..9933dd4f4f 100644 --- a/webrender/res/ps_border_corner.glsl +++ b/webrender/res/ps_border_corner.glsl @@ -19,6 +19,8 @@ flat varying vec2 vClipSign; flat varying vec4 vEdgeDistance; flat varying float vSDFSelect; +flat varying float vIsBorderRadiusLessThanBorderWidth; + // Border style flat varying float vAlphaSelect; @@ -180,6 +182,8 @@ void main(void) { edge_distances = vec4(p0 + adjusted_widths.xy, p0 + inv_adjusted_widths.xy); color_delta = vec2(1.0); + vIsBorderRadiusLessThanBorderWidth = any(lessThan(border.radii[0].xy, + border.widths.xy)) ? 1.0 : 0.0; break; } case 1: { @@ -204,6 +208,8 @@ void main(void) { p1.x - border.widths.z + adjusted_widths.z, p0.y + inv_adjusted_widths.y); color_delta = vec2(1.0, -1.0); + vIsBorderRadiusLessThanBorderWidth = any(lessThan(border.radii[0].zw, + border.widths.zy)) ? 1.0 : 0.0; break; } case 2: { @@ -228,6 +234,8 @@ void main(void) { p1.x - border.widths.z + adjusted_widths.z, p1.y - border.widths.w + adjusted_widths.w); color_delta = vec2(-1.0); + vIsBorderRadiusLessThanBorderWidth = any(lessThan(border.radii[1].xy, + border.widths.zw)) ? 1.0 : 0.0; break; } case 3: { @@ -252,6 +260,8 @@ void main(void) { p0.x + inv_adjusted_widths.x, p1.y - border.widths.w + adjusted_widths.w); color_delta = vec2(-1.0, 1.0); + vIsBorderRadiusLessThanBorderWidth = any(lessThan(border.radii[1].zw, + border.widths.xw)) ? 1.0 : 0.0; break; } } @@ -332,7 +342,8 @@ void main(void) { // Only apply the clip AA if inside the clip region. This is // necessary for correctness when the border width is greater // than the border radius. - if (all(lessThan(local_pos * vClipSign, vClipCenter * vClipSign))) { + if (vIsBorderRadiusLessThanBorderWidth == 0.0 || + all(lessThan(local_pos * vClipSign, vClipCenter * vClipSign))) { vec2 p = local_pos - vClipCenter; // The coordinate system is snapped to pixel boundaries. To sample the distance, diff --git a/wrench/reftests/border/border-no-bogus-line-ref.png b/wrench/reftests/border/border-no-bogus-line-ref.png new file mode 100644 index 0000000000..52344a03fe Binary files /dev/null and b/wrench/reftests/border/border-no-bogus-line-ref.png differ diff --git a/wrench/reftests/border/border-no-bogus-line.yaml b/wrench/reftests/border/border-no-bogus-line.yaml new file mode 100644 index 0000000000..a030211da9 --- /dev/null +++ b/wrench/reftests/border/border-no-bogus-line.yaml @@ -0,0 +1,13 @@ +--- +root: + items: + - type: stacking-context + bounds: [0, 0, 100, 100] + items: + - type: border + bounds: [ 10, 10, 90, 80 ] + width: 3 + border-type: normal + style: solid + color: [ black, black, black, black ] + radius: 40.5 diff --git a/wrench/reftests/border/border-suite-2.png b/wrench/reftests/border/border-suite-2.png index d18b4369ca..24c25d39c3 100644 Binary files a/wrench/reftests/border/border-suite-2.png and b/wrench/reftests/border/border-suite-2.png differ diff --git a/wrench/reftests/border/reftest.list b/wrench/reftests/border/reftest.list index ecd4a9d984..c68b544581 100644 --- a/wrench/reftests/border/reftest.list +++ b/wrench/reftests/border/reftest.list @@ -12,4 +12,4 @@ fuzzy(255,24) == border-ridge-simple.yaml border-ridge-simple-ref.yaml == border-image.yaml border-image-ref.png == border-image-crash.yaml border-image-crash-ref.yaml == border-image-fill.yaml border-image-fill-ref.png - +== border-no-bogus-line.yaml border-no-bogus-line-ref.png