Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: core/src/fxcodec/codec/fx_codec.cpp

Issue 1473143003: Merge to M47: Change |CCodec_ScanlineDecoder::m_Pitch| to FX_DWORD (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@2526
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fxcodec/codec/codec_int.h ('k') | core/src/fxcodec/codec/fx_codec_fax.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../../include/fxcodec/fx_codec.h" 7 #include "../../../include/fxcodec/fx_codec.h"
8 8
9 #include <cmath> 9 #include <cmath>
10 10
11 #include "../../../../third_party/base/logging.h" 11 #include "../../../../third_party/base/logging.h"
12 #include "../../../include/fxcrt/fx_safe_types.h" 12 #include "../../../include/fxcrt/fx_safe_types.h"
13 #include "codec_int.h" 13 #include "codec_int.h"
14 14
15 CCodec_ModuleMgr::CCodec_ModuleMgr() 15 CCodec_ModuleMgr::CCodec_ModuleMgr()
16 : m_pBasicModule(new CCodec_BasicModule), 16 : m_pBasicModule(new CCodec_BasicModule),
17 m_pFaxModule(new CCodec_FaxModule), 17 m_pFaxModule(new CCodec_FaxModule),
18 m_pJpegModule(new CCodec_JpegModule), 18 m_pJpegModule(new CCodec_JpegModule),
19 m_pJpxModule(new CCodec_JpxModule), 19 m_pJpxModule(new CCodec_JpxModule),
20 m_pJbig2Module(new CCodec_Jbig2Module), 20 m_pJbig2Module(new CCodec_Jbig2Module),
21 m_pIccModule(new CCodec_IccModule), 21 m_pIccModule(new CCodec_IccModule),
22 m_pFlateModule(new CCodec_FlateModule) {} 22 m_pFlateModule(new CCodec_FlateModule) {}
23 23
24 CCodec_ScanlineDecoder::ImageDataCache::ImageDataCache(int width, 24 CCodec_ScanlineDecoder::ImageDataCache::ImageDataCache(int width,
25 int height, 25 int height,
26 int pitch) 26 FX_DWORD pitch)
27 : m_Width(width), m_Height(height), m_Pitch(pitch), m_nCachedLines(0) { 27 : m_Width(width), m_Height(height), m_Pitch(pitch), m_nCachedLines(0) {
28 } 28 }
29 29
30 CCodec_ScanlineDecoder::ImageDataCache::~ImageDataCache() { 30 CCodec_ScanlineDecoder::ImageDataCache::~ImageDataCache() {
31 } 31 }
32 32
33 bool CCodec_ScanlineDecoder::ImageDataCache::AllocateCache() { 33 bool CCodec_ScanlineDecoder::ImageDataCache::AllocateCache() {
34 if (m_Pitch <= 0 || m_Height < 0) 34 if (m_Pitch == 0 || m_Height < 0)
35 return false; 35 return false;
36 36
37 FX_SAFE_SIZE_T size = m_Pitch; 37 FX_SAFE_SIZE_T size = m_Pitch;
38 size *= m_Height; 38 size *= m_Height;
39 if (!size.IsValid()) 39 if (!size.IsValid())
40 return false; 40 return false;
41 41
42 m_Data.reset(FX_TryAlloc(uint8_t, size.ValueOrDie())); 42 m_Data.reset(FX_TryAlloc(uint8_t, size.ValueOrDie()));
43 return IsValid(); 43 return IsValid();
44 } 44 }
45 45
46 void CCodec_ScanlineDecoder::ImageDataCache::AppendLine(const uint8_t* line) { 46 void CCodec_ScanlineDecoder::ImageDataCache::AppendLine(const uint8_t* line) {
47 // If the callers adds more lines than there is room, fail. 47 // If the callers adds more lines than there is room, fail.
48 if (m_Pitch <= 0 || m_nCachedLines >= m_Height) { 48 if (m_Pitch == 0 || m_nCachedLines >= m_Height) {
49 NOTREACHED(); 49 NOTREACHED();
50 return; 50 return;
51 } 51 }
52 52
53 size_t offset = m_Pitch; 53 size_t offset = m_Pitch;
54 FXSYS_memcpy(m_Data.get() + offset * m_nCachedLines, line, m_Pitch); 54 FXSYS_memcpy(m_Data.get() + offset * m_nCachedLines, line, m_Pitch);
55 ++m_nCachedLines; 55 ++m_nCachedLines;
56 } 56 }
57 57
58 const uint8_t* CCodec_ScanlineDecoder::ImageDataCache::GetLine(int line) const { 58 const uint8_t* CCodec_ScanlineDecoder::ImageDataCache::GetLine(int line) const {
59 if (m_Pitch <= 0 || line < 0 || line >= m_nCachedLines) 59 if (m_Pitch == 0 || line < 0 || line >= m_nCachedLines)
60 return nullptr; 60 return nullptr;
61 61
62 size_t offset = m_Pitch; 62 size_t offset = m_Pitch;
63 return m_Data.get() + offset * line; 63 return m_Data.get() + offset * line;
64 } 64 }
65 65
66 CCodec_ScanlineDecoder::CCodec_ScanlineDecoder() 66 CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()
67 : m_NextLine(-1), m_pLastScanline(nullptr) { 67 : m_NextLine(-1), m_pLastScanline(nullptr) {
68 } 68 }
69 69
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 int nComps, 331 int nComps,
332 int bpc) { 332 int bpc) {
333 m_pSrcBuf = src_buf; 333 m_pSrcBuf = src_buf;
334 m_SrcSize = src_size; 334 m_SrcSize = src_size;
335 m_OutputWidth = m_OrigWidth = width; 335 m_OutputWidth = m_OrigWidth = width;
336 m_OutputHeight = m_OrigHeight = height; 336 m_OutputHeight = m_OrigHeight = height;
337 m_nComps = nComps; 337 m_nComps = nComps;
338 m_bpc = bpc; 338 m_bpc = bpc;
339 m_bColorTransformed = FALSE; 339 m_bColorTransformed = FALSE;
340 m_DownScale = 1; 340 m_DownScale = 1;
341 m_Pitch = (width * nComps * bpc + 31) / 32 * 4; 341 // Aligning the pitch to 4 bytes requires an integer overflow check.
342 m_dwLineBytes = (width * nComps * bpc + 7) / 8; 342 FX_SAFE_DWORD pitch = width;
343 pitch *= nComps;
344 pitch *= bpc;
345 pitch += 31;
346 pitch /= 32;
347 pitch *= 4;
348 if (!pitch.IsValid()) {
349 return FALSE;
350 }
351 m_Pitch = pitch.ValueOrDie();
352 // Overflow should already have been checked before this is called.
353 m_dwLineBytes = (static_cast<FX_DWORD>(width) * nComps * bpc + 7) / 8;
343 m_pScanline = FX_Alloc(uint8_t, m_Pitch); 354 m_pScanline = FX_Alloc(uint8_t, m_Pitch);
344 return CheckDestSize(); 355 return CheckDestSize();
345 } 356 }
346 FX_BOOL CCodec_RLScanlineDecoder::v_Rewind() { 357 FX_BOOL CCodec_RLScanlineDecoder::v_Rewind() {
347 FXSYS_memset(m_pScanline, 0, m_Pitch); 358 FXSYS_memset(m_pScanline, 0, m_Pitch);
348 m_SrcOffset = 0; 359 m_SrcOffset = 0;
349 m_bEOD = FALSE; 360 m_bEOD = FALSE;
350 m_Operator = 0; 361 m_Operator = 0;
351 return TRUE; 362 return TRUE;
352 } 363 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 int nComps, 450 int nComps,
440 int bpc) { 451 int bpc) {
441 CCodec_RLScanlineDecoder* pRLScanlineDecoder = new CCodec_RLScanlineDecoder; 452 CCodec_RLScanlineDecoder* pRLScanlineDecoder = new CCodec_RLScanlineDecoder;
442 if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, 453 if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps,
443 bpc)) { 454 bpc)) {
444 delete pRLScanlineDecoder; 455 delete pRLScanlineDecoder;
445 return NULL; 456 return NULL;
446 } 457 }
447 return pRLScanlineDecoder; 458 return pRLScanlineDecoder;
448 } 459 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/codec/codec_int.h ('k') | core/src/fxcodec/codec/fx_codec_fax.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698