diff --git a/webrender/res/brush_line.glsl b/webrender/res/brush_line.glsl index 5464acb0ff..fbd66f41df 100644 --- a/webrender/res/brush_line.glsl +++ b/webrender/res/brush_line.glsl @@ -119,7 +119,7 @@ void brush_vs( #ifdef WR_FRAGMENT_SHADER -#define MAGIC_WAVY_LINE_AA_SNAP 0.7 +#define MAGIC_WAVY_LINE_AA_SNAP 0.5 vec4 brush_fs() { // Find the appropriate distance to apply the step over. diff --git a/webrender/res/prim_shared.glsl b/webrender/res/prim_shared.glsl index 7e7939b863..69d8c67954 100644 --- a/webrender/res/prim_shared.glsl +++ b/webrender/res/prim_shared.glsl @@ -16,6 +16,8 @@ #define SUBPX_DIR_HORIZONTAL 1 #define SUBPX_DIR_VERTICAL 2 +#define EPSILON 0.0001 + uniform sampler2DArray sCacheA8; uniform sampler2DArray sCacheRGBA8; @@ -736,7 +738,7 @@ void write_clip(vec2 global_pos, ClipArea area) { #ifdef WR_FRAGMENT_SHADER -/// Find the appropriate half range to apply the AA smoothstep over. +/// Find the appropriate half range to apply the AA approximation over. /// This range represents a coefficient to go from one CSS pixel to half a device pixel. float compute_aa_range(vec2 position) { // The constant factor is chosen to compensate for the fact that length(fw) is equal @@ -747,22 +749,41 @@ float compute_aa_range(vec2 position) { // such a pixel (axis aligned) is fully inside the border). We need this so that antialiased // curves properly connect with non-antialiased vertical or horizontal lines, among other things. // - // Using larger aa steps is quite common when rendering shapes with distance fields. - // It gives a smoother (although blurrier look) by extending the range that is smoothed - // to produce the anti aliasing. In our case, however, extending the range inside of - // the shape causes noticeable artifacts at the junction between an antialiased corner - // and a straight edge. + // Lines over a half-pixel away from the pixel center *can* intersect with the pixel square; + // indeed, unless they are horizontal or vertical, they are guaranteed to. However, choosing + // a nonzero area for such pixels causes noticeable artifacts at the junction between an anti- + // aliased corner and a straight edge. + // // We may want to adjust this constant in specific scenarios (for example keep the principled // value for straight edges where we want pixel-perfect equivalence with non antialiased lines // when axis aligned, while selecting a larger and smoother aa range on curves). return 0.35355 * length(fwidth(position)); } -/// Return the blending coefficient to for distance antialiasing. +/// Return the blending coefficient for distance antialiasing. /// /// 0.0 means inside the shape, 1.0 means outside. +/// +/// This cubic polynomial approximates the area of a 1x1 pixel square under a +/// line, given the signed Euclidean distance from the center of the square to +/// that line. Calculating the *exact* area would require taking into account +/// not only this distance but also the angle of the line. However, in +/// practice, this complexity is not required, as the area is roughly the same +/// regardless of the angle. +/// +/// The coefficients of this polynomial were determined through least-squares +/// regression and are accurate to within 2.16% of the total area of the pixel +/// square 95% of the time, with a maximum error of 3.53%. +/// +/// See the comments in `compute_aa_range()` for more information on the +/// cutoff values of -0.5 and 0.5. float distance_aa(float aa_range, float signed_distance) { - return 1.0 - smoothstep(-aa_range, aa_range, signed_distance); + float dist = 0.5 * signed_distance / aa_range; + if (dist <= -0.5 + EPSILON) + return 1.0; + if (dist >= 0.5 - EPSILON) + return 0.0; + return 0.5 + dist * (0.8431027 * dist * dist - 1.14453603); } float signed_distance_rect(vec2 pos, vec2 p0, vec2 p1) { diff --git a/wrench/reftests/aa/rounded-rects-ref.png b/wrench/reftests/aa/rounded-rects-ref.png index ee9d3da8ec..de6c178215 100644 Binary files a/wrench/reftests/aa/rounded-rects-ref.png and b/wrench/reftests/aa/rounded-rects-ref.png differ diff --git a/wrench/reftests/border/border-clamp-corner-radius-ref.png b/wrench/reftests/border/border-clamp-corner-radius-ref.png index 8d721e489e..69c73c92b2 100644 Binary files a/wrench/reftests/border/border-clamp-corner-radius-ref.png and b/wrench/reftests/border/border-clamp-corner-radius-ref.png differ diff --git a/wrench/reftests/border/border-no-bogus-line-ref.png b/wrench/reftests/border/border-no-bogus-line-ref.png index 221dbef55a..fefa2bcbce 100644 Binary files a/wrench/reftests/border/border-no-bogus-line-ref.png and b/wrench/reftests/border/border-no-bogus-line-ref.png differ diff --git a/wrench/reftests/border/border-radii.png b/wrench/reftests/border/border-radii.png index cdcc959cc6..87d5b674fd 100644 Binary files a/wrench/reftests/border/border-radii.png and b/wrench/reftests/border/border-radii.png differ diff --git a/wrench/reftests/border/border-suite-2.png b/wrench/reftests/border/border-suite-2.png index 771de3a8bd..87543f83d7 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/border-suite-3.png b/wrench/reftests/border/border-suite-3.png index d580a6f870..2c81176deb 100644 Binary files a/wrench/reftests/border/border-suite-3.png and b/wrench/reftests/border/border-suite-3.png differ diff --git a/wrench/reftests/border/border-suite.png b/wrench/reftests/border/border-suite.png index 71aa36d730..ebeba274df 100644 Binary files a/wrench/reftests/border/border-suite.png and b/wrench/reftests/border/border-suite.png differ diff --git a/wrench/reftests/border/degenerate-curve.png b/wrench/reftests/border/degenerate-curve.png index 5cc1303de0..d4cf073f2a 100644 Binary files a/wrench/reftests/border/degenerate-curve.png and b/wrench/reftests/border/degenerate-curve.png differ diff --git a/wrench/reftests/border/dotted-corner-small-radius.png b/wrench/reftests/border/dotted-corner-small-radius.png index f577272e59..4bcf6bba00 100644 Binary files a/wrench/reftests/border/dotted-corner-small-radius.png and b/wrench/reftests/border/dotted-corner-small-radius.png differ diff --git a/wrench/reftests/border/overlapping.png b/wrench/reftests/border/overlapping.png index 85558e53a8..38dcdc79e2 100644 Binary files a/wrench/reftests/border/overlapping.png and b/wrench/reftests/border/overlapping.png differ diff --git a/wrench/reftests/boxshadow/box-shadow-border-radii.png b/wrench/reftests/boxshadow/box-shadow-border-radii.png index 92ab23c209..242f110022 100644 Binary files a/wrench/reftests/boxshadow/box-shadow-border-radii.png and b/wrench/reftests/boxshadow/box-shadow-border-radii.png differ diff --git a/wrench/reftests/boxshadow/box-shadow-cache.png b/wrench/reftests/boxshadow/box-shadow-cache.png index 827ba9a974..6258bfdfc2 100644 Binary files a/wrench/reftests/boxshadow/box-shadow-cache.png and b/wrench/reftests/boxshadow/box-shadow-cache.png differ diff --git a/wrench/reftests/boxshadow/box-shadow-spread.png b/wrench/reftests/boxshadow/box-shadow-spread.png index b36f3b90a9..1b5cf39de5 100644 Binary files a/wrench/reftests/boxshadow/box-shadow-spread.png and b/wrench/reftests/boxshadow/box-shadow-spread.png differ diff --git a/wrench/reftests/boxshadow/box-shadow-suite-blur.png b/wrench/reftests/boxshadow/box-shadow-suite-blur.png index 150945d536..c5b08b2b84 100644 Binary files a/wrench/reftests/boxshadow/box-shadow-suite-blur.png and b/wrench/reftests/boxshadow/box-shadow-suite-blur.png differ diff --git a/wrench/reftests/boxshadow/box-shadow-suite-no-blur.png b/wrench/reftests/boxshadow/box-shadow-suite-no-blur.png index ebcc37f5c8..9fa59adc79 100644 Binary files a/wrench/reftests/boxshadow/box-shadow-suite-no-blur.png and b/wrench/reftests/boxshadow/box-shadow-suite-no-blur.png differ diff --git a/wrench/reftests/boxshadow/boxshadow-spread-only-ref.png b/wrench/reftests/boxshadow/boxshadow-spread-only-ref.png index a3d59d8bcc..31315a1ddf 100644 Binary files a/wrench/reftests/boxshadow/boxshadow-spread-only-ref.png and b/wrench/reftests/boxshadow/boxshadow-spread-only-ref.png differ diff --git a/wrench/reftests/boxshadow/inset-border-radius.png b/wrench/reftests/boxshadow/inset-border-radius.png index 17b3750c29..7914d9f386 100644 Binary files a/wrench/reftests/boxshadow/inset-border-radius.png and b/wrench/reftests/boxshadow/inset-border-radius.png differ diff --git a/wrench/reftests/boxshadow/inset-no-blur-radius-ref.png b/wrench/reftests/boxshadow/inset-no-blur-radius-ref.png index 76b975c17a..3ed0082be0 100644 Binary files a/wrench/reftests/boxshadow/inset-no-blur-radius-ref.png and b/wrench/reftests/boxshadow/inset-no-blur-radius-ref.png differ diff --git a/wrench/reftests/boxshadow/overlap1.png b/wrench/reftests/boxshadow/overlap1.png index d008a9e478..441745c181 100644 Binary files a/wrench/reftests/boxshadow/overlap1.png and b/wrench/reftests/boxshadow/overlap1.png differ diff --git a/wrench/reftests/boxshadow/overlap2.png b/wrench/reftests/boxshadow/overlap2.png index f29a9d17a4..4d9263378a 100644 Binary files a/wrench/reftests/boxshadow/overlap2.png and b/wrench/reftests/boxshadow/overlap2.png differ diff --git a/wrench/reftests/clip/clip-45-degree-rotation-ref.png b/wrench/reftests/clip/clip-45-degree-rotation-ref.png index 41d72d634d..4cfd3ed8e1 100644 Binary files a/wrench/reftests/clip/clip-45-degree-rotation-ref.png and b/wrench/reftests/clip/clip-45-degree-rotation-ref.png differ diff --git a/wrench/reftests/clip/clip-ellipse.png b/wrench/reftests/clip/clip-ellipse.png index b833a1522b..4962482557 100644 Binary files a/wrench/reftests/clip/clip-ellipse.png and b/wrench/reftests/clip/clip-ellipse.png differ diff --git a/wrench/reftests/clip/clip-mode.png b/wrench/reftests/clip/clip-mode.png index 96a0d38a8f..c0e7c61df9 100644 Binary files a/wrench/reftests/clip/clip-mode.png and b/wrench/reftests/clip/clip-mode.png differ diff --git a/wrench/reftests/gradient/linear-aligned-border-radius.png b/wrench/reftests/gradient/linear-aligned-border-radius.png index 62a8e83c66..55518031cd 100644 Binary files a/wrench/reftests/gradient/linear-aligned-border-radius.png and b/wrench/reftests/gradient/linear-aligned-border-radius.png differ diff --git a/wrench/reftests/gradient/repeat-border-radius.png b/wrench/reftests/gradient/repeat-border-radius.png index 81cbf2aaa1..10dd14b48a 100644 Binary files a/wrench/reftests/gradient/repeat-border-radius.png and b/wrench/reftests/gradient/repeat-border-radius.png differ diff --git a/wrench/reftests/image/segments.png b/wrench/reftests/image/segments.png index c4abc0a9cf..71d85f0a09 100644 Binary files a/wrench/reftests/image/segments.png and b/wrench/reftests/image/segments.png differ diff --git a/wrench/reftests/mask/rounded-corners.png b/wrench/reftests/mask/rounded-corners.png index eb291a2056..b55f7baba7 100644 Binary files a/wrench/reftests/mask/rounded-corners.png and b/wrench/reftests/mask/rounded-corners.png differ diff --git a/wrench/reftests/text/border-radius-alpha.png b/wrench/reftests/text/border-radius-alpha.png index f09963a82c..0a721d96b7 100644 Binary files a/wrench/reftests/text/border-radius-alpha.png and b/wrench/reftests/text/border-radius-alpha.png differ diff --git a/wrench/reftests/text/border-radius-subpx.png b/wrench/reftests/text/border-radius-subpx.png index 1320dc9650..656e2d1863 100644 Binary files a/wrench/reftests/text/border-radius-subpx.png and b/wrench/reftests/text/border-radius-subpx.png differ diff --git a/wrench/reftests/text/decorations-suite.png b/wrench/reftests/text/decorations-suite.png index b0faa21e95..f0b4bbee9b 100644 Binary files a/wrench/reftests/text/decorations-suite.png and b/wrench/reftests/text/decorations-suite.png differ diff --git a/wrench/reftests/transforms/border-zoom.png b/wrench/reftests/transforms/border-zoom.png index 0d591e0695..aa3bf4d35b 100644 Binary files a/wrench/reftests/transforms/border-zoom.png and b/wrench/reftests/transforms/border-zoom.png differ diff --git a/wrench/reftests/transforms/content-offset.png b/wrench/reftests/transforms/content-offset.png index 60eec2f6c3..f92d156b43 100644 Binary files a/wrench/reftests/transforms/content-offset.png and b/wrench/reftests/transforms/content-offset.png differ diff --git a/wrench/reftests/transforms/coord-system.png b/wrench/reftests/transforms/coord-system.png index 8b9c330491..a930274d98 100644 Binary files a/wrench/reftests/transforms/coord-system.png and b/wrench/reftests/transforms/coord-system.png differ diff --git a/wrench/reftests/transforms/image-rotated-clip.png b/wrench/reftests/transforms/image-rotated-clip.png index 60e313ae73..fda2872a3e 100644 Binary files a/wrench/reftests/transforms/image-rotated-clip.png and b/wrench/reftests/transforms/image-rotated-clip.png differ diff --git a/wrench/reftests/transforms/local-clip.png b/wrench/reftests/transforms/local-clip.png index 9268dc160e..88fcc870f9 100644 Binary files a/wrench/reftests/transforms/local-clip.png and b/wrench/reftests/transforms/local-clip.png differ diff --git a/wrench/reftests/transforms/perspective-origin.png b/wrench/reftests/transforms/perspective-origin.png index 4d17dd20fc..69d72ea8c8 100644 Binary files a/wrench/reftests/transforms/perspective-origin.png and b/wrench/reftests/transforms/perspective-origin.png differ diff --git a/wrench/reftests/transforms/perspective.png b/wrench/reftests/transforms/perspective.png index f9c229fc8d..34678c2576 100644 Binary files a/wrench/reftests/transforms/perspective.png and b/wrench/reftests/transforms/perspective.png differ diff --git a/wrench/reftests/transforms/prim-suite.png b/wrench/reftests/transforms/prim-suite.png index 90345927e5..8ff1dd0827 100644 Binary files a/wrench/reftests/transforms/prim-suite.png and b/wrench/reftests/transforms/prim-suite.png differ diff --git a/wrench/reftests/transforms/rotated-clip-large.png b/wrench/reftests/transforms/rotated-clip-large.png index 7dfb4e185f..476febd29d 100644 Binary files a/wrench/reftests/transforms/rotated-clip-large.png and b/wrench/reftests/transforms/rotated-clip-large.png differ diff --git a/wrench/reftests/transforms/rotated-clip.png b/wrench/reftests/transforms/rotated-clip.png index 37ad19eac8..4fcfcc7329 100644 Binary files a/wrench/reftests/transforms/rotated-clip.png and b/wrench/reftests/transforms/rotated-clip.png differ diff --git a/wrench/reftests/transforms/rotated-image.png b/wrench/reftests/transforms/rotated-image.png index 663e4c9421..f19eaa04c9 100644 Binary files a/wrench/reftests/transforms/rotated-image.png and b/wrench/reftests/transforms/rotated-image.png differ diff --git a/wrench/reftests/transforms/screen-space-blit.png b/wrench/reftests/transforms/screen-space-blit.png index 1c3c043061..0ce39413da 100644 Binary files a/wrench/reftests/transforms/screen-space-blit.png and b/wrench/reftests/transforms/screen-space-blit.png differ