Add helper functions to CFX_PathData. The helper functions make it clearer what multi-line conditionals are trying to figure out in GetZeroAreaPath(). Change-Id: Ic4214624ca34543b6a1d98e9c9f422750cda855c Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/57359 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/cfx_pathdata.cpp b/core/fxge/cfx_pathdata.cpp index 239f896..2597555 100644 --- a/core/fxge/cfx_pathdata.cpp +++ b/core/fxge/cfx_pathdata.cpp
@@ -11,6 +11,23 @@ namespace { +bool IsFoldingVerticalLine(const CFX_PointF& a, + const CFX_PointF& b, + const CFX_PointF& c) { + return a.x == b.x && b.x == c.x && (b.y - a.y) * (b.y - c.y) > 0; +} + +bool IsFoldingHorizontalLine(const CFX_PointF& a, + const CFX_PointF& b, + const CFX_PointF& c) { + return a.y == b.y && b.y == c.y && (b.x - a.x) * (b.x - c.x) > 0; +} + +bool IsClosedFigure(const FX_PATHPOINT& prev, const FX_PATHPOINT& next) { + return prev.m_Type == FXPT_TYPE::MoveTo && next.m_Type == FXPT_TYPE::LineTo && + prev.m_Point == next.m_Point && next.m_CloseFigure; +} + void UpdateLineEndPoints(CFX_FloatRect* rect, const CFX_PointF& start_pos, const CFX_PointF& end_pos, @@ -378,11 +395,8 @@ continue; } - if ((m_Points[i - 1].m_Point.x == m_Points[i].m_Point.x && - m_Points[i].m_Point.x == m_Points[next].m_Point.x) && - ((m_Points[i].m_Point.y - m_Points[i - 1].m_Point.y) * - (m_Points[i].m_Point.y - m_Points[next].m_Point.y) > - 0)) { + if (IsFoldingVerticalLine(m_Points[i - 1].m_Point, m_Points[i].m_Point, + m_Points[next].m_Point)) { int pre = i; if (fabs(m_Points[i].m_Point.y - m_Points[i - 1].m_Point.y) < fabs(m_Points[i].m_Point.y - m_Points[next].m_Point.y)) { @@ -392,11 +406,9 @@ NewPath->AppendPoint(m_Points[pre].m_Point, FXPT_TYPE::MoveTo, false); NewPath->AppendPoint(m_Points[next].m_Point, FXPT_TYPE::LineTo, false); - } else if ((m_Points[i - 1].m_Point.y == m_Points[i].m_Point.y && - m_Points[i].m_Point.y == m_Points[next].m_Point.y) && - ((m_Points[i].m_Point.x - m_Points[i - 1].m_Point.x) * - (m_Points[i].m_Point.x - m_Points[next].m_Point.x) > - 0)) { + } else if (IsFoldingHorizontalLine(m_Points[i - 1].m_Point, + m_Points[i].m_Point, + m_Points[next].m_Point)) { int pre = i; if (fabs(m_Points[i].m_Point.x - m_Points[i - 1].m_Point.x) < fabs(m_Points[i].m_Point.x - m_Points[next].m_Point.x)) { @@ -406,10 +418,7 @@ NewPath->AppendPoint(m_Points[pre].m_Point, FXPT_TYPE::MoveTo, false); NewPath->AppendPoint(m_Points[next].m_Point, FXPT_TYPE::LineTo, false); - } else if (m_Points[i - 1].m_Type == FXPT_TYPE::MoveTo && - m_Points[next].m_Type == FXPT_TYPE::LineTo && - m_Points[i - 1].m_Point == m_Points[next].m_Point && - m_Points[next].m_CloseFigure) { + } else if (IsClosedFigure(m_Points[i - 1], m_Points[next])) { NewPath->AppendPoint(m_Points[i - 1].m_Point, FXPT_TYPE::MoveTo, false); NewPath->AppendPoint(m_Points[i].m_Point, FXPT_TYPE::LineTo, false); *bThin = true;