Add utility functions to work with fill modes in Skia code.
Avoid repeated work, make code more readable and avoid a magical 3
value. The new functions are:
- GetAlternateOrWindingFillType()
- IsAlternateFillMode()
- GetAlternateOrWindingFillMode()
Change-Id: Ic73894d04d6eaad2e54dfe8899d84d263e78e7dc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55194
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 170518b..e3dc7ee 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -285,6 +285,21 @@
}
#endif // _SKIA_SUPPORT_
+int GetAlternateOrWindingFillMode(int fill_mode) {
+ return fill_mode & (FXFILL_ALTERNATE | FXFILL_WINDING);
+}
+
+bool IsAlternateFillMode(int fill_mode) {
+ // TODO(thestig): This function should be able to assert
+ // GetAlternateOrWindingFillMode(fill_mode) != 0.
+ return GetAlternateOrWindingFillMode(fill_mode) == FXFILL_ALTERNATE;
+}
+
+SkPath::FillType GetAlternateOrWindingFillType(int fill_mode) {
+ return IsAlternateFillMode(fill_mode) ? SkPath::kEvenOdd_FillType
+ : SkPath::kWinding_FillType;
+}
+
SkPath BuildPath(const CFX_PathData* pPathData) {
SkPath skPath;
const CFX_PathData* pFPath = pPathData;
@@ -712,10 +727,8 @@
if (Accumulator::kPath != m_type) {
m_skPath.reset();
m_fillFullCover = !!(fill_mode & FXFILL_FULLCOVER);
- m_fillPath = (fill_mode & 3) && fill_color;
- m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
- ? SkPath::kEvenOdd_FillType
- : SkPath::kWinding_FillType);
+ m_fillPath = GetAlternateOrWindingFillMode(fill_mode) && fill_color;
+ m_skPath.setFillType(GetAlternateOrWindingFillType(fill_mode));
if (pDrawState)
m_drawState = *pDrawState;
m_fillColor = fill_color;
@@ -969,9 +982,7 @@
}
if (skClipPath.isEmpty()) {
skClipPath = BuildPath(pPathData);
- skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
- ? SkPath::kEvenOdd_FillType
- : SkPath::kWinding_FillType);
+ skClipPath.setFillType(GetAlternateOrWindingFillType(fill_mode));
SkMatrix skMatrix = ToSkMatrix(*pMatrix);
skClipPath.transform(skMatrix);
}
@@ -1087,7 +1098,7 @@
bool group_knockout) const {
return MatrixChanged(pMatrix) || StateChanged(pState, m_drawState) ||
fill_color != m_fillColor || stroke_color != m_strokeColor ||
- ((fill_mode & 3) == FXFILL_ALTERNATE) !=
+ IsAlternateFillMode(fill_mode) !=
(m_skPath.getFillType() == SkPath::kEvenOdd_FillType) ||
blend_type != m_blendType || group_knockout != m_groupKnockout;
}
@@ -1837,9 +1848,7 @@
}
}
SkPath skClipPath = BuildPath(pPathData);
- skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
- ? SkPath::kEvenOdd_FillType
- : SkPath::kWinding_FillType);
+ skClipPath.setFillType(GetAlternateOrWindingFillType(fill_mode));
SkMatrix skMatrix = ToSkMatrix(*deviceMatrix);
skClipPath.transform(skMatrix);
DebugShowSkiaPath(skClipPath);
@@ -1919,10 +1928,8 @@
SkPath skPath = BuildPath(pPathData);
SkAutoCanvasRestore scoped_save_restore(m_pCanvas, /*doSave=*/true);
m_pCanvas->concat(skMatrix);
- if ((fill_mode & 3) && fill_color) {
- skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
- ? SkPath::kEvenOdd_FillType
- : SkPath::kWinding_FillType);
+ if (GetAlternateOrWindingFillMode(fill_mode) && fill_color) {
+ skPath.setFillType(GetAlternateOrWindingFillType(fill_mode));
SkPath strokePath;
const SkPath* fillPath = &skPath;
if (pGraphState && stroke_alpha) {