Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h" | 7 #include "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_data_avail.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_data_avail.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 : m_pDataAvail(pDataAvail), | 28 : m_pDataAvail(pDataAvail), |
| 29 m_pLinearizedDict(pLinearized), | 29 m_pLinearizedDict(pLinearized), |
| 30 m_nFirstPageSharedObjs(0), | 30 m_nFirstPageSharedObjs(0), |
| 31 m_szFirstPageObjOffset(0) { | 31 m_szFirstPageObjOffset(0) { |
| 32 ASSERT(m_pLinearizedDict); | 32 ASSERT(m_pLinearizedDict); |
| 33 } | 33 } |
| 34 | 34 |
| 35 CPDF_HintTables::~CPDF_HintTables() {} | 35 CPDF_HintTables::~CPDF_HintTables() {} |
| 36 | 36 |
| 37 uint32_t CPDF_HintTables::GetItemLength( | 37 uint32_t CPDF_HintTables::GetItemLength( |
| 38 int index, | 38 uint32_t index, |
| 39 const std::vector<FX_FILESIZE>& szArray) { | 39 const std::vector<FX_FILESIZE>& szArray) { |
| 40 if (index < 0 || szArray.size() < 2 || | 40 if (szArray.size() < 2 || index > szArray.size() - 2 || |
| 41 static_cast<size_t>(index) > szArray.size() - 2 || | |
| 42 szArray[index] > szArray[index + 1]) { | 41 szArray[index] > szArray[index + 1]) { |
| 43 return 0; | 42 return 0; |
| 44 } | 43 } |
| 45 return szArray[index + 1] - szArray[index]; | 44 return szArray[index + 1] - szArray[index]; |
| 46 } | 45 } |
| 47 | 46 |
| 48 bool CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { | 47 bool CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { |
| 49 if (!hStream || hStream->IsEOF()) | 48 if (!hStream || hStream->IsEOF()) |
| 50 return false; | 49 return false; |
| 51 | 50 |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 | 346 |
| 348 hStream->ByteAlign(); | 347 hStream->ByteAlign(); |
| 349 if (hStream->BitsRemaining() < dwSharedObjTotal) | 348 if (hStream->BitsRemaining() < dwSharedObjTotal) |
| 350 return false; | 349 return false; |
| 351 | 350 |
| 352 hStream->SkipBits(dwSharedObjTotal); | 351 hStream->SkipBits(dwSharedObjTotal); |
| 353 hStream->ByteAlign(); | 352 hStream->ByteAlign(); |
| 354 return true; | 353 return true; |
| 355 } | 354 } |
| 356 | 355 |
| 357 bool CPDF_HintTables::GetPagePos(int index, | 356 bool CPDF_HintTables::GetPagePos(uint32_t index, |
| 358 FX_FILESIZE* szPageStartPos, | 357 FX_FILESIZE* szPageStartPos, |
| 359 FX_FILESIZE* szPageLength, | 358 FX_FILESIZE* szPageLength, |
| 360 uint32_t* dwObjNum) { | 359 uint32_t* dwObjNum) { |
| 361 if (index < 0) | |
| 362 return false; | |
| 363 | |
| 364 *szPageStartPos = m_szPageOffsetArray[index]; | 360 *szPageStartPos = m_szPageOffsetArray[index]; |
| 365 *szPageLength = GetItemLength(index, m_szPageOffsetArray); | 361 *szPageLength = GetItemLength(index, m_szPageOffsetArray); |
| 366 | 362 |
| 367 int nFirstPageObjNum = GetFirstPageObjectNumber(); | 363 int nFirstPageObjNum = GetFirstPageObjectNumber(); |
| 368 if (nFirstPageObjNum < 0) | 364 if (nFirstPageObjNum < 0) |
| 369 return false; | 365 return false; |
| 370 | 366 |
| 371 int nFirstPageNum = GetFirstPageNumber(); | 367 int nFirstPageNum = GetFirstPageNumber(); |
| 372 if (nFirstPageNum < 0) | 368 if (nFirstPageNum < 0) |
|
Tom Sepez
2016/09/01 16:16:27
Do we just want to use base's checked cast magin i
Lei Zhang
2016/09/01 17:58:21
Done.
| |
| 373 return false; | 369 return false; |
| 374 | 370 |
| 375 if (index == nFirstPageNum) { | 371 uint32_t dwFirstPageNum = static_cast<uint32_t>(nFirstPageNum); |
| 372 if (index == dwFirstPageNum) { | |
| 376 *dwObjNum = nFirstPageObjNum; | 373 *dwObjNum = nFirstPageObjNum; |
| 377 return true; | 374 return true; |
| 378 } | 375 } |
| 379 | 376 |
| 380 // The object number of remaining pages starts from 1. | 377 // The object number of remaining pages starts from 1. |
| 381 *dwObjNum = 1; | 378 *dwObjNum = 1; |
| 382 for (int i = 0; i < index; ++i) { | 379 for (uint32_t i = 0; i < index; ++i) { |
| 383 if (i == nFirstPageNum) | 380 if (i == dwFirstPageNum) |
| 384 continue; | 381 continue; |
| 385 *dwObjNum += m_dwDeltaNObjsArray[i]; | 382 *dwObjNum += m_dwDeltaNObjsArray[i]; |
| 386 } | 383 } |
| 387 return true; | 384 return true; |
| 388 } | 385 } |
| 389 | 386 |
| 390 CPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage( | 387 CPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage( |
| 391 int index, | 388 uint32_t index, |
| 392 CPDF_DataAvail::DownloadHints* pHints) { | 389 CPDF_DataAvail::DownloadHints* pHints) { |
| 393 if (!pHints || index < 0) | 390 if (!pHints) |
| 394 return CPDF_DataAvail::DataError; | 391 return CPDF_DataAvail::DataError; |
| 395 | 392 |
| 396 if (index == GetFirstPageNumber()) | 393 int nFirstPageNum = GetFirstPageNumber(); |
| 394 if (nFirstPageNum < 0) | |
| 395 return CPDF_DataAvail::DataError; | |
| 396 | |
| 397 if (index == static_cast<uint32_t>(nFirstPageNum)) | |
| 397 return CPDF_DataAvail::DataAvailable; | 398 return CPDF_DataAvail::DataAvailable; |
| 398 | 399 |
| 399 uint32_t dwLength = GetItemLength(index, m_szPageOffsetArray); | 400 uint32_t dwLength = GetItemLength(index, m_szPageOffsetArray); |
| 400 // If two pages have the same offset, it should be treated as an error. | 401 // If two pages have the same offset, it should be treated as an error. |
| 401 if (!dwLength) | 402 if (!dwLength) |
| 402 return CPDF_DataAvail::DataError; | 403 return CPDF_DataAvail::DataError; |
| 403 | 404 |
| 404 if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints)) | 405 if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints)) |
| 405 return CPDF_DataAvail::DataNotAvailable; | 406 return CPDF_DataAvail::DataNotAvailable; |
| 406 | 407 |
| 407 // Download data of shared objects in the page. | 408 // Download data of shared objects in the page. |
| 408 uint32_t offset = 0; | 409 uint32_t offset = 0; |
| 409 for (int i = 0; i < index; ++i) | 410 for (uint32_t i = 0; i < index; ++i) |
| 410 offset += m_dwNSharedObjsArray[i]; | 411 offset += m_dwNSharedObjsArray[i]; |
| 411 | 412 |
| 412 int nFirstPageObjNum = GetFirstPageObjectNumber(); | 413 int nFirstPageObjNum = GetFirstPageObjectNumber(); |
| 413 if (nFirstPageObjNum < 0) | 414 if (nFirstPageObjNum < 0) |
| 414 return CPDF_DataAvail::DataError; | 415 return CPDF_DataAvail::DataError; |
| 415 | 416 |
| 416 uint32_t dwIndex = 0; | 417 uint32_t dwIndex = 0; |
| 417 uint32_t dwObjNum = 0; | 418 uint32_t dwObjNum = 0; |
| 418 for (uint32_t j = 0; j < m_dwNSharedObjsArray[index]; ++j) { | 419 for (uint32_t j = 0; j < m_dwNSharedObjsArray[index]; ++j) { |
| 419 dwIndex = m_dwIdentifierArray[offset + j]; | 420 dwIndex = m_dwIdentifierArray[offset + j]; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 505 } | 506 } |
| 506 | 507 |
| 507 int CPDF_HintTables::ReadPrimaryHintStream(int index) const { | 508 int CPDF_HintTables::ReadPrimaryHintStream(int index) const { |
| 508 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); | 509 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); |
| 509 if (!pRange) | 510 if (!pRange) |
| 510 return -1; | 511 return -1; |
| 511 | 512 |
| 512 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(index); | 513 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(index); |
| 513 return pStreamLen ? pStreamLen->GetInteger() : -1; | 514 return pStreamLen ? pStreamLen->GetInteger() : -1; |
| 514 } | 515 } |
| OLD | NEW |