OLD | NEW |
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 "core/include/fpdfapi/fpdf_parser.h" | 7 #include "core/include/fpdfapi/fpdf_parser.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 2922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2933 FX_DWORD count = 0; | 2933 FX_DWORD count = 0; |
2934 CFX_ArrayTemplate<CPDF_Object*> new_obj_array; | 2934 CFX_ArrayTemplate<CPDF_Object*> new_obj_array; |
2935 int32_t i = 0; | 2935 int32_t i = 0; |
2936 for (i = 0; i < obj_array.GetSize(); i++) { | 2936 for (i = 0; i < obj_array.GetSize(); i++) { |
2937 CPDF_Object* pObj = obj_array[i]; | 2937 CPDF_Object* pObj = obj_array[i]; |
2938 if (!pObj) | 2938 if (!pObj) |
2939 continue; | 2939 continue; |
2940 | 2940 |
2941 int32_t type = pObj->GetType(); | 2941 int32_t type = pObj->GetType(); |
2942 switch (type) { | 2942 switch (type) { |
2943 case PDFOBJ_ARRAY: { | 2943 case CPDF_Object::ARRAY: { |
2944 CPDF_Array* pArray = pObj->GetArray(); | 2944 CPDF_Array* pArray = pObj->GetArray(); |
2945 for (FX_DWORD k = 0; k < pArray->GetCount(); k++) { | 2945 for (FX_DWORD k = 0; k < pArray->GetCount(); k++) { |
2946 new_obj_array.Add(pArray->GetElement(k)); | 2946 new_obj_array.Add(pArray->GetElement(k)); |
2947 } | 2947 } |
2948 } break; | 2948 } break; |
2949 case PDFOBJ_STREAM: | 2949 case CPDF_Object::STREAM: |
2950 pObj = pObj->GetDict(); | 2950 pObj = pObj->GetDict(); |
2951 case PDFOBJ_DICTIONARY: { | 2951 case CPDF_Object::DICTIONARY: { |
2952 CPDF_Dictionary* pDict = pObj->GetDict(); | 2952 CPDF_Dictionary* pDict = pObj->GetDict(); |
2953 if (pDict && pDict->GetString("Type") == "Page" && !bParsePage) { | 2953 if (pDict && pDict->GetString("Type") == "Page" && !bParsePage) { |
2954 continue; | 2954 continue; |
2955 } | 2955 } |
2956 for (const auto& it : *pDict) { | 2956 for (const auto& it : *pDict) { |
2957 const CFX_ByteString& key = it.first; | 2957 const CFX_ByteString& key = it.first; |
2958 CPDF_Object* value = it.second; | 2958 CPDF_Object* value = it.second; |
2959 if (key != "Parent") { | 2959 if (key != "Parent") { |
2960 new_obj_array.Add(value); | 2960 new_obj_array.Add(value); |
2961 } | 2961 } |
2962 } | 2962 } |
2963 } break; | 2963 } break; |
2964 case PDFOBJ_REFERENCE: { | 2964 case CPDF_Object::REFERENCE: { |
2965 CPDF_Reference* pRef = pObj->AsReference(); | 2965 CPDF_Reference* pRef = pObj->AsReference(); |
2966 FX_DWORD dwNum = pRef->GetRefObjNum(); | 2966 FX_DWORD dwNum = pRef->GetRefObjNum(); |
2967 FX_FILESIZE offset; | 2967 FX_FILESIZE offset; |
2968 FX_DWORD size = GetObjectSize(dwNum, offset); | 2968 FX_DWORD size = GetObjectSize(dwNum, offset); |
2969 if (size == 0 || offset < 0 || offset >= m_dwFileLen) { | 2969 if (size == 0 || offset < 0 || offset >= m_dwFileLen) { |
2970 break; | 2970 break; |
2971 } | 2971 } |
2972 if (!IsDataAvail(offset, size, pHints)) { | 2972 if (!IsDataAvail(offset, size, pHints)) { |
2973 ret_array.Add(pObj); | 2973 ret_array.Add(pObj); |
2974 count++; | 2974 count++; |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3341 if (!pParser) { | 3341 if (!pParser) { |
3342 m_docStatus = PDF_DATAAVAIL_ERROR; | 3342 m_docStatus = PDF_DATAAVAIL_ERROR; |
3343 return FALSE; | 3343 return FALSE; |
3344 } | 3344 } |
3345 CPDF_Dictionary* pDict = pPages->GetDict(); | 3345 CPDF_Dictionary* pDict = pPages->GetDict(); |
3346 CPDF_Object* pKids = pDict ? pDict->GetElement("Kids") : NULL; | 3346 CPDF_Object* pKids = pDict ? pDict->GetElement("Kids") : NULL; |
3347 if (!pKids) { | 3347 if (!pKids) { |
3348 return TRUE; | 3348 return TRUE; |
3349 } | 3349 } |
3350 switch (pKids->GetType()) { | 3350 switch (pKids->GetType()) { |
3351 case PDFOBJ_REFERENCE: | 3351 case CPDF_Object::REFERENCE: |
3352 m_PageObjList.Add(pKids->AsReference()->GetRefObjNum()); | 3352 m_PageObjList.Add(pKids->AsReference()->GetRefObjNum()); |
3353 break; | 3353 break; |
3354 case PDFOBJ_ARRAY: { | 3354 case CPDF_Object::ARRAY: { |
3355 CPDF_Array* pKidsArray = pKids->AsArray(); | 3355 CPDF_Array* pKidsArray = pKids->AsArray(); |
3356 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { | 3356 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { |
3357 if (CPDF_Reference* pRef = ToReference(pKidsArray->GetElement(i))) | 3357 if (CPDF_Reference* pRef = ToReference(pKidsArray->GetElement(i))) |
3358 m_PageObjList.Add(pRef->GetRefObjNum()); | 3358 m_PageObjList.Add(pRef->GetRefObjNum()); |
3359 } | 3359 } |
3360 } break; | 3360 } break; |
3361 default: | 3361 default: |
3362 m_docStatus = PDF_DATAAVAIL_ERROR; | 3362 m_docStatus = PDF_DATAAVAIL_ERROR; |
3363 return FALSE; | 3363 return FALSE; |
3364 } | 3364 } |
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4035 CPDF_Dictionary* pDict = pPage->GetDict(); | 4035 CPDF_Dictionary* pDict = pPage->GetDict(); |
4036 CFX_ByteString type = pDict->GetString("Type"); | 4036 CFX_ByteString type = pDict->GetString("Type"); |
4037 if (type == "Pages") { | 4037 if (type == "Pages") { |
4038 pPageNode->m_type = PDF_PAGENODE_PAGES; | 4038 pPageNode->m_type = PDF_PAGENODE_PAGES; |
4039 CPDF_Object* pKids = pDict->GetElement("Kids"); | 4039 CPDF_Object* pKids = pDict->GetElement("Kids"); |
4040 if (!pKids) { | 4040 if (!pKids) { |
4041 m_docStatus = PDF_DATAAVAIL_PAGE; | 4041 m_docStatus = PDF_DATAAVAIL_PAGE; |
4042 return TRUE; | 4042 return TRUE; |
4043 } | 4043 } |
4044 switch (pKids->GetType()) { | 4044 switch (pKids->GetType()) { |
4045 case PDFOBJ_REFERENCE: { | 4045 case CPDF_Object::REFERENCE: { |
4046 CPDF_Reference* pKid = pKids->AsReference(); | 4046 CPDF_Reference* pKid = pKids->AsReference(); |
4047 CPDF_PageNode* pNode = new CPDF_PageNode(); | 4047 CPDF_PageNode* pNode = new CPDF_PageNode(); |
4048 pPageNode->m_childNode.Add(pNode); | 4048 pPageNode->m_childNode.Add(pNode); |
4049 pNode->m_dwPageNo = pKid->GetRefObjNum(); | 4049 pNode->m_dwPageNo = pKid->GetRefObjNum(); |
4050 } break; | 4050 } break; |
4051 case PDFOBJ_ARRAY: { | 4051 case CPDF_Object::ARRAY: { |
4052 CPDF_Array* pKidsArray = pKids->AsArray(); | 4052 CPDF_Array* pKidsArray = pKids->AsArray(); |
4053 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { | 4053 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { |
4054 CPDF_Reference* pKid = ToReference(pKidsArray->GetElement(i)); | 4054 CPDF_Reference* pKid = ToReference(pKidsArray->GetElement(i)); |
4055 if (!pKid) | 4055 if (!pKid) |
4056 continue; | 4056 continue; |
4057 | 4057 |
4058 CPDF_PageNode* pNode = new CPDF_PageNode(); | 4058 CPDF_PageNode* pNode = new CPDF_PageNode(); |
4059 pPageNode->m_childNode.Add(pNode); | 4059 pPageNode->m_childNode.Add(pNode); |
4060 pNode->m_dwPageNo = pKid->GetRefObjNum(); | 4060 pNode->m_dwPageNo = pKid->GetRefObjNum(); |
4061 } | 4061 } |
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4844 } | 4844 } |
4845 } | 4845 } |
4846 return IPDF_DataAvail::DataAvailable; | 4846 return IPDF_DataAvail::DataAvailable; |
4847 } | 4847 } |
4848 | 4848 |
4849 FX_BOOL CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { | 4849 FX_BOOL CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { |
4850 if (!pHintStream || !m_pLinearizedDict) | 4850 if (!pHintStream || !m_pLinearizedDict) |
4851 return FALSE; | 4851 return FALSE; |
4852 CPDF_Dictionary* pDict = pHintStream->GetDict(); | 4852 CPDF_Dictionary* pDict = pHintStream->GetDict(); |
4853 CPDF_Object* pOffset = pDict ? pDict->GetElement("S") : nullptr; | 4853 CPDF_Object* pOffset = pDict ? pDict->GetElement("S") : nullptr; |
4854 if (!pOffset || pOffset->GetType() != PDFOBJ_NUMBER) | 4854 if (!pOffset || pOffset->GetType() != CPDF_Object::NUMBER) |
4855 return FALSE; | 4855 return FALSE; |
4856 int shared_hint_table_offset = pOffset->GetInteger(); | 4856 int shared_hint_table_offset = pOffset->GetInteger(); |
4857 CPDF_StreamAcc acc; | 4857 CPDF_StreamAcc acc; |
4858 acc.LoadAllData(pHintStream); | 4858 acc.LoadAllData(pHintStream); |
4859 FX_DWORD size = acc.GetSize(); | 4859 FX_DWORD size = acc.GetSize(); |
4860 // The header section of page offset hint table is 36 bytes. | 4860 // The header section of page offset hint table is 36 bytes. |
4861 // The header section of shared object hint table is 24 bytes. | 4861 // The header section of shared object hint table is 24 bytes. |
4862 // Hint table has at least 60 bytes. | 4862 // Hint table has at least 60 bytes. |
4863 const FX_DWORD MIN_STREAM_LEN = 60; | 4863 const FX_DWORD MIN_STREAM_LEN = 60; |
4864 if (size < MIN_STREAM_LEN || shared_hint_table_offset <= 0 || | 4864 if (size < MIN_STREAM_LEN || shared_hint_table_offset <= 0 || |
(...skipping 22 matching lines...) Expand all Loading... |
4887 if (!m_pLinearizedDict) | 4887 if (!m_pLinearizedDict) |
4888 return -1; | 4888 return -1; |
4889 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); | 4889 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); |
4890 if (!pRange) | 4890 if (!pRange) |
4891 return -1; | 4891 return -1; |
4892 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4892 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
4893 if (!pStreamLen) | 4893 if (!pStreamLen) |
4894 return -1; | 4894 return -1; |
4895 return pStreamLen->GetInteger(); | 4895 return pStreamLen->GetInteger(); |
4896 } | 4896 } |
OLD | NEW |