| Index: core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| index ea8ceee9d31be6f661a0ed3380d19c17c1bc3242..b4a74cd74a4f5d3c8539c6929f605e56ccca0f3f 100644
|
| --- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| @@ -38,16 +38,12 @@ unsigned int _GetBits8(const uint8_t* pData, int bitpos, int nbits) {
|
| return 0;
|
| }
|
|
|
| -FX_SAFE_DWORD CalculatePitch8(FX_DWORD bpc,
|
| - FX_DWORD components,
|
| - int width,
|
| - int height) {
|
| +FX_SAFE_DWORD CalculatePitch8(FX_DWORD bpc, FX_DWORD components, int width) {
|
| FX_SAFE_DWORD pitch = bpc;
|
| pitch *= components;
|
| pitch *= width;
|
| pitch += 7;
|
| pitch /= 8;
|
| - pitch *= height;
|
| return pitch;
|
| }
|
|
|
| @@ -55,7 +51,8 @@ FX_SAFE_DWORD CalculatePitch32(int bpp, int width) {
|
| FX_SAFE_DWORD pitch = bpp;
|
| pitch *= width;
|
| pitch += 31;
|
| - pitch /= 8;
|
| + pitch /= 32; // quantized to number of 32-bit words.
|
| + pitch *= 4; // and then back to bytes, (not just /8 in one step).
|
| return pitch;
|
| }
|
|
|
| @@ -232,13 +229,13 @@ FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc,
|
| if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) {
|
| return FALSE;
|
| }
|
| - FX_SAFE_DWORD src_pitch =
|
| - CalculatePitch8(m_bpc, m_nComponents, m_Width, m_Height);
|
| - if (!src_pitch.IsValid()) {
|
| + FX_SAFE_DWORD src_size =
|
| + CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height;
|
| + if (!src_size.IsValid()) {
|
| return FALSE;
|
| }
|
| m_pStreamAcc = new CPDF_StreamAcc;
|
| - m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE);
|
| + m_pStreamAcc->LoadAllData(pStream, FALSE, src_size.ValueOrDie(), TRUE);
|
| if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
|
| return FALSE;
|
| }
|
| @@ -352,13 +349,13 @@ int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc,
|
| if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) {
|
| return 0;
|
| }
|
| - FX_SAFE_DWORD src_pitch =
|
| - CalculatePitch8(m_bpc, m_nComponents, m_Width, m_Height);
|
| - if (!src_pitch.IsValid()) {
|
| + FX_SAFE_DWORD src_size =
|
| + CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height;
|
| + if (!src_size.IsValid()) {
|
| return 0;
|
| }
|
| m_pStreamAcc = new CPDF_StreamAcc;
|
| - m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE);
|
| + m_pStreamAcc->LoadAllData(pStream, FALSE, src_size.ValueOrDie(), TRUE);
|
| if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
|
| return 0;
|
| }
|
| @@ -664,13 +661,12 @@ int CPDF_DIBSource::CreateDecoder() {
|
| return 0;
|
|
|
| FX_SAFE_DWORD requested_pitch =
|
| - CalculatePitch8(m_bpc, m_nComponents, m_Width, 1);
|
| + CalculatePitch8(m_bpc, m_nComponents, m_Width);
|
| if (!requested_pitch.IsValid()) {
|
| return 0;
|
| }
|
| - FX_SAFE_DWORD provided_pitch =
|
| - CalculatePitch8(m_pDecoder->GetBPC(), m_pDecoder->CountComps(),
|
| - m_pDecoder->GetWidth(), 1);
|
| + FX_SAFE_DWORD provided_pitch = CalculatePitch8(
|
| + m_pDecoder->GetBPC(), m_pDecoder->CountComps(), m_pDecoder->GetWidth());
|
| if (!provided_pitch.IsValid()) {
|
| return 0;
|
| }
|
| @@ -1087,7 +1083,7 @@ const uint8_t* CPDF_DIBSource::GetScanline(int line) const {
|
| if (m_bpc == 0) {
|
| return NULL;
|
| }
|
| - FX_SAFE_DWORD src_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width, 1);
|
| + FX_SAFE_DWORD src_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width);
|
| if (!src_pitch.IsValid())
|
| return NULL;
|
| FX_DWORD src_pitch_value = src_pitch.ValueOrDie();
|
| @@ -1233,7 +1229,7 @@ void CPDF_DIBSource::DownSampleScanline(int line,
|
| }
|
|
|
| FX_DWORD src_width = m_Width;
|
| - FX_SAFE_DWORD pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width, 1);
|
| + FX_SAFE_DWORD pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width);
|
| if (!pitch.IsValid())
|
| return;
|
|
|
|
|