Commit f4797fe6 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Avoid overflow in gfx::Size::GetArea() for PDF area calculations.

In chrome_pdf::draw_utils::GetMostVisiblePage(), switch to using
gfx::SizeF() so area calculations do not suffer from integer overflow.

Bug: 1124816
Change-Id: I578ed4274b7ea2eb04ea02d216a4b355948d11cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2444807Reviewed-by: default avatarK. Moon <kmoon@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814568}
parent ac83b02f
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/size_f.h"
namespace chrome_pdf { namespace chrome_pdf {
namespace draw_utils { namespace draw_utils {
...@@ -55,17 +56,17 @@ int GetMostVisiblePage(const std::vector<IndexedPage>& visible_pages, ...@@ -55,17 +56,17 @@ int GetMostVisiblePage(const std::vector<IndexedPage>& visible_pages,
return -1; return -1;
int most_visible_page_index = visible_pages.front().index; int most_visible_page_index = visible_pages.front().index;
double most_visible_page_area = 0.0; float most_visible_page_area = 0;
for (const auto& visible_page : visible_pages) { for (const auto& visible_page : visible_pages) {
double page_area = static_cast<double>(visible_page.rect.size().GetArea()); float page_area = gfx::SizeF(visible_page.rect.size()).GetArea();
// TODO(thestig): Check whether we can remove this check. // TODO(thestig): Check whether we can remove this check.
if (page_area <= 0.0) if (page_area <= 0)
continue; continue;
gfx::Rect screen_intersect = gfx::Rect screen_intersect =
gfx::IntersectRects(visible_screen, visible_page.rect); gfx::IntersectRects(visible_screen, visible_page.rect);
double intersect_area = float intersect_area =
static_cast<double>(screen_intersect.size().GetArea()) / page_area; gfx::SizeF(screen_intersect.size()).GetArea() / page_area;
if (intersect_area > most_visible_page_area) { if (intersect_area > most_visible_page_area) {
most_visible_page_index = visible_page.index; most_visible_page_index = visible_page.index;
most_visible_page_area = intersect_area; most_visible_page_area = intersect_area;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment