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