OLD | NEW |
(Empty) | |
| 1 diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg2
3/agg_rasterizer_scanline_aa.cpp |
| 2 index 46379f6..c6b3f01 100644 |
| 3 --- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp |
| 4 +++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp |
| 5 @@ -48,6 +48,7 @@ |
| 6 //---------------------------------------------------------------------------- |
| 7 #include <limits.h> |
| 8 #include "agg_rasterizer_scanline_aa.h" |
| 9 +#include "third_party/base/numerics/safe_math.h" |
| 10 namespace agg |
| 11 { |
| 12 AGG_INLINE void cell_aa::set_cover(int c, int a) |
| 13 @@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) |
| 14 int fy1 = y1 & poly_base_mask; |
| 15 int fy2 = y2 & poly_base_mask; |
| 16 int x_from, x_to; |
| 17 - int p, rem, mod, lift, delta, first, incr; |
| 18 + int rem, mod, lift, delta, first, incr; |
| 19 if(ey1 == ey2) { |
| 20 render_hline(ey1, x1, fy1, x2, fy2); |
| 21 return; |
| 22 @@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y
2) |
| 23 m_cur_cell.add_cover(delta, two_fx * delta); |
| 24 return; |
| 25 } |
| 26 - p = (poly_base_size - fy1) * dx; |
| 27 + pdfium::base::CheckedNumeric<int> safeP = poly_base_size - fy1; |
| 28 + safeP *= dx; |
| 29 + if (!safeP.IsValid()) |
| 30 + return; |
| 31 first = poly_base_size; |
| 32 if(dy < 0) { |
| 33 - p = fy1 * dx; |
| 34 - first = 0; |
| 35 - incr = -1; |
| 36 - dy = -dy; |
| 37 + safeP = fy1; |
| 38 + safeP *= dx; |
| 39 + if (!safeP.IsValid()) |
| 40 + return; |
| 41 + first = 0; |
| 42 + incr = -1; |
| 43 + dy = -dy; |
| 44 } |
| 45 - delta = p / dy; |
| 46 - mod = p % dy; |
| 47 + delta = safeP.ValueOrDie() / dy; |
| 48 + mod = safeP.ValueOrDie() % dy; |
| 49 if(mod < 0) { |
| 50 delta--; |
| 51 mod += dy; |
| 52 @@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y
2) |
| 53 ey1 += incr; |
| 54 set_cur_cell(x_from >> poly_base_shift, ey1); |
| 55 if(ey1 != ey2) { |
| 56 - p = poly_base_size * dx; |
| 57 - lift = p / dy; |
| 58 - rem = p % dy; |
| 59 - if(rem < 0) { |
| 60 - lift--; |
| 61 - rem += dy; |
| 62 + safeP = static_cast<int>(poly_base_size); |
| 63 + safeP *= dx; |
| 64 + if (!safeP.IsValid()) |
| 65 + return; |
| 66 + lift = safeP.ValueOrDie() / dy; |
| 67 + rem = safeP.ValueOrDie() % dy; |
| 68 + if (rem < 0) { |
| 69 + lift--; |
| 70 + rem += dy; |
| 71 } |
| 72 mod -= dy; |
| 73 while(ey1 != ey2) { |
OLD | NEW |