Move PaintStroke() out of CFX_SkiaDeviceDriver class

Since PaintStroke() no longer takes `m_FillOptions` as one of the
inputs, move PaintStroke() out of CFX_SkiaDeviceDriver class and make
it a standalone function.

Change-Id: I83bb5d986d2fc7437d5a7fce6242c95fd8a3b458
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/103874
Commit-Queue: Nigi <nigi@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index ea67f43..57c692d 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -569,6 +569,75 @@
   clip->lineTo(IntersectSides(rectPts[maxBounds], slope, startEdgePt));
 }
 
+// Converts a stroking path to scanlines
+void PaintStroke(SkPaint* spaint,
+                 const CFX_GraphStateData* graph_state,
+                 const SkMatrix& matrix,
+                 const CFX_FillRenderOptions& fill_options) {
+  SkPaint::Cap cap;
+  switch (graph_state->m_LineCap) {
+    case CFX_GraphStateData::LineCap::kRound:
+      cap = SkPaint::kRound_Cap;
+      break;
+    case CFX_GraphStateData::LineCap::kSquare:
+      cap = SkPaint::kSquare_Cap;
+      break;
+    default:
+      cap = SkPaint::kButt_Cap;
+      break;
+  }
+  SkPaint::Join join;
+  switch (graph_state->m_LineJoin) {
+    case CFX_GraphStateData::LineJoin::kRound:
+      join = SkPaint::kRound_Join;
+      break;
+    case CFX_GraphStateData::LineJoin::kBevel:
+      join = SkPaint::kBevel_Join;
+      break;
+    default:
+      join = SkPaint::kMiter_Join;
+      break;
+  }
+  SkMatrix inverse;
+  if (!matrix.invert(&inverse)) {
+    return;  // give up if the matrix is degenerate, and not invertable
+  }
+  inverse.set(SkMatrix::kMTransX, 0);
+  inverse.set(SkMatrix::kMTransY, 0);
+  SkVector deviceUnits[2] = {{0, 1}, {1, 0}};
+  inverse.mapPoints(deviceUnits, std::size(deviceUnits));
+
+  float width =
+      std::max(graph_state->m_LineWidth,
+               std::min(deviceUnits[0].length(), deviceUnits[1].length()));
+  if (!graph_state->m_DashArray.empty()) {
+    size_t count = (graph_state->m_DashArray.size() + 1) / 2;
+    DataVector<SkScalar> intervals(count * 2);
+    // Set dash pattern
+    for (size_t i = 0; i < count; i++) {
+      float on = graph_state->m_DashArray[i * 2];
+      if (on <= 0.000001f) {
+        on = 0.1f;
+      }
+      float off = i * 2 + 1 == graph_state->m_DashArray.size()
+                      ? on
+                      : graph_state->m_DashArray[i * 2 + 1];
+      off = std::max(off, 0.0f);
+      intervals[i * 2] = on;
+      intervals[i * 2 + 1] = off;
+    }
+    spaint->setPathEffect(SkDashPathEffect::Make(
+        intervals.data(), pdfium::base::checked_cast<int>(intervals.size()),
+        graph_state->m_DashPhase));
+  }
+  spaint->setStyle(SkPaint::kStroke_Style);
+  spaint->setAntiAlias(!fill_options.aliased_path);
+  spaint->setStrokeWidth(width);
+  spaint->setStrokeMiter(graph_state->m_MiterLimit);
+  spaint->setStrokeCap(cap);
+  spaint->setStrokeJoin(join);
+}
+
 void SetBitmapMatrix(const CFX_Matrix& m,
                      int width,
                      int height,
@@ -787,7 +856,7 @@
       skPaint.setBlendMode(SkBlendMode::kPlus);
     int stroke_alpha = FXARGB_A(m_strokeColor);
     if (stroke_alpha)
-      m_pDriver->PaintStroke(&skPaint, &m_drawState, skMatrix, m_fillOptions);
+      PaintStroke(&skPaint, &m_drawState, skMatrix, m_fillOptions);
     SkCanvas* skCanvas = m_pDriver->SkiaCanvas();
     SkAutoCanvasRestore scoped_save_restore(skCanvas, /*doSave=*/true);
     skCanvas->concat(skMatrix);
@@ -1064,7 +1133,7 @@
     SkPath skPath = BuildPath(path);
     SkMatrix skMatrix = ToSkMatrix(*pMatrix);
     SkPaint skPaint;
-    m_pDriver->PaintStroke(&skPaint, pGraphState, skMatrix, m_fillOptions);
+    PaintStroke(&skPaint, pGraphState, skMatrix, m_fillOptions);
     SkPath dst_path;
     skpathutils::FillPathWithPaint(skPath, skPaint, &dst_path);
     dst_path.transform(skMatrix);
@@ -1287,73 +1356,6 @@
   bool m_isSubstFontBold = false;
 };
 
-// convert a stroking path to scanlines
-void CFX_SkiaDeviceDriver::PaintStroke(
-    SkPaint* spaint,
-    const CFX_GraphStateData* pGraphState,
-    const SkMatrix& matrix,
-    const CFX_FillRenderOptions& fill_options) {
-  SkPaint::Cap cap;
-  switch (pGraphState->m_LineCap) {
-    case CFX_GraphStateData::LineCap::kRound:
-      cap = SkPaint::kRound_Cap;
-      break;
-    case CFX_GraphStateData::LineCap::kSquare:
-      cap = SkPaint::kSquare_Cap;
-      break;
-    default:
-      cap = SkPaint::kButt_Cap;
-      break;
-  }
-  SkPaint::Join join;
-  switch (pGraphState->m_LineJoin) {
-    case CFX_GraphStateData::LineJoin::kRound:
-      join = SkPaint::kRound_Join;
-      break;
-    case CFX_GraphStateData::LineJoin::kBevel:
-      join = SkPaint::kBevel_Join;
-      break;
-    default:
-      join = SkPaint::kMiter_Join;
-      break;
-  }
-  SkMatrix inverse;
-  if (!matrix.invert(&inverse))
-    return;  // give up if the matrix is degenerate, and not invertable
-  inverse.set(SkMatrix::kMTransX, 0);
-  inverse.set(SkMatrix::kMTransY, 0);
-  SkVector deviceUnits[2] = {{0, 1}, {1, 0}};
-  inverse.mapPoints(deviceUnits, std::size(deviceUnits));
-  float width =
-      std::max(pGraphState->m_LineWidth,
-               std::min(deviceUnits[0].length(), deviceUnits[1].length()));
-  if (!pGraphState->m_DashArray.empty()) {
-    size_t count = (pGraphState->m_DashArray.size() + 1) / 2;
-    DataVector<SkScalar> intervals(count * 2);
-    // Set dash pattern
-    for (size_t i = 0; i < count; i++) {
-      float on = pGraphState->m_DashArray[i * 2];
-      if (on <= 0.000001f)
-        on = 0.1f;
-      float off = i * 2 + 1 == pGraphState->m_DashArray.size()
-                      ? on
-                      : pGraphState->m_DashArray[i * 2 + 1];
-      off = std::max(off, 0.0f);
-      intervals[i * 2] = on;
-      intervals[i * 2 + 1] = off;
-    }
-    spaint->setPathEffect(SkDashPathEffect::Make(
-        intervals.data(), pdfium::base::checked_cast<int>(intervals.size()),
-        pGraphState->m_DashPhase));
-  }
-  spaint->setStyle(SkPaint::kStroke_Style);
-  spaint->setAntiAlias(!fill_options.aliased_path);
-  spaint->setStrokeWidth(width);
-  spaint->setStrokeMiter(pGraphState->m_MiterLimit);
-  spaint->setStrokeCap(cap);
-  spaint->setStrokeJoin(join);
-}
-
 // static
 std::unique_ptr<CFX_SkiaDeviceDriver> CFX_SkiaDeviceDriver::Create(
     RetainPtr<CFX_DIBitmap> pBitmap,
diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h
index 8c99963..5e70b7a 100644
--- a/core/fxge/skia/fx_skia_device.h
+++ b/core/fxge/skia/fx_skia_device.h
@@ -13,8 +13,6 @@
 #include "core/fxge/renderdevicedriver_iface.h"
 
 class SkCanvas;
-class SkMatrix;
-class SkPaint;
 class SkPictureRecorder;
 class SkiaState;
 class TextCharPos;
@@ -139,10 +137,6 @@
 
   virtual uint8_t* GetBuffer() const;
 
-  void PaintStroke(SkPaint* spaint,
-                   const CFX_GraphStateData* pGraphState,
-                   const SkMatrix& matrix,
-                   const CFX_FillRenderOptions& fill_options);
   void Clear(uint32_t color);
   void Flush() override;
   SkCanvas* SkiaCanvas() { return m_pCanvas; }