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; }