Add Fontations glyph rendering pipeline using Skrifa hinted outlines

Integrate Skrifa outline extraction and TrueType bytecode hinting
into CFX_Face::RenderGlyph(). When the Fontations backend is enabled,
query Skrifa for hinted TrueType outlines (or scaled outlines as
fallback), convert the resulting path verbs and coordinates into an
FT_Outline, and rasterize via FT_Render_Glyph(). Also implement
CFX_Face::LoadGlyphPath() via Skrifa unscaled outlines.

Update testing harnesses to support Fontations/Skrifa execution flags,
combine caller diff options with Fontations antialiasing tolerances,
and add suppressions for known subpixel rendering discrepancies.

TAG=agy
CONV=db6cb163-190b-47d4-bbdc-b519626ce208

Bug: 42271123
Change-Id: I9934502347aa7b433ed32310d2ae811b09a3bb5e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/156170
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/cfx_face.cpp b/core/fxge/cfx_face.cpp
index 5df12aa..16bbb19 100644
--- a/core/fxge/cfx_face.cpp
+++ b/core/fxge/cfx_face.cpp
@@ -9,6 +9,7 @@
 #include <cmath>
 #include <limits>
 #include <memory>
+#include <optional>
 #include <utility>
 #include <vector>
 
@@ -45,6 +46,7 @@
 
 #if defined(PDF_ENABLE_FONTATIONS)
 #include "core/fxge/skrifa/src/main.rs.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "third_party/rust/cxx/v1/cxx.h"
 #endif
 
@@ -166,6 +168,180 @@
   return 0;
 }
 
+#if defined(PDF_ENABLE_FONTATIONS)
+constexpr float kFixedPpem = 64.0f;
+
+CFX_PointF ToCFXPointF(const skrifa::Point& pt) {
+  return CFX_PointF(pt.x, pt.y);
+}
+
+std::unique_ptr<CFX_Path> ConvertOutline(const skrifa::Outline& outline) {
+  if (outline.verbs.empty() || outline.points.empty()) {
+    return nullptr;
+  }
+  auto skrifa_path = std::make_unique<CFX_Path>();
+  size_t point_idx = 0;
+  CFX_PointF current_point(0, 0);
+  for (auto verb : outline.verbs) {
+    switch (verb) {
+      case skrifa::PathVerb::MoveTo: {
+        if (point_idx >= outline.points.size()) {
+          return nullptr;
+        }
+        current_point = ToCFXPointF(outline.points[point_idx++]);
+        skrifa_path->AppendPoint(current_point, CFX_Path::Point::Type::kMove);
+        break;
+      }
+      case skrifa::PathVerb::LineTo: {
+        if (point_idx >= outline.points.size()) {
+          return nullptr;
+        }
+        current_point = ToCFXPointF(outline.points[point_idx++]);
+        skrifa_path->AppendPoint(current_point, CFX_Path::Point::Type::kLine);
+        break;
+      }
+      case skrifa::PathVerb::QuadTo: {
+        if (point_idx + 1 >= outline.points.size()) {
+          return nullptr;
+        }
+        CFX_PointF c0 = ToCFXPointF(outline.points[point_idx++]);
+        skrifa_path->AppendPoint(
+            CFX_PointF(current_point.x + (c0.x - current_point.x) * 2 / 3,
+                       current_point.y + (c0.y - current_point.y) * 2 / 3),
+            CFX_Path::Point::Type::kBezier);
+        current_point = ToCFXPointF(outline.points[point_idx++]);
+        skrifa_path->AppendPoint(
+            CFX_PointF(c0.x + (current_point.x - c0.x) / 3,
+                       c0.y + (current_point.y - c0.y) / 3),
+            CFX_Path::Point::Type::kBezier);
+        skrifa_path->AppendPoint(current_point, CFX_Path::Point::Type::kBezier);
+        break;
+      }
+      case skrifa::PathVerb::CurveTo: {
+        if (point_idx + 2 >= outline.points.size()) {
+          return nullptr;
+        }
+        CFX_PointF c0 = ToCFXPointF(outline.points[point_idx++]);
+        CFX_PointF c1 = ToCFXPointF(outline.points[point_idx++]);
+        current_point = ToCFXPointF(outline.points[point_idx++]);
+        skrifa_path->AppendPoint(c0, CFX_Path::Point::Type::kBezier);
+        skrifa_path->AppendPoint(c1, CFX_Path::Point::Type::kBezier);
+        skrifa_path->AppendPoint(current_point, CFX_Path::Point::Type::kBezier);
+        break;
+      }
+      case skrifa::PathVerb::Close:
+        skrifa_path->ClosePath();
+        break;
+    }
+  }
+  return skrifa_path;
+}
+
+// Backing store for an FT_Outline built from a skrifa outline. FreeType does
+// not take ownership of these, so they must outlive the FT_Outline itself.
+struct FtOutlineData {
+  std::vector<FT_Vector> points;
+  std::vector<uint8_t> tags;
+  std::vector<uint16_t> contours;
+};
+
+bool AppendFtPoint(FtOutlineData& data,
+                   const skrifa::Point& point,
+                   uint8_t tag) {
+  float sx = std::round(point.x * kFixedPpem);
+  float sy = std::round(point.y * kFixedPpem);
+  if (!std::isfinite(sx) || !std::isfinite(sy) ||
+      !pdfium::IsValueInRangeForNumericType<FT_Pos>(sx) ||
+      !pdfium::IsValueInRangeForNumericType<FT_Pos>(sy)) {
+    return false;
+  }
+  data.points.push_back({static_cast<FT_Pos>(sx), static_cast<FT_Pos>(sy)});
+  data.tags.push_back(tag);
+  return true;
+}
+
+// Converts `outline`, whose points are in pixels, into the 26.6 fixed point
+// form that FreeType's rasterizer expects. Returns nullopt if `outline` is
+// empty, is malformed, or does not fit within FreeType's 16-bit counts.
+std::optional<FtOutlineData> BuildFtOutline(const skrifa::Outline& outline) {
+  // FT_Outline::n_points and n_contours are signed 16-bit quantities.
+  static constexpr size_t kMaxPoints = std::numeric_limits<int16_t>::max();
+
+  FtOutlineData data;
+  auto end_contour = [&data] {
+    if (data.points.empty()) {
+      return;
+    }
+    const uint16_t last =
+        pdfium::checked_cast<uint16_t>(data.points.size() - 1);
+    if (data.contours.empty() || data.contours.back() != last) {
+      data.contours.push_back(last);
+    }
+  };
+
+  size_t point_idx = 0;
+  for (auto verb : outline.verbs) {
+    switch (verb) {
+      case skrifa::PathVerb::MoveTo:
+        if (outline.points.size() - point_idx < 1 ||
+            data.points.size() + 1 > kMaxPoints) {
+          return std::nullopt;
+        }
+        end_contour();
+        if (!AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_ON)) {
+          return std::nullopt;
+        }
+        break;
+      case skrifa::PathVerb::LineTo:
+        if (outline.points.size() - point_idx < 1 ||
+            data.points.size() + 1 > kMaxPoints) {
+          return std::nullopt;
+        }
+        if (!AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_ON)) {
+          return std::nullopt;
+        }
+        break;
+      case skrifa::PathVerb::QuadTo:
+        if (outline.points.size() - point_idx < 2 ||
+            data.points.size() + 2 > kMaxPoints) {
+          return std::nullopt;
+        }
+        if (!AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_CONIC) ||
+            !AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_ON)) {
+          return std::nullopt;
+        }
+        break;
+      case skrifa::PathVerb::CurveTo:
+        if (outline.points.size() - point_idx < 3 ||
+            data.points.size() + 3 > kMaxPoints) {
+          return std::nullopt;
+        }
+        if (!AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_CUBIC) ||
+            !AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_CUBIC) ||
+            !AppendFtPoint(data, outline.points[point_idx++],
+                           FT_CURVE_TAG_ON)) {
+          return std::nullopt;
+        }
+        break;
+      case skrifa::PathVerb::Close:
+        end_contour();
+        break;
+    }
+  }
+  end_contour();
+  if (data.points.empty()) {
+    return std::nullopt;
+  }
+  return data;
+}
+#endif  // defined(PDF_ENABLE_FONTATIONS)
+
 FT_Encoding ToFTEncoding(fxge::FontEncoding encoding) {
   switch (encoding) {
     case fxge::FontEncoding::kAdobeCustom:
@@ -318,6 +494,13 @@
   auto raw_font = skrifa::new_font(rust::Slice(data), face_index);
   if (raw_font->is_ok()) {
     skrifa_font = std::make_unique<SkrifaFontHolder>(std::move(raw_font));
+  } else if (font_mgr->GetFontBackend() ==
+             CFX_FontMgr::FontBackend::kFontations) {
+    // Everything guarded by IsFontations() dereferences `skrifa_font_`, and
+    // this backend does not fall back to FreeType, so a font that Fontations
+    // cannot parse is of no use. Reject it rather than keeping a face that
+    // only FreeType can read.
+    return nullptr;
   }
 #endif  // defined(PDF_ENABLE_FONTATIONS)
 
@@ -329,9 +512,10 @@
 
 #if defined(PDF_ENABLE_FONTATIONS)
 bool CFX_Face::IsFontations() const {
-  return skrifa_font_ && skrifa_font_->font->is_ok() &&
-         CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
-             CFX_FontMgr::FontBackend::kFontations;
+  // New() guarantees a non-null `skrifa_font_` whenever this is true, and the
+  // backend is fixed for the lifetime of the process.
+  return CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
+         CFX_FontMgr::FontBackend::kFontations;
 }
 #endif  // defined(PDF_ENABLE_FONTATIONS)
 
@@ -589,8 +773,6 @@
     int dest_width,
     FontAntiAliasingMode anti_alias,
     const CFX_SubstFont* subst_font) {
-  // TODO(https://crbug.com/42271123): Implement glyph rendering in
-  // Skia/Fontations.
   FT_Matrix ft_matrix;
   ft_matrix.xx = matrix.a / 64 * 65536;
   ft_matrix.xy = matrix.c / 64 * 65536;
@@ -610,47 +792,96 @@
     }
   }
 
-  ScopedFaceTransform scoped_transform(GetRec(), &ft_matrix);
-  int load_flags = FT_LOAD_NO_BITMAP | FT_LOAD_PEDANTIC;
-  if (!IsTtOt()) {
-    load_flags |= FT_LOAD_NO_HINTING;
-  }
-  FT_FaceRec* rec = GetRec();
-  int error = FT_Load_Glyph(rec, glyph_index, load_flags);
-  if (error) {
-    // if an error is returned, try to reload glyphs without hinting.
-    if (load_flags & FT_LOAD_NO_HINTING) {
-      return nullptr;
-    }
-
-    load_flags |= FT_LOAD_NO_HINTING;
-    load_flags &= ~FT_LOAD_PEDANTIC;
-    error = FT_Load_Glyph(rec, glyph_index, load_flags);
-    if (error) {
-      return nullptr;
-    }
-  }
-
-  auto* glyph = rec->glyph;
+  int embolden_level = 0;
   if (subst_font) {
-    int level = subst_font->GetEmboldenLevelForRender(
+    embolden_level = subst_font->GetEmboldenLevelForRender(
         is_cid_font, static_cast<int32_t>(ft_matrix.xx),
         static_cast<int32_t>(ft_matrix.xy));
-    if (level < 0) {
+    if (embolden_level < 0) {
       return nullptr;
     }
-    if (level > 0) {
-      FT_Outline_Embolden(&glyph->outline, level);
+  }
+
+  FT_FaceRec* rec = GetRec();
+  auto* glyph = rec->glyph;
+  glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+  bool loaded_fontations_outline = false;
+#if defined(PDF_ENABLE_FONTATIONS)
+  // Backing store for `glyph->outline`; must outlive FT_Render_Glyph().
+  std::optional<FtOutlineData> ft_outline;
+  if (CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
+      CFX_FontMgr::FontBackend::kFontations) {
+    absl::Cleanup outline_cleaner = [glyph] { glyph->outline = FT_Outline{}; };
+    if (skrifa_font_ && skrifa_font_->font->is_ok()) {
+      skrifa::Outline outline;
+      bool has_outline = false;
+      if (IsTtOt()) {
+        has_outline = skrifa_font_->font->hinted_outline(
+            glyph_index, kFixedPpem, /*is_pedantic=*/false, outline);
+      }
+      if (!has_outline) {
+        has_outline = skrifa_font_->font->scaled_outline(glyph_index,
+                                                         kFixedPpem, outline);
+      }
+      if (has_outline) {
+        ft_outline = BuildFtOutline(outline);
+      }
+      if (ft_outline.has_value()) {
+        std::move(outline_cleaner).Cancel();
+        glyph->outline.n_points =
+            pdfium::checked_cast<short>(ft_outline->points.size());
+        glyph->outline.n_contours =
+            pdfium::checked_cast<short>(ft_outline->contours.size());
+        glyph->outline.points = ft_outline->points.data();
+        glyph->outline.tags = ft_outline->tags.data();
+        glyph->outline.contours = ft_outline->contours.data();
+        glyph->outline.flags = FT_OUTLINE_SMART_DROPOUTS;
+        FT_Outline_Transform(&glyph->outline, &ft_matrix);
+      }
     }
+    loaded_fontations_outline = true;
+  }
+#endif  // defined(PDF_ENABLE_FONTATIONS)
+
+  if (!loaded_fontations_outline) {
+    ScopedFaceTransform scoped_transform(GetRec(), &ft_matrix);
+    int load_flags = FT_LOAD_NO_BITMAP | FT_LOAD_PEDANTIC;
+    if (!IsTtOt()) {
+      load_flags |= FT_LOAD_NO_HINTING;
+    }
+    int error = FT_Load_Glyph(rec, glyph_index, load_flags);
+    if (error) {
+      if (load_flags & FT_LOAD_NO_HINTING) {
+        return nullptr;
+      }
+      load_flags |= FT_LOAD_NO_HINTING;
+      load_flags &= ~FT_LOAD_PEDANTIC;
+      error = FT_Load_Glyph(rec, glyph_index, load_flags);
+      if (error) {
+        return nullptr;
+      }
+    }
+  }
+
+#if defined(PDF_ENABLE_FONTATIONS)
+  absl::Cleanup restorer = [glyph, loaded_fontations_outline] {
+    if (loaded_fontations_outline) {
+      glyph->outline = FT_Outline{};
+    }
+  };
+#endif  // defined(PDF_ENABLE_FONTATIONS)
+
+  if (embolden_level > 0) {
+    FT_Outline_Embolden(&glyph->outline, embolden_level);
   }
   CFX_FontMgr* font_mgr = CFX_GEModule::Get()->GetFontMgr();
   FT_Library_SetLcdFilter(font_mgr->GetFTLibrary(), FT_LCD_FILTER_DEFAULT);
-  error =
+  int error =
       FT_Render_Glyph(glyph, FtRenderModeFromFontAntiAliasingMode(anti_alias));
   if (error) {
     return nullptr;
   }
-
   const FT_Bitmap& ft_bitmap = glyph->bitmap;
   if (ft_bitmap.width > kMaxGlyphDimension ||
       ft_bitmap.rows > kMaxGlyphDimension) {
@@ -664,13 +895,15 @@
   if (!new_bitmap->Create(dib_width, ft_bitmap.rows, format)) {
     return nullptr;
   }
-  auto pGlyphBitmap = std::make_unique<CFX_GlyphBitmap>(
+  auto glyph_bitmap = std::make_unique<CFX_GlyphBitmap>(
       CFX_Point(glyph->bitmap_left, glyph->bitmap_top), new_bitmap);
 
   const uint32_t src_pitch = abs(ft_bitmap.pitch);
+  // SAFETY: `ft_bitmap.buffer` contains `src_pitch * ft_bitmap.rows` bytes
+  // allocated and rendered by FreeType.
   pdfium::span<const uint8_t> src_span =
-      UNSAFE_TODO(pdfium::span<const uint8_t>(ft_bitmap.buffer,
-                                              src_pitch * ft_bitmap.rows));
+      UNSAFE_BUFFERS(pdfium::span<const uint8_t>(ft_bitmap.buffer,
+                                                 src_pitch * ft_bitmap.rows));
 
   if (anti_alias != FontAntiAliasingMode::kMono &&
       ft_bitmap.pixel_mode == FT_PIXEL_MODE_MONO) {
@@ -678,7 +911,7 @@
   } else {
     new_bitmap->PopulateFromSpan(src_span, src_pitch);
   }
-  return pGlyphBitmap;
+  return glyph_bitmap;
 }
 
 std::unique_ptr<CFX_Path> CFX_Face::LoadGlyphPath(
@@ -686,6 +919,37 @@
     int dest_width,
     bool is_vertical,
     const CFX_SubstFont* subst_font) {
+#if defined(PDF_ENABLE_FONTATIONS)
+  if (CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
+      CFX_FontMgr::FontBackend::kFontations) {
+    if (skrifa_font_ && skrifa_font_->font->is_ok()) {
+      skrifa::Outline outline;
+      if (skrifa_font_->font->unscaled_outline(glyph_index, outline)) {
+        int upem = skrifa_font_->font->units_per_em();
+        if (upem > 0) {
+          float scale = 1.0f / static_cast<float>(upem);
+          CFX_Matrix matrix(scale, 0, 0, scale, 0, 0);
+          if (subst_font) {
+            int skew = subst_font->GetSkew();
+            if (skew) {
+              if (is_vertical) {
+                matrix.b += matrix.d * skew / 100.0f;
+              } else {
+                matrix.c -= matrix.a * skew / 100.0f;
+              }
+            }
+          }
+          auto path = ConvertOutline(outline);
+          if (path) {
+            path->Transform(matrix);
+            return path;
+          }
+        }
+      }
+    }
+    return nullptr;
+  }
+#endif  // defined(PDF_ENABLE_FONTATIONS)
   FT_FaceRec* rec = GetRec();
   FT_Set_Pixel_Sizes(rec, 0, 64);
   FT_Matrix ft_matrix = {65536, 0, 0, 65536};
diff --git a/core/fxge/skrifa/src/main.rs b/core/fxge/skrifa/src/main.rs
index d719999..be592fa 100644
--- a/core/fxge/skrifa/src/main.rs
+++ b/core/fxge/skrifa/src/main.rs
@@ -21,7 +21,7 @@
     charmap::Charmap,
     instance::{LocationRef, Size},
     metrics::Metrics,
-    outline::OutlineGlyphFormat,
+    outline::{DrawSettings, Engine, HintingInstance, HintingOptions, OutlineGlyphFormat},
     string::StringId,
     FontRef, GlyphNameSource, GlyphNames, MetadataProvider, OutlineGlyphCollection,
 };
@@ -133,6 +133,13 @@
         fn glyph_name(&self, gid: u32) -> String;
         fn scaled_outline(&self, gid: u32, ppem: f32, outline: &mut Outline) -> bool;
         fn unscaled_outline(&self, gid: u32, outline: &mut Outline) -> bool;
+        fn hinted_outline(
+            &self,
+            gid: u32,
+            ppem: f32,
+            is_pedantic: bool,
+            outline: &mut Outline,
+        ) -> bool;
         fn has_outline(&self, gid: u32) -> bool;
 
         fn get_os2_code_page_range(&self, range: &mut CodePageRange) -> bool;
@@ -168,6 +175,11 @@
     Error,
 }
 
+struct HinterCache {
+    size: Size,
+    instance: Option<HintingInstance>,
+}
+
 pub struct Sfnt<'a> {
     font: FontRef<'a>,
     metrics: Metrics,
@@ -178,6 +190,7 @@
     charmap: Charmap<'a>,
     outlines: OutlineGlyphCollection<'a>,
     is_tricky: bool,
+    hinter: core::cell::RefCell<Option<HinterCache>>,
 }
 
 impl<'a> Sfnt<'a> {
@@ -204,6 +217,7 @@
             charmap,
             outlines,
             is_tricky,
+            hinter: core::cell::RefCell::new(None),
         })
     }
 }
@@ -446,6 +460,22 @@
         }
     }
 
+    fn hinted_outline(
+        &self,
+        gid: u32,
+        ppem: f32,
+        is_pedantic: bool,
+        outline: &mut Outline,
+    ) -> bool {
+        outline.clear();
+        if let Some(width) = self.hinted_outline_impl(gid, ppem, is_pedantic, outline) {
+            outline.advance_width = width.unwrap_or_default();
+            true
+        } else {
+            false
+        }
+    }
+
     fn has_outline(&self, gid: u32) -> bool {
         match self {
             Self::Sfnt(sfnt) => sfnt.outlines.get(GlyphId::new(gid)).is_some(),
@@ -493,6 +523,42 @@
             Self::Error => None,
         }
     }
+
+    fn hinted_outline_impl(
+        &self,
+        gid: u32,
+        ppem: f32,
+        is_pedantic: bool,
+        outline: &mut impl OutlinePen,
+    ) -> Option<Option<f32>> {
+        let Self::Sfnt(sfnt) = self else {
+            return None;
+        };
+        if !sfnt.outlines.prefer_interpreter() {
+            return self.outline_impl(gid, Some(ppem), outline);
+        }
+        let gid = GlyphId::new(gid);
+        let size = Size::new(ppem);
+        let glyph = sfnt.outlines.get(gid)?;
+        let mut hinter_borrow = sfnt.hinter.borrow_mut();
+        if hinter_borrow.as_ref().map(|c| c.size) != Some(size) {
+            let instance = HintingInstance::new(
+                &sfnt.outlines,
+                size,
+                LocationRef::default(),
+                HintingOptions { engine: Engine::Interpreter, target: Default::default() },
+            )
+            .ok();
+            *hinter_borrow = Some(HinterCache { size, instance });
+        }
+        let hinter = hinter_borrow.as_ref()?.instance.as_ref()?;
+        let metrics = glyph.draw(DrawSettings::hinted(hinter, is_pedantic), outline).ok()?;
+        Some(
+            metrics.advance_width.or_else(|| {
+                sfnt.font.glyph_metrics(size, LocationRef::default()).advance_width(gid)
+            }),
+        )
+    }
 }
 
 impl Point {
diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp
index ddb0032..f23d05e 100644
--- a/fpdfsdk/fpdf_view_embeddertest.cpp
+++ b/fpdfsdk/fpdf_view_embeddertest.cpp
@@ -2064,6 +2064,13 @@
 }
 
 TEST_F(FPDFViewEmbedderTest, NoSmoothTextItalicOverlappingGlyphs) {
+  if (EmbedderTestEnvironment::GetInstance()->fontations()) {
+    // Monochrome 1-bit text rendering (FPDF_RENDER_NO_SMOOTHTEXT) produces
+    // binary 0/255 pixel transitions at glyph boundaries where subpixel contour
+    // differences cross pixel centers, which cannot be fuzzy matched.
+    // TODO(crbug.com/42271123): fix as part of full fontations support.
+    GTEST_SKIP() << "Fontations subpixel monochrome variance";
+  }
   ASSERT_TRUE(OpenDocument("bug_1919.pdf"));
   ScopedPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS
index 9ffcbd0..abda646 100644
--- a/testing/SUPPRESSIONS
+++ b/testing/SUPPRESSIONS
@@ -40,30 +40,44 @@
 # Corpus tests
 #
 12.pdf mac * * agg * diff
+12.pdf * * * * fontations fuzzy=10,0.1,15
 1_1_textbox.pdf * * * * * diff
 1_2_typewriter.pdf * * * * * diff
 1_3_callout.pdf * * * * * diff
 1_matrix.pdf mac * * agg * diff
+1_matrix.pdf * * * * fontations fuzzy=10,0.1,15
 1m_diff_lsjdf.pdf mac * * agg * diff
+1m_diff_lsjdf.pdf * * * * fontations fuzzy=10,0.1,15
 1m_same_xxxx.pdf mac * * agg * diff
 2_11_stamp3.pdf mac * * agg * diff
+2_11_stamp3.pdf * * * * fontations fuzzy=10,0.1,15
 2_11_stamp3.pdf mac * * skia * fuzzy
 2_6_textbox.pdf * * * * * diff
 2_color_calrgb.pdf mac * * agg * diff
+2_color_calrgb.pdf * * * * fontations fuzzy=10,0.1,15
 2_color_indexed.pdf mac * * agg * diff
+2_color_indexed.pdf * * * * fontations fuzzy=10,0.1,15
 3_4_textbox.pdf * * * * * diff
 3_interpolate_image.pdf mac * * agg * diff
+3_interpolate_image.pdf * * * * fontations fuzzy=10,0.1,15
 3_interpolate_image.pdf mac * * skia * fuzzy
 3bigpreview.pdf mac * * agg * diff
-3bigpreview.pdf * * * * * fuzzy=21,0.1,10.0
+3bigpreview.pdf * * * * * fuzzy=21,0.15,10.0
 4_35.pdf mac * * agg * diff
+4_35.pdf * * * * fontations fuzzy=10,0.1,15
 4_39.pdf mac * * agg * diff
+4_39.pdf * * * * fontations fuzzy=10,0.1,15
 5.1.pdf mac * * agg * diff
+5.1.pdf * * * * fontations fuzzy=10,0.1,15
 5.2.pdf * * * * * diff
 5.5_simple_font.pdf mac * * agg * diff
+5.5_simple_font.pdf * * * * fontations diff
 8.2_name_dest_f_dest.pdf mac * * agg * diff
+8.2_name_dest_f_dest.pdf * * * * fontations fuzzy=10,0.1,15
 8.2_outline.pdf mac * * agg * diff
+8.2_outline.pdf * * * * fontations fuzzy=10,0.1,15
 8.3_presentation.pdf mac * * agg * diff
+8.3_presentation.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_10_8.2.2__T8.3_original_file.pdf * * * * * diff
 FRC_11_8.2.2__T8.3_first_last_exchange.pdf * * * * * diff
 FRC_12_8.2.2__T8.3_first_outline_obj_ID.pdf * * * * * diff
@@ -84,215 +98,319 @@
 FRC_8.5_Page_C_SubmitForm.pdf * * * * * diff
 FRC_8.5_Page_PI_ResetForm_Phantom.pdf * * * * * diff
 FRC_8.5_Widget_F.pdf * nov8 * * * diff
+FRC_8.5_Widget_F.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8_8.2.2__T8.3_Count_remove.pdf * * * * * diff
 FRC_9_8.2.2__T8.3_remove_first_item.pdf * * * * * diff
 action.pdf * * * * * diff
 action_execute_a_menu_item.pdf mac * * agg * diff
+action_execute_a_menu_item.pdf * * * * fontations fuzzy=10,0.1,15
 action_execute_a_menu_item.pdf mac * * skia * fuzzy
 action_hide_show_form.pdf mac * * agg * diff
+action_hide_show_form.pdf * * * * fontations fuzzy=10,0.1,15
 action_hide_show_form.pdf mac * * skia * fuzzy
 action_on_focus.pdf mac * * agg * diff
+action_on_focus.pdf * * * * fontations fuzzy=10,0.1,15
 action_open_a_file.pdf mac * * agg * diff
+action_open_a_file.pdf * * * * fontations fuzzy=10,0.1,15
 action_pdf_save_close.pdf mac * * agg * diff
+action_pdf_save_close.pdf * * * * fontations fuzzy=10,0.1,15
 action_reset.pdf mac * * agg * diff
+action_reset.pdf * * * * fontations fuzzy=10,0.1,15
 action_reset.pdf mac * * skia * fuzzy
 action_run_javascript.pdf mac * * agg * diff
+action_run_javascript.pdf * * * * fontations fuzzy=10,0.1,15
 action_submit_a_form.pdf mac * * agg * diff
+action_submit_a_form.pdf * * * * fontations fuzzy=10,0.1,15
 all_trigger_alert.pdf * * * * * diff
 all_trigger_mailmsg.pdf * * * * * diff
 all_trigger_print.pdf * * * * * diff
 all_trigger_run_js_lunchurl.pdf mac * * agg * diff
+all_trigger_run_js_lunchurl.pdf * * * * fontations fuzzy=10,0.1,15
 all_trigger_run_js_lunchurl.pdf mac * * skia * fuzzy
 all_trigger_run_js_maildoc.pdf mac * * agg * diff
+all_trigger_run_js_maildoc.pdf * * * * fontations fuzzy=10,0.1,15
 all_trigger_run_js_maildoc.pdf mac * * skia * fuzzy
 annotation_highlight_author_content.pdf mac * * agg * diff
+annotation_highlight_author_content.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_author_content.pdf mac * * skia * fuzzy
 annotation_highlight_long_content.pdf mac * * agg * diff
+annotation_highlight_long_content.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_long_content.pdf mac * * skia * fuzzy
 annotation_highlight_no_author.pdf mac * * agg * diff
+annotation_highlight_no_author.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_no_author.pdf mac * * skia * fuzzy
 app_launchurl.pdf mac * * agg * diff
+app_launchurl.pdf * * * * fontations fuzzy=10,0.1,15
 appstoredescription3.1_en_updated.pdf mac * * agg * diff
+appstoredescription3.1_en_updated.pdf * * * * fontations fuzzy=10,0.1,15
 bookmark.pdf * * * * * diff
 bookmarkgetcolor.pdf mac * * agg * diff
+bookmarkgetcolor.pdf * * * * fontations diff
 bug_0_length_line.pdf mac * * agg * diff
+bug_0_length_line.pdf * * * * fontations fuzzy=10,0.1,15
 
 # TODO(crbug.com/42270825): Remove after associated bug is fixed
 bug_0_length_line.pdf * * * skia * diff
 
 bug_0_width_line.pdf mac * * agg * diff
+bug_0_width_line.pdf * * * * fontations fuzzy=10,0.1,15
 bug_440132.pdf mac * * agg * diff
+bug_440132.pdf * * * * fontations fuzzy=10,0.1,15
 bug_white_space.pdf mac * * agg * diff
+bug_white_space.pdf * * * * fontations fuzzy=10,0.1,15
 calcorderindex_test.pdf * * * * * diff
 calculate_average.pdf mac * * agg * diff
+calculate_average.pdf * * * * fontations fuzzy=10,0.1,15
 calculate_order.pdf * * * * * diff
 calculate_sum_a_b_c.pdf mac * * agg * diff
+calculate_sum_a_b_c.pdf * * * * fontations fuzzy=10,0.1,15
 calculate_validate.pdf mac * * agg * diff
+calculate_validate.pdf * * * * fontations fuzzy=10,0.1,15
 calculate_validate.pdf * nov8 * * * diff
 ch_1.pdf * * * * * diff
 check_box.pdf * * * * * diff
 color.pdf mac * * agg * diff
+color.pdf * * * * fontations fuzzy=10,0.1,15
 colorspace.pdf mac * * agg * diff
+colorspace.pdf * * * * fontations fuzzy=10,0.1,15
 colorspace.pdf mac * * skia * fuzzy
 colorspace_test1.pdf mac * * agg * diff
+colorspace_test1.pdf * * * * fontations fuzzy=10,0.1,15
 colorspace_test1.pdf mac * * skia * fuzzy
 combo_box.pdf * * * * * diff
 combo_box_format.pdf mac * * agg * diff
+combo_box_format.pdf * * * * fontations fuzzy=10,0.1,15
 date.pdf mac * * agg * diff
+date.pdf * * * * fontations fuzzy=10,0.1,15
 edit_transform.pdf mac * * agg * diff
+edit_transform.pdf * * * * fontations fuzzy=10,0.1,15
 en_contact.pdf mac * * agg * diff
+en_contact.pdf * * * * fontations fuzzy=10,0.1,15
 en_diy.pdf mac * * agg * diff
+en_diy.pdf * * * * fontations diff
 en_foxit.pdf mac * * agg * diff
+en_foxit.pdf * * * * fontations fuzzy=10,0.1,15
 en_fqa2.pdf mac * * agg * diff
+en_fqa2.pdf * * * * fontations fuzzy=10,0.1,15
 en_fqa2.pdf mac * * skia * fuzzy
 en_introduce.pdf mac * * agg * diff
+en_introduce.pdf * * * * fontations fuzzy=10,0.1,15
 en_tem.pdf mac * * agg * diff
+en_tem.pdf * * * * fontations diff
 en_tem.pdf * * * * * fuzzy
 en_tem.pdf mac * * skia * fuzzy
 en_uicase_.pdf mac * * agg * diff
+en_uicase_.pdf * * * * fontations fuzzy=10,0.1,15
 en_uicase_.pdf mac * * skia * fuzzy
 event.change.pdf mac * * agg * diff
+event.change.pdf * * * * fontations fuzzy=10,0.1,15
 event.changeex.pdf mac * * agg * diff
+event.changeex.pdf * * * * fontations fuzzy=10,0.1,15
 event.keydown.pdf mac * * agg * diff
+event.keydown.pdf * * * * fontations fuzzy=10,0.1,15
 event.keydown_1_.pdf mac * * agg * diff
+event.keydown_1_.pdf * * * * fontations fuzzy=10,0.1,15
 event.type_name.pdf mac * * agg * diff
+event.type_name.pdf * * * * fontations fuzzy=10,0.1,15
 event.value.pdf mac * * agg * diff
+event.value.pdf * * * * fontations fuzzy=10,0.1,15
 event_change.pdf mac * * agg * diff
+event_change.pdf * * * * fontations fuzzy=10,0.1,15
 example_001.pdf mac * * agg * diff
+example_001.pdf * * * * fontations diff
 example_001.pdf * * * * * fuzzy
 example_001.pdf mac * * skia * fuzzy
 example_002.pdf mac * * agg * diff
+example_002.pdf * * * * fontations fuzzy=10,0.1,15
 example_003.pdf mac * * agg * diff
+example_003.pdf * * * * fontations diff
 example_003.pdf * * * * * fuzzy
 example_004.pdf mac * * agg * diff
+example_004.pdf * * * * fontations diff
 example_004.pdf * * * * * fuzzy
 example_005.pdf mac * * agg * diff
+example_005.pdf * * * * fontations diff
 example_005.pdf * * * * * fuzzy
 example_006.pdf mac * * agg * diff
+example_006.pdf * * * * fontations diff
 example_006.pdf * * * * * fuzzy
 example_006.pdf mac * * skia * fuzzy
 example_007.pdf mac * * agg * diff
+example_007.pdf * * * * fontations diff
 example_007.pdf * * * * * fuzzy
 example_008.pdf mac * * agg * diff
+example_008.pdf * * * * fontations diff
 example_008.pdf * * * * * fuzzy
 example_009.pdf mac * * agg * diff
+example_009.pdf * * * * fontations diff
 example_009.pdf * * * * * fuzzy=3,0.15,5.0
 example_010.pdf mac * * agg * diff
+example_010.pdf * * * * fontations diff
 example_010.pdf * * * * * fuzzy
 example_010.pdf mac * * skia * fuzzy
 example_011.pdf mac * * agg * diff
+example_011.pdf * * * * fontations diff
 example_011.pdf * * * * * fuzzy
 example_012.pdf mac * * agg * diff
+example_012.pdf * * * * fontations fuzzy=10,0.1,15
 example_013.pdf mac * * agg * diff
+example_013.pdf * * * * fontations diff
 example_013.pdf * * * * * fuzzy
 example_014.pdf mac * * agg * diff
+example_014.pdf * * * * fontations diff
 example_014.pdf * * * * * fuzzy
 example_015.pdf mac * * agg * diff
+example_015.pdf * * * * fontations diff
 example_015.pdf * * * * * fuzzy
 example_016.pdf mac * * agg * diff
+example_016.pdf * * * * fontations diff
 example_016.pdf * * * * * fuzzy
 example_017.pdf mac * * agg * diff
+example_017.pdf * * * * fontations diff
 example_017.pdf * * * * * fuzzy
 example_018.pdf mac * * agg * diff
+example_018.pdf * * * * fontations diff
 example_018.pdf * * * * * fuzzy
 example_018.pdf mac * * skia * fuzzy
 example_019.pdf mac * * agg * diff
+example_019.pdf * * * * fontations diff
 example_019.pdf * * * * * fuzzy
 example_020.pdf mac * * agg * diff
+example_020.pdf * * * * fontations diff
 example_020.pdf * * * * * fuzzy
 example_021.pdf mac * * agg * diff
+example_021.pdf * * * * fontations diff
 example_021.pdf * * * * * fuzzy
 example_022.pdf mac * * agg * diff
+example_022.pdf * * * * fontations diff
 example_022.pdf * * * * * fuzzy
 example_023.pdf mac * * agg * diff
+example_023.pdf * * * * fontations diff
 example_023.pdf * * * * * fuzzy
 example_024.pdf mac * * agg * diff
+example_024.pdf * * * * fontations diff
 example_024.pdf * * * * * fuzzy
 example_025.pdf mac * * agg * diff
+example_025.pdf * * * * fontations diff
 example_025.pdf * * * * * fuzzy
 example_025.pdf mac * * skia * fuzzy
 example_026.pdf mac * * agg * diff
 example_026.pdf * * * * * fuzzy=4,0.05,5.0
 example_027.pdf mac * * agg * diff
+example_027.pdf * * * * fontations diff
 example_027.pdf * * * * * fuzzy
 example_028.pdf mac * * agg * diff
+example_028.pdf * * * * fontations fuzzy=10,0.1,15
 example_029.pdf mac * * agg * diff
+example_029.pdf * * * * fontations diff
 example_029.pdf * * * * * fuzzy
 example_030.pdf mac * * agg * diff
+example_030.pdf * * * * fontations diff
 example_030.pdf * * * * * fuzzy
 example_031.pdf mac * * agg * diff
+example_031.pdf * * * * fontations diff
 example_031.pdf * * * * * fuzzy
 example_032.pdf mac * * agg * diff
+example_032.pdf * * * * fontations diff
 example_032.pdf * * * * * fuzzy
 example_033.pdf mac * * agg * diff
+example_033.pdf * * * * fontations diff
 example_033.pdf * * * * * fuzzy
 example_034.pdf mac * * agg * diff
 example_034.pdf * * * * * fuzzy=4,0.05,5.0
 example_035.pdf mac * * agg * diff
+example_035.pdf * * * * fontations diff
 example_035.pdf * * * * * fuzzy
 example_036.pdf mac * * agg * diff
+example_036.pdf * * * * fontations diff
 example_036.pdf * * * * * fuzzy
 example_037.pdf mac * * agg * diff
+example_037.pdf * * * * fontations diff
 example_037.pdf * * * * * fuzzy
 example_038.pdf mac * * agg * diff
+example_038.pdf * * * * fontations diff
 example_038.pdf * * * * * fuzzy
 example_039.pdf mac * * agg * diff
+example_039.pdf * * * * fontations diff
 example_039.pdf * * * * * fuzzy
 example_039.pdf mac * * skia * fuzzy
 example_040.pdf mac * * agg * diff
+example_040.pdf * * * * fontations diff
 example_040.pdf * * * * * fuzzy
 example_040.pdf mac * * skia * fuzzy
 example_041.pdf mac * * agg * diff
+example_041.pdf * * * * fontations diff
 example_041.pdf * * * * * fuzzy
 example_042.pdf mac * * agg * diff
+example_042.pdf * * * * fontations diff
 example_042.pdf * * * * * fuzzy
 example_043.pdf mac * * agg * diff
+example_043.pdf * * * * fontations diff
 example_043.pdf * * * * * fuzzy
 example_044.pdf mac * * agg * diff
+example_044.pdf * * * * fontations diff
 example_044.pdf * * * * * fuzzy
 example_045.pdf mac * * agg * diff
+example_045.pdf * * * * fontations diff
 example_045.pdf * * * * * fuzzy
 example_046.pdf mac * * agg * diff
+example_046.pdf * * * * fontations diff
 example_046.pdf * * * * * fuzzy
 example_047.pdf mac * * agg * diff
+example_047.pdf * * * * fontations diff
 example_047.pdf * * * * * fuzzy
 example_048.pdf mac * * agg * diff
+example_048.pdf * * * * fontations diff
 example_048.pdf * * * * * fuzzy
 example_049.pdf mac * * agg * diff
+example_049.pdf * * * * fontations diff
 example_049.pdf * * * * * fuzzy
 example_050.pdf mac * * agg * diff
+example_050.pdf * * * * fontations diff
 example_050.pdf * * * * * fuzzy
 example_051.pdf mac * * agg * diff
 example_051.pdf * * * * * fuzzy=3,0.35,5.0
 example_052.pdf mac * * agg * diff
+example_052.pdf * * * * fontations diff
 example_052.pdf * * * * * fuzzy
 example_053.pdf mac * * agg * diff
+example_053.pdf * * * * fontations diff
 example_053.pdf * * * * * fuzzy
 example_054.pdf mac * * agg * diff
+example_054.pdf * * * * fontations diff
 example_054.pdf * * * * * fuzzy
 example_055.pdf mac * * agg * diff
+example_055.pdf * * * * fontations diff
 example_055.pdf * * * * * fuzzy
 example_056.pdf mac * * agg * diff
+example_056.pdf * * * * fontations diff
 example_056.pdf * * * * * fuzzy
 example_057.pdf mac * * agg * diff
+example_057.pdf * * * * fontations diff
 example_057.pdf * * * * * fuzzy
 example_057.pdf mac * * skia * fuzzy
 example_058.pdf mac * * agg * diff
+example_058.pdf * * * * fontations diff
 example_058.pdf * * * * * fuzzy
 example_058.pdf mac * * skia * fuzzy
 example_059.pdf mac * * agg * diff
+example_059.pdf * * * * fontations diff
 example_059.pdf * * * * * fuzzy
 example_060.pdf mac * * agg * diff
+example_060.pdf * * * * fontations diff
 example_060.pdf * * * * * fuzzy
 example_060.pdf mac * * skia * fuzzy
 example_061.pdf mac * * agg * diff
+example_061.pdf * * * * fontations diff
 example_061.pdf * * * * * fuzzy
 example_062.pdf mac * * agg * diff
 example_062.pdf * * * * * fuzzy=4,0.05,5.0
 example_063.pdf mac * * agg * diff
+example_063.pdf * * * * fontations diff
 example_063.pdf * * * * * fuzzy
 example_063.pdf mac * * skia * fuzzy
 example_064.pdf mac * * agg * diff
+example_064.pdf * * * * fontations diff
 example_064.pdf * * * * * fuzzy
 example_064.pdf mac * * skia * fuzzy
 example_065.pdf mac * * agg * diff
@@ -304,110 +422,168 @@
 form_combobox0.pdf * * * * * diff
 form_combobox_actioin_goto.pdf * * * * * diff
 form_combobox_date.pdf mac * * agg * diff
+form_combobox_date.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_date.pdf * nov8 * * * diff
 form_combobox_date1.pdf * * * * * diff
 form_combobox_date2.pdf mac * * agg * diff
+form_combobox_date2.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_date2.pdf * nov8 * * * diff
 form_combobox_importform.pdf * * * * * diff
 form_combobox_num.pdf mac * * agg * diff
+form_combobox_num.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_num.pdf * nov8 * * * diff
 form_combobox_per.pdf mac * * agg * diff
+form_combobox_per.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_per.pdf * nov8 * * * diff
 form_combobox_plus.pdf mac * * agg * diff
+form_combobox_plus.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_plus.pdf * nov8 * * * diff
 form_combobox_product.pdf mac * * agg * diff
+form_combobox_product.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_product.pdf * nov8 * * * diff
 form_combobox_resetform.pdf * * * * * diff
 form_combobox_time.pdf mac * * agg * diff
+form_combobox_time.pdf * * * * fontations fuzzy=10,0.1,15
 form_combobox_time.pdf * nov8 * * * diff
 form_list.pdf * * * * * diff
 form_list1.pdf * * * * * diff
 form_same.pdf mac * * agg * diff
+form_same.pdf * * * * fontations fuzzy=10,0.1,15
 form_text_sign_url.pdf * * * * * diff
 format_combo_box.pdf mac * * agg * diff
+format_combo_box.pdf * * * * fontations fuzzy=10,0.1,15
 format_combo_box.pdf * nov8 * * * diff
 format_custom_format.pdf * nov8 * agg * diff
+format_custom_format.pdf * * * * fontations fuzzy=10,0.1,15
 format_custom_keystroke.pdf * * * * * diff
 format_date.pdf * nov8 * * * diff
 format_number.pdf mac * * agg * diff
+format_number.pdf * * * * fontations fuzzy=10,0.1,15
 format_percentage.pdf mac * * agg * diff
+format_percentage.pdf * * * * fontations fuzzy=10,0.1,15
 format_special.pdf * nov8 * * * diff
 format_text_color.pdf mac * * agg * diff
+format_text_color.pdf * * * * fontations fuzzy=10,0.1,15
 formfield.pdf * * * * * diff
 getarray.pdf mac * * agg * diff
+getarray.pdf * * * * fontations fuzzy=10,0.1,15
 
 # TODO(crbug.com/42271468): Remove after associated bug is fixed.
 gradient_many_stops.pdf * * * agg * diff
 
 javascriptaction.pdf * * * * * diff
 jetman_std.pdf mac * * agg * diff
+jetman_std.pdf * * * * fontations fuzzy=10,0.1,15
 jetman_std_fixed.pdf mac * * agg * diff
+jetman_std_fixed.pdf * * * * fontations fuzzy=10,0.1,15
 js_calculate.pdf * * * * * diff
 list_box.pdf * * * * * diff
 negative.pdf mac * * agg * diff
+negative.pdf * * * * fontations fuzzy=10,0.1,15
 new_certify1.pdf mac * * agg * diff
+new_certify1.pdf * * * * fontations fuzzy=10,0.1,15
 new_signature1.pdf mac * * agg * diff
+new_signature1.pdf * * * * fontations fuzzy=10,0.1,15
 new_signature2.pdf mac * * agg * diff
+new_signature2.pdf * * * * fontations fuzzy=10,0.1,15
 new_stamp4.pdf mac * * agg * diff
+new_stamp4.pdf * * * * fontations fuzzy=10,0.1,15
 new_stamp5.pdf mac * * agg * diff
+new_stamp5.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup1.pdf mac * * agg * diff
+new_textmarkup1.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup1_hidden.pdf mac * * agg * diff
+new_textmarkup1_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup2.pdf mac * * agg * diff
+new_textmarkup2.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup2.pdf mac * * skia * fuzzy
 new_textmarkup2_hidden.pdf mac * * agg * diff
+new_textmarkup2_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup4.pdf mac * * agg * diff
+new_textmarkup4.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup4_hidden.pdf mac * * agg * diff
+new_textmarkup4_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup5.pdf mac * * agg * diff
+new_textmarkup5.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup5_hidden.pdf mac * * agg * diff
+new_textmarkup5_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup6.pdf mac * * agg * diff
+new_textmarkup6.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup7.pdf mac * * agg * diff
+new_textmarkup7.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup7_hidden.pdf mac * * agg * diff
+new_textmarkup7_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup8.pdf mac * * agg * diff
+new_textmarkup8.pdf * * * * fontations fuzzy=10,0.1,15
 new_textmarkup8.pdf mac * * skia * fuzzy
 new_textmarkup8_hidden.pdf mac * * agg * diff
+new_textmarkup8_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 number.pdf * * * * * diff
 octest.pdf mac * * agg * diff
+octest.pdf * * * * fontations fuzzy=10,0.1,15
 open_a_weblink.pdf mac * * agg * diff
+open_a_weblink.pdf * * * * fontations fuzzy=10,0.1,15
 path_10_jd.pdf mac * * agg * diff
+path_10_jd.pdf * * * * fontations fuzzy=10,0.1,15
 path_5_pattern.pdf mac * * agg * diff
+path_5_pattern.pdf * * * * fontations fuzzy=10,0.1,15
 path_5_pattern.pdf mac * * skia * fuzzy
 path_6_graphics4.5.5.pdf mac * * agg * diff
+path_6_graphics4.5.5.pdf * * * * fontations fuzzy=10,0.1,15
 path_7.pdf mac * * agg * diff
+path_7.pdf * * * * fontations diff
 path_9.pdf mac * * agg * diff
+path_9.pdf * * * * fontations diff
 path_9.pdf mac_x86 * * skia * fuzzy
 percentage.pdf mac * * agg * diff
+percentage.pdf * * * * fontations fuzzy=10,0.1,15
 push_button.pdf * * * * * diff
 quick_start_guide.pdf mac * * agg * diff
+quick_start_guide.pdf * * * * fontations diff
 quick_start_guide.pdf * * * * * fuzzy=4,0.05,5.0
 radio_button.pdf * * * * * diff
 run_custom_validate_script.pdf * * * * * diff
 show_1.pdf mac * * agg * diff
+show_1.pdf * * * * fontations fuzzy=10,0.1,15
 signature.pdf * * * * * diff
 signature_4.pdf * * * * * diff
 simplified_field_notation.pdf mac * * agg * diff
+simplified_field_notation.pdf * * * * fontations fuzzy=10,0.1,15
 special.pdf mac * * agg * diff
+special.pdf * * * * fontations fuzzy=10,0.1,15
 submit_form.pdf mac * * agg * diff
+submit_form.pdf * * * * fontations fuzzy=10,0.1,15
 test_app_beep.pdf * * * * * diff
 test_control.pdf * * * * * diff
 text_field.pdf * * * * * diff
 text_field_font_input_decimal_point.pdf mac * * agg * diff
+text_field_font_input_decimal_point.pdf * * * * fontations fuzzy=10,0.1,15
 text_field_multiline_line_spacing.pdf mac * * agg * diff
+text_field_multiline_line_spacing.pdf * * * * fontations fuzzy=10,0.1,15
 thread_action.pdf mac * * agg * diff
+thread_action.pdf * * * * fontations fuzzy=10,0.1,15
 time.pdf mac * * agg * diff
+time.pdf * * * * fontations fuzzy=10,0.1,15
 transformation.pdf mac * * agg * diff
+transformation.pdf * * * * fontations fuzzy=10,0.1,15
 transparent.pdf mac * * agg * diff
 whats_new_in_v3.0.pdf mac * * agg * diff
+whats_new_in_v3.0.pdf * * * * fontations fuzzy=10,0.1,15
 whats_new_in_v3.0.pdf mac * * skia * fuzzy
 widget_javascript.pdf mac * * agg * diff
+widget_javascript.pdf * * * * fontations fuzzy=10,0.1,15
 
 # TODO(crbug.com/42270997): Remove after associated bug is fixed
 xfermodes2.pdf * * * agg * diff
 xfermodes2.pdf * * * skia * fuzzy
 
 zh_file1.pdf mac * * agg * diff
+zh_file1.pdf * * * * fontations fuzzy=10,0.1,15
 zh_function_list.pdf mac * * agg * diff
+zh_function_list.pdf * * * * fontations fuzzy=10,0.1,15
 zh_function_list.pdf mac * * skia * fuzzy
 zh_shared_document.pdf mac * * agg * diff
+zh_shared_document.pdf * * * * fontations diff
 
 # TODO(hnakashima): These might never have been run. Go over them and fix.
 
@@ -433,34 +609,60 @@
 # hardware goes away. The test expectation is just different enough from the ARM
 # rendering that fuzzy matching is not enough for it to match.
 2_color_tiling.pdf mac_x86 * * skia * diff
+2_color_tiling.pdf * * * * fontations fuzzy=10,0.1,15
 2_uncolor_tiling.pdf mac_x86 * * skia * diff
 FRC_10_8.2.4_View_C.pdf mac_x86 * * skia * diff
+FRC_10_8.2.4_View_C.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_zh_HK.pdf mac_x86 * * skia * diff
+Test_DateField_locale_zh_HK.pdf * * * * fontations fuzzy=10,0.1,15
 TimeField.pdf mac_x86 * * skia * diff
 annotation_circle_hidden.pdf mac_x86 * * skia * diff
+annotation_circle_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ellipse_hidden.pdf mac_x86 * * skia * diff
+annotation_ellipse_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight.pdf mac_x86 * * skia * diff
+annotation_highlight.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_empty_content.pdf mac_x86 * * skia * diff
+annotation_highlight_empty_content.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_hidden.pdf mac_x86 * * skia * diff
+annotation_highlight_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_no_author_no_content.pdf mac_x86 * * skia * diff
+annotation_highlight_no_author_no_content.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_highlight_no_content.pdf mac_x86 * * skia * diff
 annotation_highlight_opacity.pdf mac_x86 * * skia * diff
+annotation_highlight_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ink_hidden.pdf mac_x86 * * skia * diff
+annotation_ink_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_polygon.pdf mac_x86 * * skia * diff
+annotation_polygon.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square_fill_negative_border.pdf mac_x86 * * skia * diff
+annotation_square_fill_negative_border.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square_hidden.pdf mac_x86 * * skia * diff
+annotation_square_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_squiggly_hidden.pdf mac_x86 * * skia * diff
+annotation_squiggly_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_stamp.pdf mac_x86 * * skia * diff
+annotation_stamp.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_strikeout_hidden.pdf mac_x86 * * skia * diff
+annotation_strikeout_hidden.pdf * * * * fontations fuzzy=10,0.1,15
+annotation_strikeout_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_strikeout_opacity.pdf mac * * skia * fuzzy
 annotation_underline.pdf mac_x86 * * skia * diff
+annotation_underline.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_underline_hidden.pdf mac_x86 * * skia * diff
+annotation_underline_hidden.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_underline_opacity.pdf mac_x86 * * skia * diff
+annotation_underline_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 bug_668762.pdf mac_x86 * * skia * diff
+bug_668762.pdf * * * * fontations fuzzy=10,0.1,15
 en_14_foxit_products.pdf mac_x86 * * skia * diff
+en_14_foxit_products.pdf * * * * fontations fuzzy=10,0.1,15
 en_fqa.pdf mac_x86 * * skia * diff
+en_fqa.pdf * * * * fontations fuzzy=10,0.1,15
 font_1_embedded_font_en_feature.pdf mac_x86 * * skia * diff
+font_1_embedded_font_en_feature.pdf * * * * fontations fuzzy=10,0.1,15
 font_2_embedded_font_en_size14.pdf mac_x86 * * skia * diff
+font_2_embedded_font_en_size14.pdf * * * * fontations fuzzy=10,0.1,15
 transparent1.pdf mac_x86 * * skia * diff
 xfermodes.pdf mac_x86 * * skia * diff
 xfermodes.pdf * * * skia * fuzzy
@@ -485,8 +687,11 @@
 4_36.pdf mac * * skia * fuzzy
 FRC_10_8.2.4_View_C.pdf * * * gdi * diff
 FRC_8.4.1_Annotations_Type.pdf * * * gdi * diff
+FRC_8.4.1_Annotations_Type.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.4.3_Border_Stypes_W_different_values.pdf * * * gdi * diff
+FRC_8.4.3_Border_Stypes_W_different_values.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Screen_Img_D_Launch.pdf * * * gdi * diff
+FRC_8.5_Screen_Img_D_Launch.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Screen_Img_D_Launch.pdf mac * * skia * fuzzy
 FRC_8.5_URI_IsMap.pdf * * * gdi * diff
 FRC_8.5_URI_IsMap.pdf * * * * * fuzzy
@@ -593,41 +798,72 @@
 # TODO(crbug.com/42271067): Remove after associated bug is fixed
 Date_FormCale.pdf * * * gdi * diff
 FRC_3.5_P__3648_Password_1.pdf * * * gdi * diff
+FRC_3.5_P__3648_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * * gdi * diff
+FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.4.1_Annotations_AS_Off_.pdf * * * gdi * diff
+FRC_8.4.1_Annotations_AS_Off_.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.4.1_Annotations_AS_Yes_.pdf * * * gdi * diff
+FRC_8.4.1_Annotations_AS_Yes_.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Bl_Hide.pdf * * * gdi * diff
+FRC_8.5_Bl_Hide.pdf * * * * fontations diff
 FRC_8.5_E_GoTo_D.pdf * * * gdi * diff
+FRC_8.5_E_GoTo_D.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Fo_URI_Base.pdf * * * gdi * diff
+FRC_8.5_Fo_URI_Base.pdf * * * * fontations diff
 FRC_8.5_U_GoToR_NewWindow.pdf * * * gdi * diff
+FRC_8.5_U_GoToR_NewWindow.pdf * * * * fontations diff
 FRC_8.5_U_GoToR_NewWindow_2.pdf * * * gdi * diff
+FRC_8.5_U_GoToR_NewWindow_2.pdf * * * * fontations diff
 FRC_8.5_Widget_C.pdf * * * gdi * diff
+FRC_8.5_Widget_C.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Widget_F.pdf * * * gdi * diff
 FRC_8.5_Widget_K.pdf * * * gdi * diff
+FRC_8.5_Widget_K.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_Widget_V.pdf * * * gdi * diff
+FRC_8.5_Widget_V.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_8.5_X_GoToR_D.pdf * * * gdi * diff
+FRC_8.5_X_GoToR_D.pdf * * * * fontations fuzzy=10,0.1,15
 Line_Stroke.pdf * * * gdi * diff
 Oneof1.pdf * * * gdi * diff
 Oneof2.pdf * * * gdi * diff
 PagePosition_any_rest.pdf * * * gdi * diff
+PagePosition_any_rest.pdf * * * * fontations fuzzy=10,0.1,15
 PagePosition_first.pdf * * * gdi * diff
+PagePosition_first.pdf * * * * fontations diff
 PagePosition_last.pdf * * * gdi * diff
+PagePosition_last.pdf * * * * fontations diff
 PagePosition_no_any.pdf * * * gdi * diff
+PagePosition_no_any.pdf * * * * fontations fuzzy=10,0.1,15
 PagePosition_rest.pdf * * * gdi * diff
+PagePosition_rest.pdf * * * * fontations fuzzy=10,0.1,15
 PagePosition_rest_any.pdf * * * gdi * diff
+PagePosition_rest_any.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_en_CA.pdf * * * gdi * diff
+Test_DateField_locale_en_CA.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_en_GB.pdf * * * gdi * diff
+Test_DateField_locale_en_GB.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_en_US.pdf * * * gdi * diff
+Test_DateField_locale_en_US.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_fr_CA.pdf * * * gdi * diff
+Test_DateField_locale_fr_CA.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_fr_FR.pdf * * * gdi * diff
+Test_DateField_locale_fr_FR.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_nl_NL.pdf * * * gdi * diff
+Test_DateField_locale_nl_NL.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_zh_CN.pdf * * * gdi * diff
+Test_DateField_locale_zh_CN.pdf * * * * fontations fuzzy=10,0.1,15
 Test_DateField_locale_zh_HK.pdf * * * gdi * diff
 Test_Drop_downList.pdf * * * gdi * diff
+Test_Drop_downList.pdf * * * * fontations fuzzy=10,0.1,15
 Test_NumericField.pdf * * * gdi * diff
+Test_NumericField.pdf * * * * fontations fuzzy=10,0.1,15
 Test_PasswordField.pdf * * * gdi * diff
+Test_PasswordField.pdf * * * * fontations fuzzy=10,0.1,15
 Test_RadioButton.pdf * * * gdi * diff
+Test_RadioButton.pdf * * * * fontations fuzzy=10,0.1,15
 Test_ResetButton.pdf * * * gdi * diff
+Test_ResetButton.pdf * * * * fontations fuzzy=10,0.1,15
 Test_TextField.pdf * * * gdi * diff
 TimeField.pdf * * * gdi * diff
 action_execute_a_menu_item.pdf * * * gdi * diff
@@ -637,9 +873,11 @@
 action_run_javascript.pdf * * * gdi * diff
 action_submit_a_form.pdf * * * gdi * diff
 all_trigger_browsefordoc.pdf * * * gdi * diff
+all_trigger_browsefordoc.pdf * * * * fontations diff
 all_trigger_browsefordoc.pdf * * * * * fuzzy
 all_trigger_browsefordoc.pdf mac * * skia * fuzzy
 all_trigger_newdoc.pdf * * * gdi * diff
+all_trigger_newdoc.pdf * * * * fontations fuzzy=10,0.1,15
 all_trigger_newdoc.pdf mac * * skia * fuzzy
 all_trigger_run_js_lunchurl.pdf * * * gdi * diff
 all_trigger_run_js_maildoc.pdf * * * gdi * diff
@@ -703,7 +941,9 @@
 form_radio.pdf * * * gdi * diff
 form_same.pdf * * * gdi * diff
 form_textfield_focused_ltr.in * * * gdi * diff
+form_textfield_focused_ltr.in * * * * fontations fuzzy=10,0.1,15
 form_textfield_focused_rtl.in * * * gdi * diff
+form_textfield_focused_rtl.in * * * * fontations fuzzy=10,0.1,15
 form_textfield_selected_ltr.in * * * gdi * diff
 form_textfield_selected_rtl.in * * * gdi * diff
 format_alert_box.pdf * * * gdi * diff
@@ -736,6 +976,7 @@
 
 # TODO(crbug.com/42271068): Remove after associated bug is fixed
 1_10_watermark.pdf * * * gdi_skia * diff
+1_10_watermark.pdf * * * * fontations fuzzy=10,0.1,15
 1_10_watermark.pdf * * * skia * fuzzy
 1_matrix.pdf * * * gdi * diff
 2_color_tiling.pdf * * * gdi * diff
@@ -743,77 +984,107 @@
 2_shading_type_6_001.pdf * * * gdi_skia * diff
 2_uncolor_tiling.pdf * * * gdi * diff
 FRC_11_8.2.4_View_edit.pdf * * * gdi * diff
+FRC_11_8.2.4_View_edit.pdf * * * * fontations diff
 FRC_11_8.2.4_View_edit.pdf * * * * * fuzzy
 FRC_11_8.2.4_View_edit.pdf mac * * skia * fuzzy
 FRC_12_8.2.4_View_remove_all.pdf * * * gdi * diff
+FRC_12_8.2.4_View_remove_all.pdf * * * * fontations diff
 FRC_12_8.2.4_View_remove_all.pdf * * * * * fuzzy
 FRC_12_8.2.4_View_remove_all.pdf mac * * skia * fuzzy
 FRC_13_8.2.4_View_remove_value.pdf * * * gdi * diff
+FRC_13_8.2.4_View_remove_value.pdf * * * * fontations diff
 FRC_13_8.2.4_View_remove_value.pdf * * * * * fuzzy
 FRC_13_8.2.4_View_remove_value.pdf mac * * skia * fuzzy
 FRC_14_8.2.4_Sort_remove_all.pdf * * * gdi * diff
+FRC_14_8.2.4_Sort_remove_all.pdf * * * * fontations diff
 FRC_14_8.2.4_Sort_remove_all.pdf * * * * * fuzzy
 FRC_14_8.2.4_Sort_remove_all.pdf mac * * skia * fuzzy
 FRC_15_8.2.4_Sort_remove_value.pdf * * * gdi * diff
+FRC_15_8.2.4_Sort_remove_value.pdf * * * * fontations diff
 FRC_15_8.2.4_Sort_remove_value.pdf * * * * * fuzzy
 FRC_15_8.2.4_Sort_remove_value.pdf mac * * skia * fuzzy
 FRC_1_8.2.4_Type_8.6_.pdf * * * gdi * diff
+FRC_1_8.2.4_Type_8.6_.pdf * * * * fontations diff
 FRC_1_8.2.4_Type_8.6_.pdf * * * * * fuzzy
 FRC_1_8.2.4_Type_8.6_.pdf mac * * skia * fuzzy
 FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * gdi * diff
+FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * * fontations diff
 FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * * * fuzzy
 FRC_2_8.2.4_Type_8.6__remove_value.pdf mac * * skia * fuzzy
 FRC_3.5_AuthEvent_EFOpen.pdf * * * gdi * diff
+FRC_3.5_AuthEvent_EFOpen.pdf * * * * fontations diff
 FRC_3.5_AuthEvent_EFOpen.pdf mac * * skia * fuzzy
 FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * * gdi * diff
+FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * * * fontations diff
 FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf mac * * skia * fuzzy
 FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * * gdi * diff
+FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * * * fontations diff
 FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf mac * * skia * fuzzy
 FRC_3.5_CF_Strf_stmf_StdCF.pdf * * * gdi * diff
+FRC_3.5_CF_Strf_stmf_StdCF.pdf * * * * fontations diff
 FRC_3.5_CF_Strf_stmf_StdCF.pdf mac * * skia * fuzzy
 FRC_3.5_EncryptMetadata_None.pdf * * * gdi * diff
+FRC_3.5_EncryptMetadata_None.pdf * * * * fontations diff
 FRC_3.5_EncryptMetadata_None.pdf mac * * skia * fuzzy
 FRC_3.5_V_4_CFM_V2_.pdf * * * gdi * diff
+FRC_3.5_V_4_CFM_V2_.pdf * * * * fontations diff
 FRC_3.5_V_4_CFM_V2_.pdf mac * * skia * fuzzy
 FRC_3.5_V_5_CFM_AESV3.pdf * * * gdi * diff
+FRC_3.5_V_5_CFM_AESV3.pdf * * * * fontations diff
 FRC_3.5_V_5_CFM_AESV3.pdf mac * * skia * fuzzy
 FRC_3.5_v_1_length_40_Filter_standard.pdf * * * gdi * diff
+FRC_3.5_v_1_length_40_Filter_standard.pdf * * * * fontations diff
 FRC_3.5_v_1_length_40_Filter_standard.pdf mac * * skia * fuzzy
 FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * * gdi * diff
+FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * * * fontations diff
 FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf mac * * skia * fuzzy
 FRC_3_8.2.4_Type_8.6__edit_.pdf * * * gdi * diff
+FRC_3_8.2.4_Type_8.6__edit_.pdf * * * * fontations diff
 FRC_3_8.2.4_Type_8.6__edit_.pdf * * * * * fuzzy
 FRC_3_8.2.4_Type_8.6__edit_.pdf mac * * skia * fuzzy
 FRC_4.5.5_Pattern_shading.pdf * * * gdi * diff
+FRC_4.5.5_Pattern_shading.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_4.5.5_Pattern_shading.pdf mac * * skia * fuzzy
 FRC_4.5.5_Pattern_tiling.pdf * * * gdi_skia * diff
+FRC_4.5.5_Pattern_tiling.pdf * * * * fontations fuzzy=10,0.1,15
 FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * gdi * diff
+FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * * fontations diff
 FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * * * fuzzy
 FRC_4_8.2.4_Schema_8.6__remove_all.pdf mac * * skia * fuzzy
 FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * gdi * diff
+FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * * fontations diff
 FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * * * fuzzy
 FRC_5_8.2.4_Schema_8.6__remove_value.pdf mac * * skia * fuzzy
 FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * gdi * diff
+FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * * fontations diff
 FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * * * fuzzy
 FRC_6_8.2.4_Schema_8.6__remove_obj.pdf mac * * skia * fuzzy
 FRC_7_8.2.4_View_H.pdf * * * gdi * diff
+FRC_7_8.2.4_View_H.pdf * * * * fontations diff
 FRC_7_8.2.4_View_H.pdf * * * * * fuzzy
 FRC_7_8.2.4_View_H.pdf mac * * skia * fuzzy
 FRC_8_8.2.4_View_D.pdf * * * gdi * diff
+FRC_8_8.2.4_View_D.pdf * * * * fontations diff
 FRC_8_8.2.4_View_D.pdf * * * * * fuzzy
 FRC_8_8.2.4_View_D.pdf mac * * skia * fuzzy
 FRC_9_8.2.4_View_T.pdf * * * gdi * diff
+FRC_9_8.2.4_View_T.pdf * * * * fontations diff
 FRC_9_8.2.4_View_T.pdf * * * * * fuzzy
 FRC_9_8.2.4_View_T.pdf mac * * skia * fuzzy
 annotation_circle_fill_opacity.pdf * * * gdi_skia * diff
+annotation_circle_fill_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_circle_fill_opacity.pdf mac * * skia * fuzzy
 annotation_square_fill_opacity.pdf * * * gdi_skia * diff
+annotation_square_fill_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square_fill_opacity.pdf mac * * skia * fuzzy
 annotation_square_fill_opacity_dash.pdf * * * gdi_skia * diff
+annotation_square_fill_opacity_dash.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square_fill_opacity_dash.pdf mac * * skia * fuzzy
 bug_0_length_line.pdf * * * gdi * diff
 bug_883026.pdf * * * gdi_skia * diff
+bug_883026.pdf * * * * fontations fuzzy=10,0.1,15
 clipping_text.pdf * * * gdi * diff
+clipping_text.pdf * * * * fontations fuzzy=10,0.1,15
 en_fqa.pdf * * * gdi_skia * diff
 en_introduce.pdf * * * gdi_skia * diff
 en_system.pdf * * * gdi * diff
@@ -821,6 +1092,7 @@
 example_012.pdf * * * gdi * diff
 gradient_many_stops.pdf * * * gdi * diff
 group_xobject.pdf * * * gdi * diff
+group_xobject.pdf * * * * fontations fuzzy=10,0.1,15
 image_gif.pdf * * * gdi_skia * diff
 image_gif.pdf mac * * skia * fuzzy
 image_ico.pdf * * * gdi_skia * diff
@@ -969,11 +1241,16 @@
 bug_1304714.in * * * gdi * diff
 bug_1337.in * * * gdi * diff
 bug_1372651.in * * * gdi * diff
+bug_1372651.in * * * * fontations fuzzy=10,0.1,15
 bug_477200528.in * * * gdi * diff
+bug_477200528.in * * * * fontations fuzzy=10,0.1,15
 bug_725389.in * * * gdi * diff
+bug_725389.in * * * * fontations fuzzy=10,0.1,15
 bug_733528.in * * * gdi * diff
+bug_733528.in * * * * fontations fuzzy=10,0.1,15
 bug_736695_1.in * * * gdi * diff
 bug_736695_2.in * * * gdi * diff
+bug_736695_2.in * * * * fontations fuzzy=10,0.1,15
 bug_736695_3.in * * * gdi * diff
 bug_736695_4.in * * * gdi * diff
 bug_983137.in * * * gdi * diff
@@ -990,14 +1267,17 @@
 resolve_nodes_0.pdf * * * * * fuzzy
 scrollable_widgets1.in * * * gdi * diff
 scrollable_widgets2.in * * * gdi * diff
+scrollable_widgets2.in * * * * fontations fuzzy=10,0.1,15
 static_list_box_caption.pdf * * * gdi * diff
 static_password_field_rotate.pdf * * * gdi * diff
 text_form_custom_font.in * * * gdi * diff
 text_form_multiline.in * * * gdi * diff
+text_form_multiline.in * * * * fontations fuzzy=10,0.1,15
 xfa_bmp_image.in * * * gdi * diff
 xfa_gif_image.in * * * gdi * diff
 xfa_jpg_image.in * * * gdi * diff
 xfa_node_caption.pdf * * * gdi * diff
+xfa_node_caption.pdf * * * * fontations fuzzy=10,0.1,15
 xfa_node_caption.pdf mac * * skia * fuzzy
 xfa_png_image.in * * * gdi * diff
 xfa_rectangle_node.in * * * gdi * diff
@@ -1023,6 +1303,7 @@
 bug_42270979_1.in * * * gdi * diff
 bug_42270979_3.in * * * gdi * diff
 bug_632.in * * * gdi * diff
+bug_632.in * * * * fontations fuzzy=10,0.1,15
 bug_660850.in * * * gdi * diff
 long_dashed_line.in * * * gdi * diff
 matte.in * * * gdi_skia * diff
@@ -1042,6 +1323,7 @@
 # name no test that appears above.
 #
 2_9_stamp2.pdf mac * * skia * fuzzy
+2_9_stamp2.pdf * * * * fontations fuzzy=10,0.1,15
 2_halftone.pdf mac * * skia * fuzzy
 3_image_imagemask.pdf mac * * skia * fuzzy
 FRC_3.5_CF_Strf_stmf_DefaultCryptFilter.pdf * * * * * blank
@@ -1050,27 +1332,46 @@
 FRC_3.5_Filter_PubSec_SubFilter_s5.pdf * * * * * blank
 FRC_3.5_Filter_PubSec_Sub_SubFilter_s4.pdf * * * * * blank
 FRC_8.4.1_Annotations_Border.pdf mac * * skia * fuzzy
+FRC_8.4.1_Annotations_Border.pdf * * * * fontations fuzzy=10,0.1,15
 MouseEvents.pdf * * * * * blank
 Oneof.pdf * * * * * blank
 annotation_circle.pdf mac * * skia * fuzzy
+annotation_circle.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_circle_dash.pdf mac * * skia * fuzzy
+annotation_circle_dash.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ellipse.pdf mac * * skia * fuzzy
+annotation_ellipse.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ellipse_fill.pdf mac * * skia * fuzzy
+annotation_ellipse_fill.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ellipse_fill_dash.pdf mac * * skia * fuzzy
+annotation_ellipse_fill_dash.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_freetext.pdf mac * * skia * fuzzy
+annotation_freetext.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ink.pdf mac * * skia * fuzzy
+annotation_ink.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ink_dash.pdf mac * * skia * fuzzy
+annotation_ink_dash.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ink_dot.pdf mac * * skia * fuzzy
+annotation_ink_dot.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_ink_multiple.pdf mac * * skia * fuzzy
+annotation_ink_multiple.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square.pdf mac * * skia * fuzzy
+annotation_square.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_square_dash.pdf mac * * skia * fuzzy
+annotation_square_dash.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_squiggly.pdf mac * * skia * fuzzy
+annotation_squiggly.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_squiggly_opacity.pdf mac * * skia * fuzzy
+annotation_squiggly_opacity.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_strikeout.pdf mac * * skia * fuzzy
+annotation_strikeout.pdf * * * * fontations fuzzy=10,0.1,15
 annotation_text.pdf mac * * skia * fuzzy
+annotation_text.pdf * * * * fontations fuzzy=10,0.1,15
 bug_651304.pdf * * * * * blank
 ch_9_android.pdf mac * * skia * fuzzy
+ch_9_android.pdf * * * * fontations fuzzy=10,0.1,15
 en_uicase_2_.pdf mac * * skia * fuzzy
+en_uicase_2_.pdf * * * * fontations fuzzy=10,0.1,15
 image_foxit.pdf * * * * * fuzzy=10,0.35,10.0
 image_transformer_other.in mac * * skia * fuzzy
 outline.pdf * * * * * blank
@@ -1084,5 +1385,210 @@
 shading_2_8.pdf mac * * skia * fuzzy
 shading_2_9.pdf mac * * skia * fuzzy
 zh_file_structure.pdf mac * * skia * fuzzy
+zh_file_structure.pdf * * * * fontations diff
 zh_page.pdf mac * * skia * fuzzy
+zh_page.pdf * * * * fontations fuzzy=10,0.1,15
 zh_webdav.pdf mac * * skia * fuzzy
+zh_webdav.pdf * * * * fontations fuzzy=10,0.1,15
+#
+# Fontations, naming no test that appears above.
+#
+2_color_lab.pdf * * * * fontations diff
+FRC_4.5.3_DeviceCMYK_K1.pdf * * * * fontations diff
+FRC_4.5.3_DeviceRGB_RG1.pdf * * * * fontations diff
+FRC_8.5_Catalog_OpenAction.pdf * * * * fontations diff
+FRC_8.5_Page_O_URI.pdf * * * * fontations diff
+bug_1021762.in * * * * fontations fuzzy
+bug_601362.in * * * * fontations diff
+bug_736703.in * * * * fontations diff
+bug_846.in * * * * fontations diff
+
+#
+# Fontations fuzzy matching, naming no test that appears above.
+#
+2_8_stamp1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_10_8.2.2_Prev_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_10_8.2.4__remove_ModDate_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_11_8.2.2_Prev_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_11_8.2.4__remove_ModDate_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_12_8.2.2__Next_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_12_8.2.4__remove_ModDate_obj_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_13_8.2.2__Next_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_13_8.2.4_remove_Size_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_14_8.2.2__Next_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_14_8.2.4_remove_Size_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_15_8.2.2__Next_exchange.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_15_8.2.4_remove_Size_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_16_8.2.2__Next_add.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_16_8.2.4__remove_CompressedSize__value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_17_8.2.2__T8.4_First_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_17_8.2.4__remove_CompressedSize__all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_18_8.2.2__T8.4_First_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_18_8.2.4__remove_CompressedSize__obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_19_8.2.2__T8.4_First_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_19_8.2.4__remove_CreationDate_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_1_8.2.2__Title_edit.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_1_8.2.4__original.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_20_8.2.2__T8.4_First_remove_value2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_20_8.2.4__remove_CreationDate_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_21_8.2.2__T8.4_First_remove_all2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_21_8.2.4__remove_CreationDate_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_22_8.2.2__T8.4_First_remove_obj2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_22_8.2.4__remove_Order_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_23_8.2.2__T8.4_Last_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_23_8.2.4__remove_Order_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_24_8.2.2__T8.4_Last_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_24_8.2.4__remove_Order_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_25_8.2.2__T8.4_Last_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_26_8.2.2__T8.4_Last_remove_value2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_27_8.2.2__T8.4_Last_remove_all2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_28_8.2.2__T8.4_Last_remove_obj2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_29_8.2.2__T8.4_First_Last_exchange.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_2_8.2.2__Title_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_2_8.2.4__add_type_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P_4_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__1852_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__2584_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__2616_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__2880_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__3376_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__3392_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__3608_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3.5_P__3900_Password_1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_31_8.2.2_add_dest_entry.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_32_8.2.2_A_Support_action.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_33_8.2.2_A_empty.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_34_8.2.2_A_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_35_8.2.2_A_remove_A_item.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_36_8.2.2_Dest.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_37_8.2.2_Dest_empty.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_38_8.2.2_Dest_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_39_8.2.2_C_edit.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3_8.2.2__Title_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_3_8.2.4__add_type_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.3_DeviceCMYK_k.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.3_DeviceGray_G1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.3_DeviceGray_g.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.3_DeviceRGB_rg.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_CalGray_gamma.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_CalGray_whitepoint.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_CalRGB_gamma.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_CalRGB_matrix.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_CalRGB_whitepoint.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_ICCBased.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_Lab.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_RI_Absolute.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_RI_Perceptual.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_RI_Relative.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_RI_Saturation.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.4_Separation.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.5_DeviceN.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4.5.5_Indexed.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_40_8.2.2_C_empty1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_41_8.2.2_C_empty2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_42_8.2.2_C_empty3.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_43_8.2.2_C_empty.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_44_8.2.2_C_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_45_8.2.2_F_edit_F_1_2_3.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_46_8.2.2_F_edit_F__1__2__3.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_47_8.2.2_F_edit_F_32__32.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_48_8.2.2_F_edit_F_100__100.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_49_8.2.2_F_empty.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4_8.2.2_Parent_edit2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_4_8.2.4__remove_FileName_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_50_8.2.2_F_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_51_8.2.2_T_8.4__Count_edit_count_100.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_52_8.2.2_T_8.4__Count_edit_count_0.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_53_8.2.2_T_8.4__Count_empty.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_54_8.2.2_T_8.4__Count_empty1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_55_8.2.2_T_8.4__Count_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_56_8.2.2_C_edit_C__1.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_57_8.2.2_C_edit_C_2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_58_8.2.2_Count_edit_count__2.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_5_8.2.2_Parent_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_5_8.2.4__remove_FileName_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_6_8.2.2_Parent_remove_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_6_8.2.4__remove_FileName_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_7_8.2.2_Parent_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_7_8.2.4__remove_Description_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_AP_N_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_AP_N_R_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_C.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_M_text_string_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_P.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.1_Annotations_Rect.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_Hidden.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_Invisible.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_Locked.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_LockedContents.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_NoRotate.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_NoView.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_NoZoom.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_Print.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_ReadOnly.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.2_Annotation_Flags_F_ToggleNoView.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_D_different_values.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_D_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_I_different_values.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_I_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_S_different_values_BE_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_S_different_values_BS_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_S_not_exist_BS_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_S_remove_BE_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_S_remove_BS_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_Type_add.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_Type_not_exist_default_.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.4.3_Border_Stypes_W_remove.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Catalog_WC.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_DP.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_DS.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Link_URL.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Outline_A.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Page_PV_Named_Phantom.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Screen_Fo_JavaScript.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_Screen_Rendition.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_WP.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8.5_WS.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8_8.2.2_Parent_edit.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_8_8.2.4__remove__Description_all.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_9_8.2.2_Prev_remove_value.pdf * * * * fontations fuzzy=10,0.1,15
+FRC_9_8.2.4__remove__Description_obj.pdf * * * * fontations fuzzy=10,0.1,15
+annotation_highlight_no_content.pdf * * * * fontations fuzzy=10,0.1,15
+bug_113910.in * * * * fontations fuzzy=10,0.1,15
+bug_1752.in * * * * fontations fuzzy=10,0.1,15
+bug_1772.in * * * * fontations fuzzy=10,0.1,15
+bug_1922.in * * * * fontations fuzzy=10,0.1,15
+bug_432208037.in * * * * fontations fuzzy=10,0.1,15
+bug_493126_endobj_bug.pdf * * * * fontations fuzzy=10,0.1,15
+bug_493126_endobj_bug_weirdWS.pdf * * * * fontations fuzzy=10,0.1,15
+bug_524043_1.in * * * * fontations fuzzy=10,0.1,15
+bug_524043_2.in * * * * fontations fuzzy=10,0.1,15
+bug_524043_3.in * * * * fontations fuzzy=10,0.1,15
+bug_524043_4.in * * * * fontations fuzzy=10,0.1,15
+bug_524043_5.in * * * * fontations fuzzy=10,0.1,15
+bug_524043_7.in * * * * fontations fuzzy=10,0.1,15
+bug_528103.in * * * * fontations fuzzy=10,0.1,15
+bug_543018_1.in * * * * fontations fuzzy=10,0.1,15
+bug_543018_2.in * * * * fontations fuzzy=10,0.1,15
+bug_551258_1.in * * * * fontations fuzzy=10,0.1,15
+bug_665467.in * * * * fontations fuzzy=10,0.1,15
+bug_736695_3.in * * * * fontations fuzzy=10,0.1,15
+bug_820345.in * * * * fontations fuzzy=10,0.1,15
+bug_845697.in * * * * fontations fuzzy=10,0.1,15
+bug_909762.in * * * * fontations fuzzy=10,0.1,15
+bug_925736.pdf * * * * fontations fuzzy=10,0.1,15
+ch_7_10.pdf * * * * fontations fuzzy=10,0.1,15
+ch_7_11.pdf * * * * fontations fuzzy=10,0.1,15
+ch_7_12.pdf * * * * fontations fuzzy=10,0.1,15
+ch_7_14.pdf * * * * fontations fuzzy=10,0.1,15
+ch_7_15.pdf * * * * fontations fuzzy=10,0.1,15
+font_size.in * * * * fontations fuzzy=10,0.1,15
+form_textfield_selected_ltr.in * * * * fontations fuzzy=10,0.1,15
+form_textfield_selected_rtl.in * * * * fontations fuzzy=10,0.1,15
+foxittext.pdf * * * * fontations fuzzy=10,0.1,15
+freetext_annotation_with_da.in * * * * fontations fuzzy=10,0.1,15
+freetext_annotation_without_da.pdf * * * * fontations fuzzy=10,0.1,15
+generation_numbers1.pdf * * * * fontations fuzzy=10,0.1,15
+generation_numbers2.pdf * * * * fontations fuzzy=10,0.1,15
+password.in * * * * fontations fuzzy=10,0.1,15
+scrollable_widgets1.in * * * * fontations fuzzy=10,0.1,15
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp
index f2c76e1..5018647 100644
--- a/testing/embedder_test.cpp
+++ b/testing/embedder_test.cpp
@@ -544,14 +544,16 @@
       pixels_different =
           CompareBGRBitmapToPng(bitmap_span, stride, decoded_png, options);
       break;
-    case FPDFBitmap_BGRx:
+    case FPDFBitmap_BGRx: {
       pixels_different =
           CompareBGRxBitmapToPng(bitmap_span, stride, decoded_png, options);
       break;
-    case FPDFBitmap_BGRA:
+    }
+    case FPDFBitmap_BGRA: {
       pixels_different =
           CompareBGRABitmapToPng(bitmap_span, stride, decoded_png, options);
       break;
+    }
 #ifdef PDF_USE_SKIA
     case FPDFBitmap_BGRA_Premul:
       pixels_different = CompareBGRxPremultBitmapToPng(bitmap_span, stride,
@@ -1176,7 +1178,11 @@
                                  std::string_view expectation_png_name) {
   std::string png_path = GetEmbedderTestExpectationPath(expectation_png_name);
   SCOPED_TRACE(testing::Message() << "CompareBitmap() with " << png_path);
-  CompareBitmapToPngFile(bitmap, png_path, kExactDiffOptions);
+  DiffOptions options = kExactDiffOptions;
+  if (EmbedderTestEnvironment::GetInstance()->fontations()) {
+    options = kFontationsDiffOptions;
+  }
+  CompareBitmapToPngFile(bitmap, png_path, options);
   if (EmbedderTestEnvironment::GetInstance()->write_pngs()) {
     WriteBitmapToPng(bitmap, png_path);
   }
@@ -1187,6 +1193,22 @@
     FPDF_BITMAP bitmap,
     std::string_view expectation_png_name,
     const DiffOptions& options) {
+  DiffOptions effective_options = options;
+  if (EmbedderTestEnvironment::GetInstance()->fontations()) {
+    effective_options.max_pixel_per_channel_delta =
+        std::max(options.max_pixel_per_channel_delta,
+                 kFontationsDiffOptions.max_pixel_per_channel_delta);
+    effective_options.max_mean_squared_error =
+        std::max(options.max_mean_squared_error,
+                 kFontationsDiffOptions.max_mean_squared_error);
+    if (options.window_size > 0) {
+      effective_options.window_size =
+          std::max(options.window_size, kFontationsDiffOptions.window_size);
+      effective_options.max_window_mean_squared_error =
+          std::max(options.max_window_mean_squared_error,
+                   kFontationsDiffOptions.max_window_mean_squared_error);
+    }
+  }
   std::vector<std::string> candidate_png_path =
       GetEmbedderTestExpectationsWithSuffixPath(expectation_png_name);
   for (const std::string& png_path : candidate_png_path) {
@@ -1196,7 +1218,7 @@
 
     SCOPED_TRACE(testing::Message()
                  << "CompareBitmapWithExpectationSuffix() with " << png_path);
-    CompareBitmapToPngFile(bitmap, png_path, options);
+    CompareBitmapToPngFile(bitmap, png_path, effective_options);
     if (EmbedderTestEnvironment::GetInstance()->write_pngs()) {
       WriteBitmapToPng(bitmap, png_path);
     }
diff --git a/testing/embedder_test_environment.h b/testing/embedder_test_environment.h
index a83ebda..3ac6404 100644
--- a/testing/embedder_test_environment.h
+++ b/testing/embedder_test_environment.h
@@ -32,6 +32,7 @@
   void AddFlags(int argc, char** argv);
 
   bool write_pngs() const { return write_pngs_; }
+  bool fontations() const { return fontations_; }
 
  private:
   void AddFlag(const std::string& flag);
diff --git a/testing/utils/pixel_diff_util.h b/testing/utils/pixel_diff_util.h
index 6be6b8c..c15e636 100644
--- a/testing/utils/pixel_diff_util.h
+++ b/testing/utils/pixel_diff_util.h
@@ -17,6 +17,15 @@
 inline constexpr int kMaxFuzzyWindowSize = 8;
 inline constexpr double kMaxFuzzyWindowMeanSquaredError = 15.0;
 
+// Fontations fuzzy matching limits: allows a larger per-channel delta to
+// accommodate subpixel curve antialiasing variances while enforcing a tight
+// mean squared error bound.
+inline constexpr uint8_t kMaxFontationsPixelDelta = 10;
+inline constexpr double kMaxFontationsMeanSquaredError = 0.10;
+inline constexpr int kMaxFontationsWindowSize = kMaxFuzzyWindowSize;
+inline constexpr double kMaxFontationsWindowMeanSquaredError =
+    kMaxFuzzyWindowMeanSquaredError;
+
 // Options controlling pixel difference comparisons.
 struct DiffOptions {
   int max_pixel_per_channel_delta = 0;
@@ -32,6 +41,12 @@
     .window_size = kMaxFuzzyWindowSize,
     .max_window_mean_squared_error = kMaxFuzzyWindowMeanSquaredError,
 };
+inline constexpr DiffOptions kFontationsDiffOptions = {
+    .max_pixel_per_channel_delta = kMaxFontationsPixelDelta,
+    .max_mean_squared_error = kMaxFontationsMeanSquaredError,
+    .window_size = kMaxFontationsWindowSize,
+    .max_window_mean_squared_error = kMaxFontationsWindowMeanSquaredError,
+};
 
 // Returns the largest difference in pixel channels between `baseline_pixel` and
 // `actual_pixel`. Pixels are expected to be in 32-bit ARGB or BGRA format.
diff --git a/xfa/fde/cfde_textout_unittest.cpp b/xfa/fde/cfde_textout_unittest.cpp
index 4add08e..947f217 100644
--- a/xfa/fde/cfde_textout_unittest.cpp
+++ b/xfa/fde/cfde_textout_unittest.cpp
@@ -98,6 +98,10 @@
       return "bc1f736237b08d13db06c09f6becc9f7";
     }
 #endif
+    if (CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
+        CFX_FontMgr::FontBackend::kFontations) {
+      return "59f4a2cfb7938032f144954642babe58";
+    }
     return "c143f8450f661a489cc9423de7cc1acc";
   }();
   EXPECT_EQ(checksum, GetBitmapChecksum());
@@ -136,6 +140,10 @@
       return "e9aaffff1ea680bd5dc40a7b8904788d";
     }
 #endif
+    if (CFX_GEModule::Get()->GetFontMgr()->GetFontBackend() ==
+        CFX_FontMgr::FontBackend::kFontations) {
+      return "89adff3e02833425d42a2f89ef8fd7e3";
+    }
     return "add7cf2819b3e1397d8a60a9ec436a86";
   }
 };