Rearrange CFX_PathData::GetZeroAreaPath() to use early returns.
This reduces the amount of nesting inside the function.
Change-Id: Iea5013f60eeb36f614f9be4e3df36ee5604595b9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/57358
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_pathdata.cpp b/core/fxge/cfx_pathdata.cpp
index 4481a0d..239f896 100644
--- a/core/fxge/cfx_pathdata.cpp
+++ b/core/fxge/cfx_pathdata.cpp
@@ -358,59 +358,62 @@
}
int startPoint = 0;
- int next = 0;
for (size_t i = 0; i < m_Points.size(); i++) {
FXPT_TYPE point_type = m_Points[i].m_Type;
if (point_type == FXPT_TYPE::MoveTo) {
startPoint = i;
- } else if (point_type == FXPT_TYPE::LineTo) {
- next = (i + 1 - startPoint) % (m_Points.size() - startPoint) + startPoint;
- if (m_Points[next].m_Type != FXPT_TYPE::BezierTo &&
- m_Points[next].m_Type != FXPT_TYPE::MoveTo) {
- 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)) {
- 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)) {
- pre--;
- next--;
- }
+ continue;
+ }
- 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)) {
- 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)) {
- pre--;
- next--;
- }
-
- 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) {
- 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;
- }
- }
- } else if (point_type == FXPT_TYPE::BezierTo) {
+ if (point_type == FXPT_TYPE::BezierTo) {
i += 2;
continue;
}
+
+ ASSERT(point_type == FXPT_TYPE::LineTo);
+ int next =
+ (i + 1 - startPoint) % (m_Points.size() - startPoint) + startPoint;
+ if (m_Points[next].m_Type == FXPT_TYPE::BezierTo ||
+ m_Points[next].m_Type == FXPT_TYPE::MoveTo) {
+ 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)) {
+ 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)) {
+ pre--;
+ next--;
+ }
+
+ 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)) {
+ 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)) {
+ pre--;
+ next--;
+ }
+
+ 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) {
+ 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;
+ }
}
size_t new_path_size = NewPath->GetPoints().size();