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