You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.3 KiB
74 lines
2.3 KiB
diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
|
index 46379f6..c6b3f01 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) {
|