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/fpdfapi/fpdf_page/pageint.h" | 7 #include "core/fpdfapi/fpdf_page/pageint.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 m_ParamBuf[index].m_Type = ContentParam::NUMBER; | 248 m_ParamBuf[index].m_Type = ContentParam::NUMBER; |
249 FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf[index].m_Number.m_bInteger, | 249 FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf[index].m_Number.m_bInteger, |
250 &m_ParamBuf[index].m_Number.m_Integer); | 250 &m_ParamBuf[index].m_Number.m_Integer); |
251 } | 251 } |
252 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { | 252 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { |
253 int index = GetNextParamPos(); | 253 int index = GetNextParamPos(); |
254 m_ParamBuf[index].m_Type = ContentParam::OBJECT; | 254 m_ParamBuf[index].m_Type = ContentParam::OBJECT; |
255 m_ParamBuf[index].m_pObject = pObj; | 255 m_ParamBuf[index].m_pObject = pObj; |
256 } | 256 } |
257 void CPDF_StreamContentParser::ClearAllParams() { | 257 void CPDF_StreamContentParser::ClearAllParams() { |
258 FX_DWORD index = m_ParamStartPos; | 258 uint32_t index = m_ParamStartPos; |
259 for (FX_DWORD i = 0; i < m_ParamCount; i++) { | 259 for (uint32_t i = 0; i < m_ParamCount; i++) { |
260 if (m_ParamBuf[index].m_Type == 0) { | 260 if (m_ParamBuf[index].m_Type == 0) { |
261 if (CPDF_Object* pObject = m_ParamBuf[index].m_pObject) | 261 if (CPDF_Object* pObject = m_ParamBuf[index].m_pObject) |
262 pObject->Release(); | 262 pObject->Release(); |
263 } | 263 } |
264 index++; | 264 index++; |
265 if (index == PARAM_BUF_SIZE) { | 265 if (index == PARAM_BUF_SIZE) { |
266 index = 0; | 266 index = 0; |
267 } | 267 } |
268 } | 268 } |
269 m_ParamStartPos = 0; | 269 m_ParamStartPos = 0; |
270 m_ParamCount = 0; | 270 m_ParamCount = 0; |
271 } | 271 } |
272 | 272 |
273 CPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index) { | 273 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { |
274 if (index >= m_ParamCount) { | 274 if (index >= m_ParamCount) { |
275 return NULL; | 275 return NULL; |
276 } | 276 } |
277 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 277 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
278 if (real_index >= PARAM_BUF_SIZE) { | 278 if (real_index >= PARAM_BUF_SIZE) { |
279 real_index -= PARAM_BUF_SIZE; | 279 real_index -= PARAM_BUF_SIZE; |
280 } | 280 } |
281 ContentParam& param = m_ParamBuf[real_index]; | 281 ContentParam& param = m_ParamBuf[real_index]; |
282 if (param.m_Type == ContentParam::NUMBER) { | 282 if (param.m_Type == ContentParam::NUMBER) { |
283 CPDF_Number* pNumber = param.m_Number.m_bInteger | 283 CPDF_Number* pNumber = param.m_Number.m_bInteger |
(...skipping 11 matching lines...) Expand all Loading... |
295 param.m_pObject = pName; | 295 param.m_pObject = pName; |
296 return pName; | 296 return pName; |
297 } | 297 } |
298 if (param.m_Type == ContentParam::OBJECT) { | 298 if (param.m_Type == ContentParam::OBJECT) { |
299 return param.m_pObject; | 299 return param.m_pObject; |
300 } | 300 } |
301 ASSERT(FALSE); | 301 ASSERT(FALSE); |
302 return NULL; | 302 return NULL; |
303 } | 303 } |
304 | 304 |
305 CFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index) { | 305 CFX_ByteString CPDF_StreamContentParser::GetString(uint32_t index) { |
306 if (index >= m_ParamCount) { | 306 if (index >= m_ParamCount) { |
307 return CFX_ByteString(); | 307 return CFX_ByteString(); |
308 } | 308 } |
309 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 309 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
310 if (real_index >= PARAM_BUF_SIZE) { | 310 if (real_index >= PARAM_BUF_SIZE) { |
311 real_index -= PARAM_BUF_SIZE; | 311 real_index -= PARAM_BUF_SIZE; |
312 } | 312 } |
313 ContentParam& param = m_ParamBuf[real_index]; | 313 ContentParam& param = m_ParamBuf[real_index]; |
314 if (param.m_Type == ContentParam::NAME) { | 314 if (param.m_Type == ContentParam::NAME) { |
315 return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len); | 315 return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len); |
316 } | 316 } |
317 if (param.m_Type == 0 && param.m_pObject) { | 317 if (param.m_Type == 0 && param.m_pObject) { |
318 return param.m_pObject->GetString(); | 318 return param.m_pObject->GetString(); |
319 } | 319 } |
320 return CFX_ByteString(); | 320 return CFX_ByteString(); |
321 } | 321 } |
322 | 322 |
323 FX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index) { | 323 FX_FLOAT CPDF_StreamContentParser::GetNumber(uint32_t index) { |
324 if (index >= m_ParamCount) { | 324 if (index >= m_ParamCount) { |
325 return 0; | 325 return 0; |
326 } | 326 } |
327 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 327 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
328 if (real_index >= PARAM_BUF_SIZE) { | 328 if (real_index >= PARAM_BUF_SIZE) { |
329 real_index -= PARAM_BUF_SIZE; | 329 real_index -= PARAM_BUF_SIZE; |
330 } | 330 } |
331 ContentParam& param = m_ParamBuf[real_index]; | 331 ContentParam& param = m_ParamBuf[real_index]; |
332 if (param.m_Type == ContentParam::NUMBER) { | 332 if (param.m_Type == ContentParam::NUMBER) { |
333 return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer | 333 return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer |
334 : param.m_Number.m_Float; | 334 : param.m_Number.m_Float; |
335 } | 335 } |
336 if (param.m_Type == 0 && param.m_pObject) { | 336 if (param.m_Type == 0 && param.m_pObject) { |
337 return param.m_pObject->GetNumber(); | 337 return param.m_pObject->GetNumber(); |
338 } | 338 } |
339 return 0; | 339 return 0; |
340 } | 340 } |
341 | 341 |
342 FX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index) { | 342 FX_FLOAT CPDF_StreamContentParser::GetNumber16(uint32_t index) { |
343 return GetNumber(index); | 343 return GetNumber(index); |
344 } | 344 } |
345 | 345 |
346 void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, | 346 void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, |
347 FX_BOOL bColor, | 347 FX_BOOL bColor, |
348 FX_BOOL bText, | 348 FX_BOOL bText, |
349 FX_BOOL bGraph) { | 349 FX_BOOL bGraph) { |
350 pObj->m_GeneralState = m_pCurStates->m_GeneralState; | 350 pObj->m_GeneralState = m_pCurStates->m_GeneralState; |
351 pObj->m_ClipPath = m_pCurStates->m_ClipPath; | 351 pObj->m_ClipPath = m_pCurStates->m_ClipPath; |
352 pObj->m_ContentMark = m_CurContentMark; | 352 pObj->m_ContentMark = m_CurContentMark; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 &CPDF_StreamContentParser::Handle_SetColorPS_Fill}, | 477 &CPDF_StreamContentParser::Handle_SetColorPS_Fill}, |
478 {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill}, | 478 {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill}, |
479 {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23}, | 479 {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23}, |
480 {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth}, | 480 {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth}, |
481 {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, | 481 {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, |
482 }); | 482 }); |
483 } | 483 } |
484 | 484 |
485 void CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { | 485 void CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { |
486 int i = 0; | 486 int i = 0; |
487 FX_DWORD opid = 0; | 487 uint32_t opid = 0; |
488 while (i < 4 && op[i]) { | 488 while (i < 4 && op[i]) { |
489 opid = (opid << 8) + op[i]; | 489 opid = (opid << 8) + op[i]; |
490 i++; | 490 i++; |
491 } | 491 } |
492 while (i < 4) { | 492 while (i < 4) { |
493 opid <<= 8; | 493 opid <<= 8; |
494 i++; | 494 i++; |
495 } | 495 } |
496 | 496 |
497 static const OpCodes s_OpCodes = InitializeOpCodes(); | 497 static const OpCodes s_OpCodes = InitializeOpCodes(); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 } | 567 } |
568 } | 568 } |
569 if (type != CPDF_StreamParser::Name) { | 569 if (type != CPDF_StreamParser::Name) { |
570 break; | 570 break; |
571 } | 571 } |
572 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, | 572 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, |
573 m_pSyntax->GetWordSize() - 1); | 573 m_pSyntax->GetWordSize() - 1); |
574 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( | 574 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( |
575 m_pSyntax->ReadNextObject()); | 575 m_pSyntax->ReadNextObject()); |
576 if (!key.IsEmpty()) { | 576 if (!key.IsEmpty()) { |
577 FX_DWORD dwObjNum = pObj ? pObj->GetObjNum() : 0; | 577 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; |
578 if (dwObjNum) | 578 if (dwObjNum) |
579 pDict->SetAtReference(key, m_pDocument, dwObjNum); | 579 pDict->SetAtReference(key, m_pDocument, dwObjNum); |
580 else | 580 else |
581 pDict->SetAt(key, pObj.release()); | 581 pDict->SetAt(key, pObj.release()); |
582 } | 582 } |
583 } | 583 } |
584 PDF_ReplaceAbbr(pDict); | 584 PDF_ReplaceAbbr(pDict); |
585 CPDF_Object* pCSObj = NULL; | 585 CPDF_Object* pCSObj = NULL; |
586 if (pDict->KeyExist("ColorSpace")) { | 586 if (pDict->KeyExist("ColorSpace")) { |
587 pCSObj = pDict->GetElementValue("ColorSpace"); | 587 pCSObj = pDict->GetElementValue("ColorSpace"); |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 } | 1638 } |
1639 if (PathClipType) { | 1639 if (PathClipType) { |
1640 if (!matrix.IsIdentity()) { | 1640 if (!matrix.IsIdentity()) { |
1641 Path.Transform(&matrix); | 1641 Path.Transform(&matrix); |
1642 matrix.SetIdentity(); | 1642 matrix.SetIdentity(); |
1643 } | 1643 } |
1644 m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE); | 1644 m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE); |
1645 } | 1645 } |
1646 } | 1646 } |
1647 | 1647 |
1648 FX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData, | 1648 uint32_t CPDF_StreamContentParser::Parse(const uint8_t* pData, |
1649 FX_DWORD dwSize, | 1649 uint32_t dwSize, |
1650 FX_DWORD max_cost) { | 1650 uint32_t max_cost) { |
1651 if (m_Level > _FPDF_MAX_FORM_LEVEL_) { | 1651 if (m_Level > _FPDF_MAX_FORM_LEVEL_) { |
1652 return dwSize; | 1652 return dwSize; |
1653 } | 1653 } |
1654 FX_DWORD InitObjCount = m_pObjectHolder->GetPageObjectList()->size(); | 1654 uint32_t InitObjCount = m_pObjectHolder->GetPageObjectList()->size(); |
1655 CPDF_StreamParser syntax(pData, dwSize); | 1655 CPDF_StreamParser syntax(pData, dwSize); |
1656 CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); | 1656 CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); |
1657 while (1) { | 1657 while (1) { |
1658 FX_DWORD cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount; | 1658 uint32_t cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount; |
1659 if (max_cost && cost >= max_cost) { | 1659 if (max_cost && cost >= max_cost) { |
1660 break; | 1660 break; |
1661 } | 1661 } |
1662 switch (syntax.ParseNextElement()) { | 1662 switch (syntax.ParseNextElement()) { |
1663 case CPDF_StreamParser::EndOfData: | 1663 case CPDF_StreamParser::EndOfData: |
1664 return m_pSyntax->GetPos(); | 1664 return m_pSyntax->GetPos(); |
1665 case CPDF_StreamParser::Keyword: | 1665 case CPDF_StreamParser::Keyword: |
1666 OnOperator((char*)syntax.GetWordBuf()); | 1666 OnOperator((char*)syntax.GetWordBuf()); |
1667 ClearAllParams(); | 1667 ClearAllParams(); |
1668 break; | 1668 break; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1803 for (const auto& op : replacements) { | 1803 for (const auto& op : replacements) { |
1804 if (op.is_replace_key) | 1804 if (op.is_replace_key) |
1805 pDict->ReplaceKey(op.key, op.replacement); | 1805 pDict->ReplaceKey(op.key, op.replacement); |
1806 else | 1806 else |
1807 pDict->SetAtName(op.key, op.replacement); | 1807 pDict->SetAtName(op.key, op.replacement); |
1808 } | 1808 } |
1809 break; | 1809 break; |
1810 } | 1810 } |
1811 case CPDF_Object::ARRAY: { | 1811 case CPDF_Object::ARRAY: { |
1812 CPDF_Array* pArray = pObj->AsArray(); | 1812 CPDF_Array* pArray = pObj->AsArray(); |
1813 for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { | 1813 for (uint32_t i = 0; i < pArray->GetCount(); i++) { |
1814 CPDF_Object* pElement = pArray->GetElement(i); | 1814 CPDF_Object* pElement = pArray->GetElement(i); |
1815 if (pElement->IsName()) { | 1815 if (pElement->IsName()) { |
1816 CFX_ByteString name = pElement->GetString(); | 1816 CFX_ByteString name = pElement->GetString(); |
1817 CFX_ByteStringC fullname = PDF_FindFullName( | 1817 CFX_ByteStringC fullname = PDF_FindFullName( |
1818 PDF_InlineValueAbbr, FX_ArraySize(PDF_InlineValueAbbr), name); | 1818 PDF_InlineValueAbbr, FX_ArraySize(PDF_InlineValueAbbr), name); |
1819 if (!fullname.IsEmpty()) { | 1819 if (!fullname.IsEmpty()) { |
1820 pArray->SetAt(i, new CPDF_Name(fullname)); | 1820 pArray->SetAt(i, new CPDF_Name(fullname)); |
1821 } | 1821 } |
1822 } else { | 1822 } else { |
1823 PDF_ReplaceAbbr(pElement); | 1823 PDF_ReplaceAbbr(pElement); |
1824 } | 1824 } |
1825 } | 1825 } |
1826 break; | 1826 break; |
1827 } | 1827 } |
1828 default: | 1828 default: |
1829 break; | 1829 break; |
1830 } | 1830 } |
1831 } | 1831 } |
OLD | NEW |