| Index: core/fpdfapi/render/fpdf_render_text.cpp
|
| diff --git a/core/fpdfapi/render/fpdf_render_text.cpp b/core/fpdfapi/render/fpdf_render_text.cpp
|
| index b8f44f8bd91294b3163d3a153a3de6bd51c9e330..7d29f5c87fdedaab7cedb5eac81f0be9fb1c846b 100644
|
| --- a/core/fpdfapi/render/fpdf_render_text.cpp
|
| +++ b/core/fpdfapi/render/fpdf_render_text.cpp
|
| @@ -29,6 +29,7 @@
|
| #include "core/fxge/cfx_graphstatedata.h"
|
| #include "core/fxge/cfx_pathdata.h"
|
| #include "core/fxge/cfx_renderdevice.h"
|
| +#include "third_party/base/numerics/safe_math.h"
|
|
|
| FX_BOOL CPDF_RenderStatus::ProcessText(CPDF_TextObject* textobj,
|
| const CFX_Matrix* pObj2Device,
|
| @@ -314,13 +315,25 @@ FX_BOOL CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj,
|
| if (!glyph.m_pGlyph)
|
| continue;
|
|
|
| - bitmap.TransferBitmap(
|
| - static_cast<int>(
|
| - (glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),
|
| - static_cast<int>((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) *
|
| - sd),
|
| - glyph.m_pGlyph->m_Bitmap.GetWidth(),
|
| - glyph.m_pGlyph->m_Bitmap.GetHeight(), &glyph.m_pGlyph->m_Bitmap, 0, 0);
|
| + pdfium::base::CheckedNumeric<int> left = glyph.m_OriginX;
|
| + left += glyph.m_pGlyph->m_Left;
|
| + left -= rect.left;
|
| + left *= sa;
|
| + if (!left.IsValid())
|
| + continue;
|
| +
|
| + pdfium::base::CheckedNumeric<int> top = glyph.m_OriginY;
|
| + top -= glyph.m_pGlyph->m_Top;
|
| + top -= rect.top;
|
| + top *= sd;
|
| + if (!top.IsValid())
|
| + continue;
|
| +
|
| + bitmap.CompositeMask(left.ValueOrDie(), top.ValueOrDie(),
|
| + glyph.m_pGlyph->m_Bitmap.GetWidth(),
|
| + glyph.m_pGlyph->m_Bitmap.GetHeight(),
|
| + &glyph.m_pGlyph->m_Bitmap, fill_argb, 0, 0,
|
| + FXDIB_BLEND_NORMAL, nullptr, FALSE, 0, nullptr);
|
| }
|
| m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);
|
| return TRUE;
|
|
|