| Index: third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| index 46379f6dfdaafe7865e1ce3b9bd5077d7fe6783c..c6b3f013a03d011ebe7b3cdfdf65ed7a7c44986c 100644
|
| --- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| +++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| @@ -48,6 +48,7 @@
|
| //----------------------------------------------------------------------------
|
| #include <limits.h>
|
| #include "agg_rasterizer_scanline_aa.h"
|
| +#include "third_party/base/numerics/safe_math.h"
|
| namespace agg
|
| {
|
| AGG_INLINE void cell_aa::set_cover(int c, int a)
|
| @@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| int fy1 = y1 & poly_base_mask;
|
| int fy2 = y2 & poly_base_mask;
|
| int x_from, x_to;
|
| - int p, rem, mod, lift, delta, first, incr;
|
| + int rem, mod, lift, delta, first, incr;
|
| if(ey1 == ey2) {
|
| render_hline(ey1, x1, fy1, x2, fy2);
|
| return;
|
| @@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| m_cur_cell.add_cover(delta, two_fx * delta);
|
| return;
|
| }
|
| - p = (poly_base_size - fy1) * dx;
|
| + pdfium::base::CheckedNumeric<int> safeP = poly_base_size - fy1;
|
| + safeP *= dx;
|
| + if (!safeP.IsValid())
|
| + return;
|
| first = poly_base_size;
|
| if(dy < 0) {
|
| - p = fy1 * dx;
|
| - first = 0;
|
| - incr = -1;
|
| - dy = -dy;
|
| + safeP = fy1;
|
| + safeP *= dx;
|
| + if (!safeP.IsValid())
|
| + return;
|
| + first = 0;
|
| + incr = -1;
|
| + dy = -dy;
|
| }
|
| - delta = p / dy;
|
| - mod = p % dy;
|
| + delta = safeP.ValueOrDie() / dy;
|
| + mod = safeP.ValueOrDie() % dy;
|
| if(mod < 0) {
|
| delta--;
|
| mod += dy;
|
| @@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| ey1 += incr;
|
| set_cur_cell(x_from >> poly_base_shift, ey1);
|
| if(ey1 != ey2) {
|
| - p = poly_base_size * dx;
|
| - lift = p / dy;
|
| - rem = p % dy;
|
| - if(rem < 0) {
|
| - lift--;
|
| - rem += dy;
|
| + safeP = static_cast<int>(poly_base_size);
|
| + safeP *= dx;
|
| + if (!safeP.IsValid())
|
| + return;
|
| + lift = safeP.ValueOrDie() / dy;
|
| + rem = safeP.ValueOrDie() % dy;
|
| + if (rem < 0) {
|
| + lift--;
|
| + rem += dy;
|
| }
|
| mod -= dy;
|
| while(ey1 != ey2) {
|
|
|