Pass spans to CFX_FloatRect::GetBBox()
Avoid more pointer arithmetic diagnostics.
Change-Id: Ieb6186bfb378f77fb4d18c8cf1fdd9cb6c58b19e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/97050
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index a931a31..9b0248e 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -843,7 +843,8 @@
patch.patch_colors[i].comp[1] = static_cast<int32_t>(g * 255);
patch.patch_colors[i].comp[2] = static_cast<int32_t>(b * 255);
}
- CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);
+ CFX_FloatRect bbox =
+ CFX_FloatRect::GetBBox(pdfium::make_span(coords).first(point_count));
if (bbox.right <= 0 || bbox.left >= (float)pBitmap->GetWidth() ||
bbox.top <= 0 || bbox.bottom >= (float)pBitmap->GetHeight()) {
continue;
diff --git a/core/fxcrt/fx_coordinates.cpp b/core/fxcrt/fx_coordinates.cpp
index e71781b..0d430f9 100644
--- a/core/fxcrt/fx_coordinates.cpp
+++ b/core/fxcrt/fx_coordinates.cpp
@@ -137,19 +137,19 @@
: left(point.x), bottom(point.y), right(point.x), top(point.y) {}
// static
-CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_PointF* pPoints, int nPoints) {
- if (nPoints == 0)
+CFX_FloatRect CFX_FloatRect::GetBBox(pdfium::span<const CFX_PointF> pPoints) {
+ if (pPoints.empty())
return CFX_FloatRect();
- float min_x = pPoints->x;
- float max_x = pPoints->x;
- float min_y = pPoints->y;
- float max_y = pPoints->y;
- for (int i = 1; i < nPoints; i++) {
- min_x = std::min(min_x, pPoints[i].x);
- max_x = std::max(max_x, pPoints[i].x);
- min_y = std::min(min_y, pPoints[i].y);
- max_y = std::max(max_y, pPoints[i].y);
+ float min_x = pPoints.front().x;
+ float max_x = pPoints.front().x;
+ float min_y = pPoints.front().y;
+ float max_y = pPoints.front().y;
+ for (const auto& point : pPoints.subspan(1)) {
+ min_x = std::min(min_x, point.x);
+ max_x = std::max(max_x, point.x);
+ min_y = std::min(min_y, point.y);
+ max_y = std::max(max_y, point.y);
}
return CFX_FloatRect(min_x, min_y, max_x, max_y);
}
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index bdf1f94..9a44043 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -13,6 +13,8 @@
#include <iosfwd>
#endif
+#include "third_party/base/span.h"
+
template <class BaseType>
class CFX_PTemplate {
public:
@@ -204,7 +206,7 @@
explicit CFX_FloatRect(const FX_RECT& rect);
explicit CFX_FloatRect(const CFX_PointF& point);
- static CFX_FloatRect GetBBox(const CFX_PointF* pPoints, int nPoints);
+ static CFX_FloatRect GetBBox(pdfium::span<const CFX_PointF> pPoints);
void Normalize();
diff --git a/core/fxcrt/fx_coordinates_unittest.cpp b/core/fxcrt/fx_coordinates_unittest.cpp
index 9d2b057..9fecd5b 100644
--- a/core/fxcrt/fx_coordinates_unittest.cpp
+++ b/core/fxcrt/fx_coordinates_unittest.cpp
@@ -30,7 +30,7 @@
}
TEST(CFX_FloatRect, GetBBox) {
- CFX_FloatRect rect = CFX_FloatRect::GetBBox(nullptr, 0);
+ CFX_FloatRect rect = CFX_FloatRect::GetBBox({nullptr, 0});
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(0.0f, rect.right);
@@ -38,12 +38,12 @@
std::vector<CFX_PointF> data;
data.emplace_back(0.0f, 0.0f);
- rect = CFX_FloatRect::GetBBox(data.data(), 0);
+ rect = CFX_FloatRect::GetBBox(pdfium::make_span(data).first(0));
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(0.0f, rect.right);
EXPECT_FLOAT_EQ(0.0f, rect.top);
- rect = CFX_FloatRect::GetBBox(data.data(), data.size());
+ rect = CFX_FloatRect::GetBBox(data);
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(0.0f, rect.right);
@@ -51,34 +51,34 @@
data.emplace_back(2.5f, 6.2f);
data.emplace_back(1.5f, 6.2f);
- rect = CFX_FloatRect::GetBBox(data.data(), 2);
+ rect = CFX_FloatRect::GetBBox(pdfium::make_span(data).first(2));
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(2.5f, rect.right);
EXPECT_FLOAT_EQ(6.2f, rect.top);
- rect = CFX_FloatRect::GetBBox(data.data(), data.size());
+ rect = CFX_FloatRect::GetBBox(data);
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(2.5f, rect.right);
EXPECT_FLOAT_EQ(6.2f, rect.top);
data.emplace_back(2.5f, 6.3f);
- rect = CFX_FloatRect::GetBBox(data.data(), data.size());
+ rect = CFX_FloatRect::GetBBox(data);
EXPECT_FLOAT_EQ(0.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(2.5f, rect.right);
EXPECT_FLOAT_EQ(6.3f, rect.top);
data.emplace_back(-3.0f, 6.3f);
- rect = CFX_FloatRect::GetBBox(data.data(), data.size());
+ rect = CFX_FloatRect::GetBBox(data);
EXPECT_FLOAT_EQ(-3.0f, rect.left);
EXPECT_FLOAT_EQ(0.0f, rect.bottom);
EXPECT_FLOAT_EQ(2.5f, rect.right);
EXPECT_FLOAT_EQ(6.3f, rect.top);
data.emplace_back(4.0f, -8.0f);
- rect = CFX_FloatRect::GetBBox(data.data(), data.size());
+ rect = CFX_FloatRect::GetBBox(data);
EXPECT_FLOAT_EQ(-3.0f, rect.left);
EXPECT_FLOAT_EQ(-8.0f, rect.bottom);
EXPECT_FLOAT_EQ(4.0f, rect.right);