Make XFA pixel tests more stable

When generating PDFs using the fixup script and a .in, specify them to
to use Ahem.ttf as the text font. Ahem is a font designed to reduce
flakiness in pixel tests due to font rendering differences between
platforms. Specifically the glyphs in the font are standard size black
boxes, so though the specific text content cannot be easily compared,
things like layout and high level changes to the content can still
be tested. Testing things like specific text changes should be done
via an embedder test, where the strings in the elements can be
extracted and inspected.

The font itself is is CID type 2 font, which is relatively complex to
correctly embed in a PDF due to subsetting and other features. Instead
of embedding it in the generated PDFs, which was originally attempted,
it is being supplied to pdfium_test via the --font-dir flag. This flag
overrides where the binary looks for system fonts. This works
correctly on Mac and Linux, but not on Windows, which is why that
platform remains suppressed.

BUG=pdfium:1008,pdfium:1020

Change-Id: I00811536de98f736fc599d96b397194ccf8db0cd
Reviewed-on: https://pdfium-review.googlesource.com/27790
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index 62d7c73..99aff8c 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -83,8 +83,7 @@
   if (!pFontMapper)
     return false;
 
-  if (pFontMapper->m_InstalledTTFonts.empty())
-    pFontMapper->LoadInstalledFonts();
+  pFontMapper->LoadInstalledFonts();
 
   for (const auto& font : pFontMapper->m_InstalledTTFonts) {
     if (font.Compare(sFontFaceName.AsStringView()))
diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS
index 7633e04..cb6b9bf 100644
--- a/testing/SUPPRESSIONS
+++ b/testing/SUPPRESSIONS
@@ -330,6 +330,8 @@
 dynamic_password_field_background_fill.pdf * * *
 resolve_nodes.pdf * * *
 standard_symbols.pdf * * *
-xfa_example.in * * *
+# TODO(rharrison): Remove after pdfium:1095 is fixed
+xfa_example.in win * *
 xfa_node_caption.pdf * * *
-xfa_textfield.in * * *
+# TODO(rharrison): Remove after pdfium:1095 is fixed
+xfa_textfield.in win * *
diff --git a/testing/resources/fonts/Ahem.ttf b/testing/resources/fonts/Ahem.ttf
new file mode 100644
index 0000000..4d4785a
--- /dev/null
+++ b/testing/resources/fonts/Ahem.ttf
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_example.in b/testing/resources/pixel/xfa_specific/use_ahem/xfa_example.in
similarity index 95%
rename from testing/resources/pixel/xfa_specific/xfa_example.in
rename to testing/resources/pixel/xfa_specific/use_ahem/xfa_example.in
index d8be96f..0e9ac15 100644
--- a/testing/resources/pixel/xfa_specific/xfa_example.in
+++ b/testing/resources/pixel/xfa_specific/use_ahem/xfa_example.in
@@ -1,6 +1,5 @@
 {{header}}
 
-%% Original object ID: 24 0
 {{object 1 0}}
 <<
   /AcroForm 2 0 R
@@ -15,7 +14,6 @@
 >>
 endobj
 
-%% Original object ID: 32 0
 {{object 2 0}}
 <<
   /XFA [
@@ -51,6 +49,7 @@
     </pageSet>
     <subform w="576pt" h="756pt" name="Page1">
       <draw name="HelloWorld" y="0.5in" x="0.5in" w="5in" h="2in">
+       <font typeface="Ahem" size="20pt"/>
         <value>
           <text>Hello, world.</text>
         </value>
diff --git a/testing/resources/pixel/xfa_specific/xfa_example_expected_mac.pdf.0.png b/testing/resources/pixel/xfa_specific/use_ahem/xfa_example_expected.pdf.0.png
similarity index 63%
rename from testing/resources/pixel/xfa_specific/xfa_example_expected_mac.pdf.0.png
rename to testing/resources/pixel/xfa_specific/use_ahem/xfa_example_expected.pdf.0.png
index 9a682f7..e1e62cc 100644
--- a/testing/resources/pixel/xfa_specific/xfa_example_expected_mac.pdf.0.png
+++ b/testing/resources/pixel/xfa_specific/use_ahem/xfa_example_expected.pdf.0.png
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_textfield.evt b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.evt
similarity index 82%
rename from testing/resources/pixel/xfa_specific/xfa_textfield.evt
rename to testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.evt
index 3d11056..1279468 100644
--- a/testing/resources/pixel/xfa_specific/xfa_textfield.evt
+++ b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.evt
@@ -1,4 +1,3 @@
-mousemove,20,20
 mousedown,left,20,20
 charcode,72
 charcode,101
@@ -6,3 +5,4 @@
 charcode,108
 charcode,111
 charcode,33
+mousedown,left,20,60
diff --git a/testing/resources/pixel/xfa_specific/xfa_textfield.in b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.in
similarity index 61%
rename from testing/resources/pixel/xfa_specific/xfa_textfield.in
rename to testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.in
index bdd6850..218dbce 100644
--- a/testing/resources/pixel/xfa_specific/xfa_textfield.in
+++ b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield.in
@@ -50,12 +50,30 @@
       </pageArea>
     </pageSet>
     <subform w="576pt" h="756pt" name="Page1">
-      <field name="TextField1" y="0pt" x="0pt" w="425pt" h="20pt">
+      <field name="TextField1" y="0pt" x="0pt" w="200pt" h="32pt">
+        <font typeface="Ahem" size="20pt"/>
         <ui>
-          <textEdit>
-            <font typeface="Helvetica" size="16pt"/>
-          </textEdit>
+          <textEdit/>
         </ui>
+        <para vAlign="middle"/>
+      </field>
+      <field name="Button1" y="42pt" x="0pt" w="100pt" h="32pt">
+        <ui>
+          <button highlight="inverted"/>
+        </ui>
+        <font typeface="Ahem" size="20pt"/>
+        <caption>
+          <value>
+            <text>Dummy</text>
+          </value>
+          <para vAlign="middle" hAlign="center"/>
+        </caption>
+        <border hand="right">
+          <edge stroke="raised"/>
+          <fill>
+            <color value="212,208,200"/>
+          </fill>
+        </border>
       </field>
     </subform>
   </subform>
diff --git a/testing/resources/pixel/xfa_specific/xfa_textfield_expected_mac.pdf.0.png b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield_expected.pdf.0.png
similarity index 68%
rename from testing/resources/pixel/xfa_specific/xfa_textfield_expected_mac.pdf.0.png
rename to testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield_expected.pdf.0.png
index c4d4ce5..4d9a934 100644
--- a/testing/resources/pixel/xfa_specific/xfa_textfield_expected_mac.pdf.0.png
+++ b/testing/resources/pixel/xfa_specific/use_ahem/xfa_textfield_expected.pdf.0.png
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_example_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/xfa_example_expected.pdf.0.png
deleted file mode 100644
index 81c317a..0000000
--- a/testing/resources/pixel/xfa_specific/xfa_example_expected.pdf.0.png
+++ /dev/null
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_example_expected_win.pdf.0.png b/testing/resources/pixel/xfa_specific/xfa_example_expected_win.pdf.0.png
deleted file mode 100644
index 9a682f7..0000000
--- a/testing/resources/pixel/xfa_specific/xfa_example_expected_win.pdf.0.png
+++ /dev/null
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_textfield_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/xfa_textfield_expected.pdf.0.png
deleted file mode 100644
index e5ad501..0000000
--- a/testing/resources/pixel/xfa_specific/xfa_textfield_expected.pdf.0.png
+++ /dev/null
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/xfa_textfield_expected_win.pdf.0.png b/testing/resources/pixel/xfa_specific/xfa_textfield_expected_win.pdf.0.png
deleted file mode 100644
index c4d4ce5..0000000
--- a/testing/resources/pixel/xfa_specific/xfa_textfield_expected_win.pdf.0.png
+++ /dev/null
Binary files differ
diff --git a/testing/tools/fixup_pdf_template.py b/testing/tools/fixup_pdf_template.py
index bee7a3d..0f53678 100755
--- a/testing/tools/fixup_pdf_template.py
+++ b/testing/tools/fixup_pdf_template.py
@@ -30,11 +30,15 @@
 import re
 import sys
 
+SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+
 class StreamLenState:
   START = 1
   FIND_STREAM = 2
   FIND_ENDSTREAM = 3
 
+
 class TemplateProcessor:
   HEADER_TOKEN = '{{header}}'
   HEADER_REPLACEMENT = '%PDF-1.7\n%\xa0\xf2\xa4\xf4'
@@ -45,7 +49,7 @@
   XREF_REPLACEMENT_N = '%010d %05d n \n'
   XREF_REPLACEMENT_F = '0000000000 65535 f \n'
   # XREF rows must be exactly 20 bytes - space required.
-  assert(len(XREF_REPLACEMENT_F) == 20)
+  assert len(XREF_REPLACEMENT_F) == 20
 
   TRAILER_TOKEN = '{{trailer}}'
   TRAILER_REPLACEMENT = 'trailer <<\n  /Root 1 0 R\n  /Size %d\n>>'
@@ -230,7 +234,7 @@
 
   def preprocess_line(self, line):
     if self.STREAMLEN_TOKEN in line:
-      assert(self.streamlen_state == StreamLenState.START)
+      assert self.streamlen_state == StreamLenState.START
       self.streamlen_state = StreamLenState.FIND_STREAM
       self.streamlens.append(0)
       return
diff --git a/testing/tools/test_runner.py b/testing/tools/test_runner.py
index 3fa1c79..3737969 100644
--- a/testing/tools/test_runner.py
+++ b/testing/tools/test_runner.py
@@ -51,6 +51,8 @@
   # tests and outputfiles is a list tuples:
   #          (path_to_image, md5_hash_of_pixelbuffer)
   def GenerateAndTest(self, input_filename, source_dir):
+    use_ahem = 'use_ahem' in source_dir
+
     input_root, _ = os.path.splitext(input_filename)
     expected_txt_path = os.path.join(source_dir, input_root + '_expected.txt')
 
@@ -76,7 +78,7 @@
     if os.path.exists(expected_txt_path):
       raised_exception = self.TestText(input_root, expected_txt_path, pdf_path)
     else:
-      raised_exception, results = self.TestPixel(input_root, pdf_path)
+      raised_exception, results = self.TestPixel(input_root, pdf_path, use_ahem)
 
     if raised_exception is not None:
       print 'FAILURE: %s; %s' % (input_filename, raised_exception)
@@ -136,10 +138,15 @@
     cmd = [sys.executable, self.text_diff_path, expected_txt_path, txt_path]
     return common.RunCommand(cmd)
 
-  def TestPixel(self, input_root, pdf_path):
+  def TestPixel(self, input_root, pdf_path, use_ahem):
     cmd_to_run = [self.pdfium_test_path, '--send-events', '--png', '--md5']
+
     if self.oneshot_renderer:
       cmd_to_run.append('--render-oneshot')
+
+    if use_ahem:
+      cmd_to_run.append('--font-dir=%s' % self.font_dir)
+
     cmd_to_run.append(pdf_path)
     return common.RunCommandExtractHashedFiles(cmd_to_run)
 
@@ -219,6 +226,7 @@
     finder = common.DirectoryFinder(self.options.build_dir)
     self.fixup_path = finder.ScriptPath('fixup_pdf_template.py')
     self.text_diff_path = finder.ScriptPath('text_diff.py')
+    self.font_dir = os.path.join(finder.TestingDir(), 'resources', 'fonts')
 
     self.source_dir = finder.TestingDir()
     if self.test_dir != 'corpus':
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index 354db0b..abd5aa7 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -478,6 +478,8 @@
   if (!pFontMapper)
     return false;
 
+  pFontMapper->LoadInstalledFonts();
+
   SystemFontInfoIface* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
   if (!pSystemFontInfo)
     return false;
@@ -493,6 +495,7 @@
         WideString::FromLocal(pFontMapper->GetFaceName(i).c_str());
     RegisterFaces(pFontStream, &wsFaceName);
   }
+
   return !m_InstalledFonts.empty();
 }