Runtime renderer selection for embedder tests

Add new command line flag for embedder tests to request the renderer to
use. This is available for Skia builds, which is the configuration
where runtime selection is available.

Bug: pdfium:1878
Change-Id: I2573680b0e8e6507243c42f5c8745842bbeee3a6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/97030
Reviewed-by: Nigi <nigi@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Alan Screen <awscreen@chromium.org>
diff --git a/testing/embedder_test_environment.cpp b/testing/embedder_test_environment.cpp
index dec8de0..77e89f6 100644
--- a/testing/embedder_test_environment.cpp
+++ b/testing/embedder_test_environment.cpp
@@ -8,6 +8,7 @@
 
 #include "core/fxcrt/fx_system.h"
 #include "public/fpdfview.h"
+#include "testing/command_line_helpers.h"
 #include "third_party/base/check.h"
 
 #ifdef PDF_ENABLE_V8
@@ -20,7 +21,8 @@
 
 }  // namespace
 
-EmbedderTestEnvironment::EmbedderTestEnvironment() {
+EmbedderTestEnvironment::EmbedderTestEnvironment()
+    : renderer_type_(GetDefaultRendererType()) {
   DCHECK(!g_environment);
   g_environment = this;
 }
@@ -37,7 +39,7 @@
 
 void EmbedderTestEnvironment::SetUp() {
   FPDF_LIBRARY_CONFIG config;
-  config.version = 3;
+  config.version = 4;
   config.m_pUserFontPaths = nullptr;
   config.m_v8EmbedderSlot = 0;
   config.m_pPlatform = nullptr;
@@ -51,6 +53,7 @@
   config.m_pIsolate = nullptr;
   config.m_pPlatform = nullptr;
 #endif  // PDF_ENABLE_V8
+  config.m_RendererType = renderer_type_;
 
   FPDF_InitLibraryWithConfig(&config);
 
@@ -67,8 +70,24 @@
 }
 
 void EmbedderTestEnvironment::AddFlag(const std::string& flag) {
-  if (flag == "--write-pngs")
+  if (flag == "--write-pngs") {
     write_pngs_ = true;
-  else
-    std::cerr << "Unknown flag: " << flag << "\n";
+    return;
+  }
+#if defined(_SKIA_SUPPORT_)
+  std::string value;
+  if (ParseSwitchKeyValue(flag, "--use-renderer=", &value)) {
+    if (value == "agg") {
+      renderer_type_ = FPDF_RENDERERTYPE_AGG;
+    } else if (value == "skia") {
+      renderer_type_ = FPDF_RENDERERTYPE_SKIA;
+    } else {
+      std::cerr << "Invalid --use-renderer argument, value must be one of agg "
+                   "or skia\n";
+    }
+    return;
+  }
+#endif  // defined(_SKIA_SUPPORT_)
+
+  std::cerr << "Unknown flag: " << flag << "\n";
 }
diff --git a/testing/embedder_test_environment.h b/testing/embedder_test_environment.h
index cf7c8c1..2f98716 100644
--- a/testing/embedder_test_environment.h
+++ b/testing/embedder_test_environment.h
@@ -31,6 +31,7 @@
  private:
   void AddFlag(const std::string& flag);
 
+  FPDF_RENDERER_TYPE renderer_type_;
   bool write_pngs_ = false;
   TestFonts test_fonts_;
 };