Use spans in mesh shading rendering code.
Also remove Coon_Bezier::GetPointsReverse(), since its only caller can
just use GetPoints() and reverse some indices.
Change-Id: Iad85cc538f19e31ea74f3d51f2f33bd4befc0f83
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67651
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index 53fb79a..6102546 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -28,6 +28,7 @@
#include "core/fxge/cfx_defaultrenderdevice.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/fx_dib.h"
+#include "third_party/base/span.h"
namespace {
@@ -522,12 +523,6 @@
p[2] = b / 3 - p[0] + 2 * p[1];
p[3] = a + p[0] - 3 * p[1] + 3 * p[2];
}
- void GetPointsReverse(float p[4]) {
- p[3] = d;
- p[2] = c / 3 + p[3];
- p[1] = b / 3 - p[3] + 2 * p[2];
- p[0] = a + p[3] - 3 * p[2] + 3 * p[1];
- }
void BezierInterpol(Coon_BezierCoeff& C1,
Coon_BezierCoeff& C2,
Coon_BezierCoeff& D1,
@@ -580,28 +575,27 @@
y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);
}
- void GetPoints(std::vector<FX_PATHPOINT>& pPoints, size_t start_idx) {
- float p[4];
- int i;
- x.GetPoints(p);
- for (i = 0; i < 4; i++)
- pPoints[start_idx + i].m_Point.x = p[i];
-
- y.GetPoints(p);
- for (i = 0; i < 4; i++)
- pPoints[start_idx + i].m_Point.y = p[i];
+ void GetPoints(pdfium::span<FX_PATHPOINT> path_points) {
+ constexpr size_t kPointsCount = 4;
+ float points_x[kPointsCount];
+ float points_y[kPointsCount];
+ x.GetPoints(points_x);
+ y.GetPoints(points_y);
+ for (size_t i = 0; i < kPointsCount; ++i)
+ path_points[i].m_Point = {points_x[i], points_y[i]};
}
- void GetPointsReverse(std::vector<FX_PATHPOINT>& pPoints, size_t start_idx) {
- float p[4];
- int i;
- x.GetPointsReverse(p);
- for (i = 0; i < 4; i++)
- pPoints[i + start_idx].m_Point.x = p[i];
-
- y.GetPointsReverse(p);
- for (i = 0; i < 4; i++)
- pPoints[i + start_idx].m_Point.y = p[i];
+ void GetPointsReverse(pdfium::span<FX_PATHPOINT> path_points) {
+ constexpr size_t kPointsCount = 4;
+ float points_x[kPointsCount];
+ float points_y[kPointsCount];
+ x.GetPoints(points_x);
+ y.GetPoints(points_y);
+ for (size_t i = 0; i < kPointsCount; ++i) {
+ size_t reverse_index = kPointsCount - i - 1;
+ path_points[i].m_Point = {points_x[reverse_index],
+ points_y[reverse_index]};
+ }
}
float Distance() { return x.Distance() + y.Distance(); }
@@ -701,11 +695,11 @@
if (bSmall ||
(d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&
d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {
- std::vector<FX_PATHPOINT>& pPoints = path.GetPoints();
- C1.GetPoints(pPoints, 0);
- D2.GetPoints(pPoints, 3);
- C2.GetPointsReverse(pPoints, 6);
- D1.GetPointsReverse(pPoints, 9);
+ pdfium::span<FX_PATHPOINT> points = path.GetPoints();
+ C1.GetPoints(points.subspan(0, 4));
+ D2.GetPoints(points.subspan(3, 4));
+ C2.GetPointsReverse(points.subspan(6, 4));
+ D1.GetPointsReverse(points.subspan(9, 4));
int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;
if (bNoPathSmooth)
fillFlags |= FXFILL_NOPATHSMOOTH;