Change pdfium_fuzzer to use render flags.

Better exercise FPDF_RenderPageBitmap() and FPDF_FFLDraw(). The change
affects pdfium_xfa_fuzzer as well.

Change-Id: I2413ee2e04ced26f4db9cf937df136e51809433e
Reviewed-on: https://pdfium-review.googlesource.com/c/50173
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/testing/fuzzers/pdfium_fuzzer_helper.cc b/testing/fuzzers/pdfium_fuzzer_helper.cc
index bc5bbe2..21a34ff 100644
--- a/testing/fuzzers/pdfium_fuzzer_helper.cc
+++ b/testing/fuzzers/pdfium_fuzzer_helper.cc
@@ -114,6 +114,18 @@
 }
 #endif  // PDF_ENABLE_V8
 
+std::pair<int, int> GetRenderingAndFormFlagFromData(const char* data,
+                                                    size_t len) {
+  std::string data_str = std::string(data, len);
+  std::size_t data_hash = std::hash<std::string>()(data_str);
+
+  // The largest flag value is 0x4FFF, so just take 16 bits from |data_hash| at
+  // a time.
+  int render_flags = data_hash & 0xffff;
+  int form_flags = (data_hash >> 16) & 0xffff;
+  return std::make_pair(render_flags, form_flags);
+}
+
 }  // namespace
 
 PDFiumFuzzerHelper::PDFiumFuzzerHelper() = default;
@@ -124,7 +136,12 @@
   return true;
 }
 
-void PDFiumFuzzerHelper::RenderPdf(const char* pBuf, size_t len) {
+void PDFiumFuzzerHelper::RenderPdf(const char* data, size_t len) {
+  int render_flags;
+  int form_flags;
+  std::tie(render_flags, form_flags) =
+      GetRenderingAndFormFlagFromData(data, len);
+
   IPDF_JSPLATFORM platform_callbacks;
   memset(&platform_callbacks, '\0', sizeof(platform_callbacks));
   platform_callbacks.version = 3;
@@ -138,7 +155,7 @@
   form_callbacks.version = GetFormCallbackVersion();
   form_callbacks.m_pJsPlatform = &platform_callbacks;
 
-  TestLoader loader({pBuf, len});
+  TestLoader loader({data, len});
   FPDF_FILEACCESS file_access;
   memset(&file_access, '\0', sizeof(file_access));
   file_access.m_FileLen = static_cast<unsigned long>(len);
@@ -204,14 +221,16 @@
       if (nRet == PDF_DATA_ERROR)
         return;
     }
-    RenderPage(doc.get(), form.get(), i);
+    RenderPage(doc.get(), form.get(), i, render_flags, form_flags);
   }
   FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC);
 }
 
 bool PDFiumFuzzerHelper::RenderPage(FPDF_DOCUMENT doc,
                                     FPDF_FORMHANDLE form,
-                                    const int page_index) {
+                                    int page_index,
+                                    int render_flags,
+                                    int form_flags) {
   ScopedFPDFPage page(FPDF_LoadPage(doc, page_index));
   if (!page)
     return false;
@@ -226,8 +245,10 @@
   ScopedFPDFBitmap bitmap(FPDFBitmap_Create(width, height, 0));
   if (bitmap) {
     FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF);
-    FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0, 0);
-    FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0, 0);
+    FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0,
+                          render_flags);
+    FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0,
+                 form_flags);
   }
   FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE);
   FORM_OnBeforeClosePage(page.get(), form);
diff --git a/testing/fuzzers/pdfium_fuzzer_helper.h b/testing/fuzzers/pdfium_fuzzer_helper.h
index 72ada4c..60717a1 100644
--- a/testing/fuzzers/pdfium_fuzzer_helper.h
+++ b/testing/fuzzers/pdfium_fuzzer_helper.h
@@ -11,7 +11,7 @@
 
 class PDFiumFuzzerHelper {
  public:
-  void RenderPdf(const char* pBuf, size_t len);
+  void RenderPdf(const char* data, size_t len);
 
   virtual int GetFormCallbackVersion() const = 0;
   virtual bool OnFormFillEnvLoaded(FPDF_DOCUMENT doc);
@@ -21,7 +21,11 @@
   virtual ~PDFiumFuzzerHelper();
 
  private:
-  bool RenderPage(FPDF_DOCUMENT doc, FPDF_FORMHANDLE form, int page_index);
+  bool RenderPage(FPDF_DOCUMENT doc,
+                  FPDF_FORMHANDLE form,
+                  int page_index,
+                  int render_flags,
+                  int form_flags);
 };
 
 #endif  // TESTING_FUZZERS_PDFIUM_FUZZER_HELPER_H_