--- a/gfx/webrender/res/ps_border_corner.glsl
+++ b/gfx/webrender/res/ps_border_corner.glsl
@@ -14,16 +14,18 @@ flat varying vec4 vColorEdgeLine;
// Border radius
flat varying vec2 vClipCenter;
flat varying vec4 vRadii0;
flat varying vec4 vRadii1;
flat varying vec2 vClipSign;
flat varying vec4 vEdgeDistance;
flat varying float vSDFSelect;
+flat varying float vIsBorderRadiusLessThanBorderWidth;
+
// Border style
flat varying float vAlphaSelect;
#ifdef WR_FEATURE_TRANSFORM
varying vec3 vLocalPos;
#else
varying vec2 vLocalPos;
#endif
@@ -175,16 +177,18 @@ void main(void) {
border.widths.xy,
adjusted_widths.xy);
set_edge_line(border.widths.xy,
corners.tl_outer,
vec2(1.0, 1.0));
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: {
p0 = vec2(corners.tr_inner.x, corners.tr_outer.y);
p1 = vec2(corners.tr_outer.x, corners.tr_inner.y);
color0 = border.colors[1];
color1 = border.colors[2];
vClipCenter = corners.tr_outer + vec2(-border.radii[0].z, border.radii[0].w);
@@ -199,16 +203,18 @@ void main(void) {
set_edge_line(border.widths.zy,
corners.tr_outer,
vec2(-1.0, 1.0));
edge_distances = vec4(p1.x - adjusted_widths.z,
p0.y + adjusted_widths.y,
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: {
p0 = corners.br_inner;
p1 = corners.br_outer;
color0 = border.colors[2];
color1 = border.colors[3];
vClipCenter = corners.br_outer - border.radii[1].xy;
@@ -223,16 +229,18 @@ void main(void) {
set_edge_line(border.widths.zw,
corners.br_outer,
vec2(-1.0, -1.0));
edge_distances = vec4(p1.x - adjusted_widths.z,
p1.y - adjusted_widths.w,
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: {
p0 = vec2(corners.bl_outer.x, corners.bl_inner.y);
p1 = vec2(corners.bl_inner.x, corners.bl_outer.y);
color0 = border.colors[3];
color1 = border.colors[0];
vClipCenter = corners.bl_outer + vec2(border.radii[1].z, -border.radii[1].w);
@@ -247,16 +255,18 @@ void main(void) {
set_edge_line(border.widths.xw,
corners.bl_outer,
vec2(1.0, -1.0));
edge_distances = vec4(p0.x + adjusted_widths.x,
p1.y - adjusted_widths.w,
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].xy,
+ border.widths.zw)) ? 1.0 : 0.0;
break;
}
}
switch (style) {
case BORDER_STYLE_DOUBLE: {
vEdgeDistance = edge_distances;
vAlphaSelect = 0.0;
@@ -327,17 +337,18 @@ void main(void) {
float aa_range = compute_aa_range(local_pos);
float distance_for_color;
float color_mix_factor;
// 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,
// however, we are interested in the center of the pixels which introduces an
// error of half a pixel towards the exterior of the curve (See issue #1750).
// This error is corrected by offsetting the distance by half a device pixel.
// This not entirely correct: it leaves an error that varries between
// 0 and (sqrt(2) - 1)/2 = 0.2 pixels but it is hardly noticeable and is better