Change BuildAggPath() to return an agg::path_storage.
Now that MSVC can do RVO correctly for agg::path_storage, just return
it rather than writing to it via an out-parameter.
Change-Id: I56202e6fa00b368dcff8860ac5d4c9f35a80f3a2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/86514
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index b850aaa..7b2d476 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -964,11 +964,9 @@
unsigned m_top;
};
-// Note: BuildAggPath() has to take |agg_path| as an out-parameter. If it
-// returns the agg::path_storage instead, tests will fail with MSVC builds.
-void BuildAggPath(const CFX_Path& path,
- const CFX_Matrix* pObject2Device,
- agg::path_storage* agg_path) {
+agg::path_storage BuildAggPath(const CFX_Path& path,
+ const CFX_Matrix* pObject2Device) {
+ agg::path_storage agg_path;
pdfium::span<const CFX_Path::Point> points = path.GetPoints();
for (size_t i = 0; i < points.size(); ++i) {
CFX_PointF pos = points[i].m_Point;
@@ -978,7 +976,7 @@
pos = HardClip(pos);
CFX_Path::Point::Type point_type = points[i].m_Type;
if (point_type == CFX_Path::Point::Type::kMove) {
- agg_path->move_to(pos.x, pos.y);
+ agg_path.move_to(pos.x, pos.y);
} else if (point_type == CFX_Path::Point::Type::kLine) {
if (i > 0 && points[i - 1].IsTypeAndOpen(CFX_Path::Point::Type::kMove) &&
(i == points.size() - 1 ||
@@ -986,7 +984,7 @@
points[i].m_Point == points[i - 1].m_Point) {
pos.x += 1;
}
- agg_path->line_to(pos.x, pos.y);
+ agg_path.line_to(pos.x, pos.y);
} else if (point_type == CFX_Path::Point::Type::kBezier) {
if (i > 0 && i + 2 < points.size()) {
CFX_PointF pos0 = points[i - 1].m_Point;
@@ -1003,12 +1001,13 @@
agg::curve4 curve(pos0.x, pos0.y, pos.x, pos.y, pos2.x, pos2.y, pos3.x,
pos3.y);
i += 2;
- agg_path->add_path_curve(curve);
+ agg_path.add_path_curve(curve);
}
}
if (points[i].m_CloseFigure)
- agg_path->end_poly();
+ agg_path.end_poly();
}
+ return agg_path;
}
} // namespace
@@ -1145,8 +1144,7 @@
m_pClipRgn->IntersectRect(rect);
return true;
}
- agg::path_storage path_data;
- BuildAggPath(path, pObject2Device, &path_data);
+ agg::path_storage path_data = BuildAggPath(path, pObject2Device);
path_data.end_poly();
agg::rasterizer_scanline_aa rasterizer;
rasterizer.clip_box(0.0f, 0.0f,
@@ -1166,8 +1164,7 @@
m_pClipRgn = std::make_unique<CFX_ClipRgn>(
GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
}
- agg::path_storage path_data;
- BuildAggPath(path, nullptr, &path_data);
+ agg::path_storage path_data = BuildAggPath(path, nullptr);
agg::rasterizer_scanline_aa rasterizer;
rasterizer.clip_box(0.0f, 0.0f,
static_cast<float>(GetDeviceCaps(FXDC_PIXEL_WIDTH)),
@@ -1212,8 +1209,7 @@
m_FillOptions = fill_options;
if (fill_options.fill_type != CFX_FillRenderOptions::FillType::kNoFill &&
fill_color) {
- agg::path_storage path_data;
- BuildAggPath(path, pObject2Device, &path_data);
+ agg::path_storage path_data = BuildAggPath(path, pObject2Device);
agg::rasterizer_scanline_aa rasterizer;
rasterizer.clip_box(0.0f, 0.0f,
static_cast<float>(GetDeviceCaps(FXDC_PIXEL_WIDTH)),
@@ -1228,8 +1224,7 @@
return true;
if (fill_options.zero_area) {
- agg::path_storage path_data;
- BuildAggPath(path, pObject2Device, &path_data);
+ agg::path_storage path_data = BuildAggPath(path, pObject2Device);
agg::rasterizer_scanline_aa rasterizer;
rasterizer.clip_box(0.0f, 0.0f,
static_cast<float>(GetDeviceCaps(FXDC_PIXEL_WIDTH)),
@@ -1252,8 +1247,7 @@
matrix1 = *pObject2Device * matrix2.GetInverse();
}
- agg::path_storage path_data;
- BuildAggPath(path, &matrix1, &path_data);
+ agg::path_storage path_data = BuildAggPath(path, &matrix1);
agg::rasterizer_scanline_aa rasterizer;
rasterizer.clip_box(0.0f, 0.0f,
static_cast<float>(GetDeviceCaps(FXDC_PIXEL_WIDTH)),