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)),