| 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/page/cpdf_streamcontentparser.h" | 7 #include "core/fpdfapi/page/cpdf_streamcontentparser.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 delete m_pLastImageDict; | 299 delete m_pLastImageDict; |
| 300 delete m_pLastCloneImageDict; | 300 delete m_pLastCloneImageDict; |
| 301 } | 301 } |
| 302 | 302 |
| 303 int CPDF_StreamContentParser::GetNextParamPos() { | 303 int CPDF_StreamContentParser::GetNextParamPos() { |
| 304 if (m_ParamCount == kParamBufSize) { | 304 if (m_ParamCount == kParamBufSize) { |
| 305 m_ParamStartPos++; | 305 m_ParamStartPos++; |
| 306 if (m_ParamStartPos == kParamBufSize) { | 306 if (m_ParamStartPos == kParamBufSize) { |
| 307 m_ParamStartPos = 0; | 307 m_ParamStartPos = 0; |
| 308 } | 308 } |
| 309 if (m_ParamBuf[m_ParamStartPos].m_Type == 0) | 309 if (m_ParamBuf[m_ParamStartPos].m_Type == ContentParam::OBJECT) |
| 310 delete m_ParamBuf[m_ParamStartPos].m_pObject; | 310 m_ParamBuf[m_ParamStartPos].m_pObject.reset(); |
| 311 | 311 |
| 312 return m_ParamStartPos; | 312 return m_ParamStartPos; |
| 313 } | 313 } |
| 314 int index = m_ParamStartPos + m_ParamCount; | 314 int index = m_ParamStartPos + m_ParamCount; |
| 315 if (index >= kParamBufSize) { | 315 if (index >= kParamBufSize) { |
| 316 index -= kParamBufSize; | 316 index -= kParamBufSize; |
| 317 } | 317 } |
| 318 m_ParamCount++; | 318 m_ParamCount++; |
| 319 return index; | 319 return index; |
| 320 } | 320 } |
| 321 | 321 |
| 322 void CPDF_StreamContentParser::AddNameParam(const FX_CHAR* name, int len) { | 322 void CPDF_StreamContentParser::AddNameParam(const FX_CHAR* name, int len) { |
| 323 CFX_ByteStringC bsName(name, len); | 323 CFX_ByteStringC bsName(name, len); |
| 324 ContentParam& param = m_ParamBuf[GetNextParamPos()]; | 324 ContentParam& param = m_ParamBuf[GetNextParamPos()]; |
| 325 if (len > 32) { | 325 if (len > 32) { |
| 326 param.m_Type = ContentParam::OBJECT; | 326 param.m_Type = ContentParam::OBJECT; |
| 327 param.m_pObject = | 327 param.m_pObject = pdfium::MakeUnique<CPDF_Name>( |
| 328 new CPDF_Name(m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName)); | 328 m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName)); |
| 329 } else { | 329 } else { |
| 330 param.m_Type = ContentParam::NAME; | 330 param.m_Type = ContentParam::NAME; |
| 331 if (bsName.Find('#') == -1) { | 331 if (bsName.Find('#') == -1) { |
| 332 FXSYS_memcpy(param.m_Name.m_Buffer, name, len); | 332 FXSYS_memcpy(param.m_Name.m_Buffer, name, len); |
| 333 param.m_Name.m_Len = len; | 333 param.m_Name.m_Len = len; |
| 334 } else { | 334 } else { |
| 335 CFX_ByteString str = PDF_NameDecode(bsName); | 335 CFX_ByteString str = PDF_NameDecode(bsName); |
| 336 FXSYS_memcpy(param.m_Name.m_Buffer, str.c_str(), str.GetLength()); | 336 FXSYS_memcpy(param.m_Name.m_Buffer, str.c_str(), str.GetLength()); |
| 337 param.m_Name.m_Len = str.GetLength(); | 337 param.m_Name.m_Len = str.GetLength(); |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 } | 340 } |
| 341 | 341 |
| 342 void CPDF_StreamContentParser::AddNumberParam(const FX_CHAR* str, int len) { | 342 void CPDF_StreamContentParser::AddNumberParam(const FX_CHAR* str, int len) { |
| 343 ContentParam& param = m_ParamBuf[GetNextParamPos()]; | 343 ContentParam& param = m_ParamBuf[GetNextParamPos()]; |
| 344 param.m_Type = ContentParam::NUMBER; | 344 param.m_Type = ContentParam::NUMBER; |
| 345 param.m_Number.m_bInteger = | 345 param.m_Number.m_bInteger = |
| 346 FX_atonum(CFX_ByteStringC(str, len), ¶m.m_Number.m_Integer); | 346 FX_atonum(CFX_ByteStringC(str, len), ¶m.m_Number.m_Integer); |
| 347 } | 347 } |
| 348 | 348 |
| 349 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { | 349 void CPDF_StreamContentParser::AddObjectParam( |
| 350 std::unique_ptr<CPDF_Object> pObj) { |
| 350 ContentParam& param = m_ParamBuf[GetNextParamPos()]; | 351 ContentParam& param = m_ParamBuf[GetNextParamPos()]; |
| 351 param.m_Type = ContentParam::OBJECT; | 352 param.m_Type = ContentParam::OBJECT; |
| 352 param.m_pObject = pObj; | 353 param.m_pObject = std::move(pObj); |
| 353 } | 354 } |
| 354 | 355 |
| 355 void CPDF_StreamContentParser::ClearAllParams() { | 356 void CPDF_StreamContentParser::ClearAllParams() { |
| 356 uint32_t index = m_ParamStartPos; | 357 uint32_t index = m_ParamStartPos; |
| 357 for (uint32_t i = 0; i < m_ParamCount; i++) { | 358 for (uint32_t i = 0; i < m_ParamCount; i++) { |
| 358 if (m_ParamBuf[index].m_Type == 0) | 359 if (m_ParamBuf[index].m_Type == ContentParam::OBJECT) |
| 359 delete m_ParamBuf[index].m_pObject; | 360 m_ParamBuf[index].m_pObject.reset(); |
| 360 | |
| 361 index++; | 361 index++; |
| 362 if (index == kParamBufSize) { | 362 if (index == kParamBufSize) |
| 363 index = 0; | 363 index = 0; |
| 364 } | |
| 365 } | 364 } |
| 366 m_ParamStartPos = 0; | 365 m_ParamStartPos = 0; |
| 367 m_ParamCount = 0; | 366 m_ParamCount = 0; |
| 368 } | 367 } |
| 369 | 368 |
| 370 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { | 369 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { |
| 371 if (index >= m_ParamCount) { | 370 if (index >= m_ParamCount) { |
| 372 return nullptr; | 371 return nullptr; |
| 373 } | 372 } |
| 374 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 373 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
| 375 if (real_index >= kParamBufSize) { | 374 if (real_index >= kParamBufSize) { |
| 376 real_index -= kParamBufSize; | 375 real_index -= kParamBufSize; |
| 377 } | 376 } |
| 378 ContentParam& param = m_ParamBuf[real_index]; | 377 ContentParam& param = m_ParamBuf[real_index]; |
| 379 if (param.m_Type == ContentParam::NUMBER) { | 378 if (param.m_Type == ContentParam::NUMBER) { |
| 380 CPDF_Number* pNumber = param.m_Number.m_bInteger | |
| 381 ? new CPDF_Number(param.m_Number.m_Integer) | |
| 382 : new CPDF_Number(param.m_Number.m_Float); | |
| 383 | |
| 384 param.m_Type = ContentParam::OBJECT; | 379 param.m_Type = ContentParam::OBJECT; |
| 385 param.m_pObject = pNumber; | 380 param.m_pObject = |
| 386 return pNumber; | 381 param.m_Number.m_bInteger |
| 382 ? pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Integer) |
| 383 : pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Float); |
| 384 return param.m_pObject.get(); |
| 387 } | 385 } |
| 388 if (param.m_Type == ContentParam::NAME) { | 386 if (param.m_Type == ContentParam::NAME) { |
| 389 CPDF_Name* pName = new CPDF_Name( | 387 param.m_Type = ContentParam::OBJECT; |
| 388 param.m_pObject = pdfium::MakeUnique<CPDF_Name>( |
| 390 m_pDocument->GetByteStringPool(), | 389 m_pDocument->GetByteStringPool(), |
| 391 CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len)); | 390 CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len)); |
| 392 param.m_Type = ContentParam::OBJECT; | 391 return param.m_pObject.get(); |
| 393 param.m_pObject = pName; | |
| 394 return pName; | |
| 395 } | 392 } |
| 396 if (param.m_Type == ContentParam::OBJECT) { | 393 if (param.m_Type == ContentParam::OBJECT) |
| 397 return param.m_pObject; | 394 return param.m_pObject.get(); |
| 398 } | 395 |
| 399 ASSERT(false); | 396 ASSERT(false); |
| 400 return nullptr; | 397 return nullptr; |
| 401 } | 398 } |
| 402 | 399 |
| 403 CFX_ByteString CPDF_StreamContentParser::GetString(uint32_t index) { | 400 CFX_ByteString CPDF_StreamContentParser::GetString(uint32_t index) { |
| 404 if (index >= m_ParamCount) { | 401 if (index >= m_ParamCount) { |
| 405 return CFX_ByteString(); | 402 return CFX_ByteString(); |
| 406 } | 403 } |
| 407 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 404 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
| 408 if (real_index >= kParamBufSize) { | 405 if (real_index >= kParamBufSize) { |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 m_pSyntax->SetPos(savePos); | 641 m_pSyntax->SetPos(savePos); |
| 645 delete pDict; | 642 delete pDict; |
| 646 return; | 643 return; |
| 647 } | 644 } |
| 648 } | 645 } |
| 649 if (type != CPDF_StreamParser::Name) { | 646 if (type != CPDF_StreamParser::Name) { |
| 650 break; | 647 break; |
| 651 } | 648 } |
| 652 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, | 649 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, |
| 653 m_pSyntax->GetWordSize() - 1); | 650 m_pSyntax->GetWordSize() - 1); |
| 654 auto pObj = pdfium::WrapUnique(m_pSyntax->ReadNextObject(false, 0)); | 651 auto pObj = m_pSyntax->ReadNextObject(false, 0); |
| 655 if (!key.IsEmpty()) { | 652 if (!key.IsEmpty()) { |
| 656 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; | 653 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; |
| 657 if (dwObjNum) | 654 if (dwObjNum) |
| 658 pDict->SetNewFor<CPDF_Reference>(key, m_pDocument, dwObjNum); | 655 pDict->SetNewFor<CPDF_Reference>(key, m_pDocument, dwObjNum); |
| 659 else | 656 else |
| 660 pDict->SetFor(key, std::move(pObj)); | 657 pDict->SetFor(key, std::move(pObj)); |
| 661 } | 658 } |
| 662 } | 659 } |
| 663 ReplaceAbbr(pDict); | 660 ReplaceAbbr(pDict); |
| 664 CPDF_Object* pCSObj = nullptr; | 661 CPDF_Object* pCSObj = nullptr; |
| (...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1661 } | 1658 } |
| 1662 default: | 1659 default: |
| 1663 bProcessed = false; | 1660 bProcessed = false; |
| 1664 } | 1661 } |
| 1665 if (!bProcessed) { | 1662 if (!bProcessed) { |
| 1666 m_pSyntax->SetPos(last_pos); | 1663 m_pSyntax->SetPos(last_pos); |
| 1667 return; | 1664 return; |
| 1668 } | 1665 } |
| 1669 } | 1666 } |
| 1670 } | 1667 } |
| 1668 |
| 1669 CPDF_StreamContentParser::ContentParam::ContentParam() {} |
| 1670 |
| 1671 CPDF_StreamContentParser::ContentParam::~ContentParam() {} |
| OLD | NEW |