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

Side by Side Diff: core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp

Issue 1544963002: Clean up misc nits found while fixing bugs. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: rebase Created 4 years, 11 months 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 | « no previous file | core/src/fpdfapi/fpdf_page/fpdf_page_parser.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 "editint.h" 7 #include "core/src/fpdfapi/fpdf_edit/editint.h"
8 8
9 #include "core/include/fxcrt/fx_ext.h" 9 #include "core/include/fxcrt/fx_ext.h"
10 #include "core/include/fpdfapi/fpdf_serial.h" 10 #include "core/include/fpdfapi/fpdf_serial.h"
11 #include "core/include/fpdfapi/fpdf_parser.h" 11 #include "core/include/fpdfapi/fpdf_parser.h"
12 12
13 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) 13 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024)
14 #define PDF_XREFSTREAM_MAXSIZE 10000 14 #define PDF_XREFSTREAM_MAXSIZE 10000
15 15
16 namespace {
17
16 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, 18 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj,
17 CFX_FileBufferArchive* pFile, 19 CFX_FileBufferArchive* pFile,
18 FX_FILESIZE& offset) { 20 FX_FILESIZE& offset) {
19 int32_t len = 0; 21 int32_t len = 0;
20 if (!pObj) { 22 if (!pObj) {
21 if (pFile->AppendString(" null") < 0) { 23 if (pFile->AppendString(" null") < 0) {
22 return -1; 24 return -1;
23 } 25 }
24 offset += 5; 26 offset += 5;
25 return 1; 27 return 1;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 164 }
163 offset += len; 165 offset += len;
164 break; 166 break;
165 } 167 }
166 default: 168 default:
167 ASSERT(FALSE); 169 ASSERT(FALSE);
168 break; 170 break;
169 } 171 }
170 return 1; 172 return 1;
171 } 173 }
174
172 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, 175 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument,
173 CFX_FileBufferArchive* pFile, 176 CFX_FileBufferArchive* pFile,
174 CPDF_Array* pIDArray, 177 CPDF_Array* pIDArray,
175 FX_BOOL bCompress) { 178 FX_BOOL bCompress) {
176 FX_FILESIZE offset = 0; 179 FX_FILESIZE offset = 0;
177 int32_t len = 0; 180 int32_t len = 0;
178 FXSYS_assert(pDocument && pFile); 181 FXSYS_assert(pDocument && pFile);
179 CPDF_Parser* pParser = (CPDF_Parser*)pDocument->GetParser(); 182 CPDF_Parser* pParser = (CPDF_Parser*)pDocument->GetParser();
180 if (pParser) { 183 if (pParser) {
181 CPDF_Dictionary* p = pParser->GetTrailer(); 184 CPDF_Dictionary* p = pParser->GetTrailer();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 if (pFile->AppendString(("/ID")) < 0) { 255 if (pFile->AppendString(("/ID")) < 0) {
253 return -1; 256 return -1;
254 } 257 }
255 offset += 3; 258 offset += 3;
256 if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) { 259 if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
257 return -1; 260 return -1;
258 } 261 }
259 } 262 }
260 return offset; 263 return offset;
261 } 264 }
265
262 int32_t PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, 266 int32_t PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict,
263 FX_DWORD dwObjNum, 267 FX_DWORD dwObjNum,
264 CFX_FileBufferArchive* pFile) { 268 CFX_FileBufferArchive* pFile) {
265 if (!pEncryptDict) { 269 if (!pEncryptDict) {
266 return 0; 270 return 0;
267 } 271 }
268 FXSYS_assert(pFile); 272 FXSYS_assert(pFile);
269 FX_FILESIZE offset = 0; 273 FX_FILESIZE offset = 0;
270 int32_t len = 0; 274 int32_t len = 0;
271 if (pFile->AppendString("/Encrypt") < 0) { 275 if (pFile->AppendString("/Encrypt") < 0) {
272 return -1; 276 return -1;
273 } 277 }
274 offset += 8; 278 offset += 8;
275 if (pFile->AppendString(" ") < 0) { 279 if (pFile->AppendString(" ") < 0) {
276 return -1; 280 return -1;
277 } 281 }
278 if ((len = pFile->AppendDWord(dwObjNum)) < 0) { 282 if ((len = pFile->AppendDWord(dwObjNum)) < 0) {
279 return -1; 283 return -1;
280 } 284 }
281 if (pFile->AppendString(" 0 R ") < 0) { 285 if (pFile->AppendString(" 0 R ") < 0) {
282 return -1; 286 return -1;
283 } 287 }
284 offset += len + 6; 288 offset += len + 6;
285 return offset; 289 return offset;
286 } 290 }
287 FX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, 291
288 FX_DWORD dwSeed2, 292 std::vector<uint8_t> PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2) {
289 FX_DWORD* pBuffer) { 293 std::vector<uint8_t> buffer(sizeof(FX_DWORD) * 4);
290 if (!pBuffer) { 294 FX_DWORD* pBuffer = reinterpret_cast<FX_DWORD*>(buffer.data());
291 return FALSE;
292 }
293 void* pContext = FX_Random_MT_Start(dwSeed1); 295 void* pContext = FX_Random_MT_Start(dwSeed1);
294 int32_t i = 0; 296 for (int i = 0; i < 2; ++i)
295 for (i = 0; i < 2; i++) {
296 *pBuffer++ = FX_Random_MT_Generate(pContext); 297 *pBuffer++ = FX_Random_MT_Generate(pContext);
297 }
298 FX_Random_MT_Close(pContext); 298 FX_Random_MT_Close(pContext);
299 pContext = FX_Random_MT_Start(dwSeed2); 299 pContext = FX_Random_MT_Start(dwSeed2);
300 for (i = 0; i < 2; i++) { 300 for (int i = 0; i < 2; ++i)
301 *pBuffer++ = FX_Random_MT_Generate(pContext); 301 *pBuffer++ = FX_Random_MT_Generate(pContext);
302 FX_Random_MT_Close(pContext);
303 return buffer;
304 }
305
306 void AppendIndex0(CFX_ByteTextBuf& buffer, bool bFirstObject) {
307 buffer.AppendByte(0);
308 buffer.AppendByte(0);
309 buffer.AppendByte(0);
310 buffer.AppendByte(0);
311 buffer.AppendByte(0);
312 const uint8_t byte = bFirstObject ? 0xFF : 0;
313 buffer.AppendByte(byte);
314 buffer.AppendByte(byte);
315 }
316
317 void AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset) {
318 buffer.AppendByte(1);
319 buffer.AppendByte(FX_GETBYTEOFFSET24(offset));
320 buffer.AppendByte(FX_GETBYTEOFFSET16(offset));
321 buffer.AppendByte(FX_GETBYTEOFFSET8(offset));
322 buffer.AppendByte(FX_GETBYTEOFFSET0(offset));
323 buffer.AppendByte(0);
324 buffer.AppendByte(0);
325 }
326
327 void AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, int32_t index) {
328 buffer.AppendByte(2);
329 buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));
330 buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));
331 buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));
332 buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));
333 buffer.AppendByte(FX_GETBYTEOFFSET8(index));
334 buffer.AppendByte(FX_GETBYTEOFFSET0(index));
335 }
336
337 bool IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag) {
338 if (!(flag & FPDFCREATE_INCREMENTAL))
339 return false;
340
341 int32_t iSize = pXRef->m_IndexArray.GetSize() / 2;
342 int32_t iCount = 0;
343 for (int32_t i = 0; i < iSize; ++i)
344 iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);
345 return iCount >= PDF_XREFSTREAM_MAXSIZE;
346 }
347
348 int32_t OutputIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) {
349 if (sizeof(offset) > 4) {
350 if (FX_GETBYTEOFFSET32(offset)) {
351 if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0)
352 return -1;
353 if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0)
354 return -1;
355 if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0)
356 return -1;
357 if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0)
358 return -1;
359 }
302 } 360 }
303 FX_Random_MT_Close(pContext); 361 if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0)
304 return TRUE; 362 return -1;
363 if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0)
364 return -1;
365 if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0)
366 return -1;
367 if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0)
368 return -1;
369 if (pFile->AppendByte(0) < 0)
370 return -1;
371 return 0;
305 } 372 }
373
306 class CPDF_FlateEncoder { 374 class CPDF_FlateEncoder {
307 public: 375 public:
308 CPDF_FlateEncoder(); 376 CPDF_FlateEncoder();
309 ~CPDF_FlateEncoder(); 377 ~CPDF_FlateEncoder();
310 FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode); 378 FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
311 FX_BOOL Initialize(const uint8_t* pBuffer, 379 FX_BOOL Initialize(const uint8_t* pBuffer,
312 FX_DWORD size, 380 FX_DWORD size,
313 FX_BOOL bFlateEncode, 381 FX_BOOL bFlateEncode,
314 FX_BOOL bXRefStream = FALSE); 382 FX_BOOL bXRefStream = FALSE);
315 void CloneDict(); 383 void CloneDict();
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 m_pData = FX_Alloc(uint8_t, m_dwSize); 494 m_pData = FX_Alloc(uint8_t, m_dwSize);
427 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); 495 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);
428 m_bNewBuf = TRUE; 496 m_bNewBuf = TRUE;
429 return TRUE; 497 return TRUE;
430 } 498 }
431 CPDF_Encryptor::~CPDF_Encryptor() { 499 CPDF_Encryptor::~CPDF_Encryptor() {
432 if (m_bNewBuf) { 500 if (m_bNewBuf) {
433 FX_Free(m_pData); 501 FX_Free(m_pData);
434 } 502 }
435 } 503 }
504
505 } // namespace
506
436 CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {} 507 CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {}
437 FX_BOOL CPDF_ObjectStream::Start() { 508 FX_BOOL CPDF_ObjectStream::Start() {
438 m_ObjNumArray.RemoveAll(); 509 m_ObjNumArray.RemoveAll();
439 m_OffsetArray.RemoveAll(); 510 m_OffsetArray.RemoveAll();
440 m_Buffer.Clear(); 511 m_Buffer.Clear();
441 m_dwObjNum = 0; 512 m_dwObjNum = 0;
442 m_index = 0; 513 m_index = 0;
443 return TRUE; 514 return TRUE;
444 } 515 }
445 int32_t CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, 516 int32_t CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum,
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 if (!pCreator) { 646 if (!pCreator) {
576 return 0; 647 return 0;
577 } 648 }
578 m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize); 649 m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
579 if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize && 650 if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
580 m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { 651 m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
581 return 1; 652 return 1;
582 } 653 }
583 return EndObjectStream(pCreator); 654 return EndObjectStream(pCreator);
584 } 655 }
585 static void _AppendIndex0(CFX_ByteTextBuf& buffer, 656
586 FX_BOOL bFirstObject = TRUE) {
587 buffer.AppendByte(0);
588 buffer.AppendByte(0);
589 buffer.AppendByte(0);
590 buffer.AppendByte(0);
591 buffer.AppendByte(0);
592 if (bFirstObject) {
593 buffer.AppendByte(0xFF);
594 buffer.AppendByte(0xFF);
595 } else {
596 buffer.AppendByte(0);
597 buffer.AppendByte(0);
598 }
599 }
600 static void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset) {
601 buffer.AppendByte(1);
602 buffer.AppendByte(FX_GETBYTEOFFSET24(offset));
603 buffer.AppendByte(FX_GETBYTEOFFSET16(offset));
604 buffer.AppendByte(FX_GETBYTEOFFSET8(offset));
605 buffer.AppendByte(FX_GETBYTEOFFSET0(offset));
606 buffer.AppendByte(0);
607 buffer.AppendByte(0);
608 }
609 static void _AppendIndex2(CFX_ByteTextBuf& buffer,
610 FX_DWORD objnum,
611 int32_t index) {
612 buffer.AppendByte(2);
613 buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));
614 buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));
615 buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));
616 buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));
617 buffer.AppendByte(FX_GETBYTEOFFSET8(index));
618 buffer.AppendByte(FX_GETBYTEOFFSET0(index));
619 }
620 int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, FX_BOOL bEOF) { 657 int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, FX_BOOL bEOF) {
621 FX_FILESIZE objOffset = 0; 658 FX_FILESIZE objOffset = 0;
622 if (bEOF) { 659 if (bEOF) {
623 objOffset = m_ObjStream.End(pCreator); 660 objOffset = m_ObjStream.End(pCreator);
624 if (objOffset < 0) { 661 if (objOffset < 0) {
625 return -1; 662 return -1;
626 } 663 }
627 } 664 }
628 FX_DWORD& dwObjStmNum = m_ObjStream.m_dwObjNum; 665 FX_DWORD& dwObjStmNum = m_ObjStream.m_dwObjNum;
629 if (!dwObjStmNum) { 666 if (!dwObjStmNum) {
630 dwObjStmNum = ++pCreator->m_dwLastObjNum; 667 dwObjStmNum = ++pCreator->m_dwLastObjNum;
631 } 668 }
632 int32_t iSize = m_ObjStream.m_ObjNumArray.GetSize(); 669 int32_t iSize = m_ObjStream.m_ObjNumArray.GetSize();
633 int32_t iSeg = m_IndexArray.GetSize() / 2; 670 int32_t iSeg = m_IndexArray.GetSize() / 2;
634 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { 671 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
635 if (m_dwTempObjNum == 0) { 672 if (m_dwTempObjNum == 0) {
636 _AppendIndex0(m_Buffer); 673 AppendIndex0(m_Buffer, true);
637 m_dwTempObjNum++; 674 m_dwTempObjNum++;
638 } 675 }
639 FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + 676 FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) +
640 m_IndexArray.GetAt((iSeg - 1) * 2 + 1); 677 m_IndexArray.GetAt((iSeg - 1) * 2 + 1);
641 int index = 0; 678 int index = 0;
642 for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) { 679 for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
643 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); 680 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
644 if (offset) { 681 if (offset) {
645 if (index >= iSize || 682 if (index >= iSize ||
646 m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) { 683 m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {
647 _AppendIndex1(m_Buffer, *offset); 684 AppendIndex1(m_Buffer, *offset);
648 } else { 685 } else {
649 _AppendIndex2(m_Buffer, dwObjStmNum, index++); 686 AppendIndex2(m_Buffer, dwObjStmNum, index++);
650 } 687 }
651 } else { 688 } else {
652 _AppendIndex0(m_Buffer, FALSE); 689 AppendIndex0(m_Buffer, false);
653 } 690 }
654 } 691 }
655 if (iSize > 0 && bEOF) { 692 if (iSize > 0 && bEOF) {
656 pCreator->m_ObjectOffset.Add(dwObjStmNum, 1); 693 pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);
657 pCreator->m_ObjectOffset[dwObjStmNum] = objOffset; 694 pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;
658 } 695 }
659 m_iSeg = iSeg; 696 m_iSeg = iSeg;
660 if (bEOF) { 697 if (bEOF) {
661 m_ObjStream.Start(); 698 m_ObjStream.Start();
662 } 699 }
663 return 1; 700 return 1;
664 } 701 }
665 int32_t& j = m_ObjStream.m_index; 702 int32_t& j = m_ObjStream.m_index;
666 for (int i = m_iSeg; i < iSeg; i++) { 703 for (int i = m_iSeg; i < iSeg; i++) {
667 FX_DWORD start = m_IndexArray.ElementAt(i * 2); 704 FX_DWORD start = m_IndexArray.ElementAt(i * 2);
668 FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start; 705 FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
669 for (FX_DWORD m = start; m < end; m++) { 706 for (FX_DWORD m = start; m < end; m++) {
670 if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) { 707 if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {
671 _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]); 708 AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);
672 } else { 709 } else {
673 _AppendIndex2(m_Buffer, dwObjStmNum, j++); 710 AppendIndex2(m_Buffer, dwObjStmNum, j++);
674 } 711 }
675 } 712 }
676 } 713 }
677 if (iSize > 0 && bEOF) { 714 if (iSize > 0 && bEOF) {
678 _AppendIndex1(m_Buffer, objOffset); 715 AppendIndex1(m_Buffer, objOffset);
679 m_IndexArray.Add(dwObjStmNum); 716 m_IndexArray.Add(dwObjStmNum);
680 m_IndexArray.Add(1); 717 m_IndexArray.Add(1);
681 iSeg += 1; 718 iSeg += 1;
682 } 719 }
683 m_iSeg = iSeg; 720 m_iSeg = iSeg;
684 if (bEOF) { 721 if (bEOF) {
685 m_ObjStream.Start(); 722 m_ObjStream.Start();
686 } 723 }
687 return 1; 724 return 1;
688 } 725 }
689 FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, 726 FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator,
690 FX_BOOL bEOF) { 727 FX_BOOL bEOF) {
691 FX_FILESIZE offset_tmp = pCreator->m_Offset; 728 FX_FILESIZE offset_tmp = pCreator->m_Offset;
692 FX_DWORD objnum = ++pCreator->m_dwLastObjNum; 729 FX_DWORD objnum = ++pCreator->m_dwLastObjNum;
693 CFX_FileBufferArchive* pFile = &pCreator->m_File; 730 CFX_FileBufferArchive* pFile = &pCreator->m_File;
694 FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; 731 FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
695 if (bIncremental) { 732 if (bIncremental) {
696 AddObjectNumberToIndexArray(objnum); 733 AddObjectNumberToIndexArray(objnum);
697 } else { 734 } else {
698 for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) { 735 for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {
699 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); 736 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
700 if (offset) { 737 if (offset) {
701 _AppendIndex1(m_Buffer, *offset); 738 AppendIndex1(m_Buffer, *offset);
702 } else { 739 } else {
703 _AppendIndex0(m_Buffer, FALSE); 740 AppendIndex0(m_Buffer, false);
704 } 741 }
705 } 742 }
706 } 743 }
707 _AppendIndex1(m_Buffer, offset_tmp); 744 AppendIndex1(m_Buffer, offset_tmp);
708 FX_FILESIZE& offset = pCreator->m_Offset; 745 FX_FILESIZE& offset = pCreator->m_Offset;
709 int32_t len = pFile->AppendDWord(objnum); 746 int32_t len = pFile->AppendDWord(objnum);
710 if (len < 0) { 747 if (len < 0) {
711 return FALSE; 748 return FALSE;
712 } 749 }
713 offset += len; 750 offset += len;
714 if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) < 751 if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) <
715 0) { 752 0) {
716 return FALSE; 753 return FALSE;
717 } 754 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 return TRUE; 862 return TRUE;
826 } 863 }
827 FX_BOOL CPDF_XRefStream::End(CPDF_Creator* pCreator, FX_BOOL bEOF) { 864 FX_BOOL CPDF_XRefStream::End(CPDF_Creator* pCreator, FX_BOOL bEOF) {
828 if (EndObjectStream(pCreator, bEOF) < 0) { 865 if (EndObjectStream(pCreator, bEOF) < 0) {
829 return FALSE; 866 return FALSE;
830 } 867 }
831 return GenerateXRefStream(pCreator, bEOF); 868 return GenerateXRefStream(pCreator, bEOF);
832 } 869 }
833 FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { 870 FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) {
834 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { 871 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
835 _AppendIndex0(m_Buffer); 872 AppendIndex0(m_Buffer, true);
836 for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) { 873 for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {
837 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i); 874 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);
838 if (offset) { 875 if (offset) {
839 _AppendIndex1(m_Buffer, *offset); 876 AppendIndex1(m_Buffer, *offset);
840 } else { 877 } else {
841 _AppendIndex0(m_Buffer, FALSE); 878 AppendIndex0(m_Buffer, false);
842 } 879 }
843 } 880 }
844 } else { 881 } else {
845 int32_t iSeg = m_IndexArray.GetSize() / 2; 882 int32_t iSeg = m_IndexArray.GetSize() / 2;
846 for (int i = 0; i < iSeg; i++) { 883 for (int i = 0; i < iSeg; i++) {
847 FX_DWORD start = m_IndexArray.ElementAt(i * 2); 884 FX_DWORD start = m_IndexArray.ElementAt(i * 2);
848 FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start; 885 FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
849 for (FX_DWORD j = start; j < end; j++) { 886 for (FX_DWORD j = start; j < end; j++) {
850 _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); 887 AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);
851 } 888 }
852 } 889 }
853 } 890 }
854 return GenerateXRefStream(pCreator, FALSE); 891 return GenerateXRefStream(pCreator, FALSE);
855 } 892 }
856 FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum) { 893 FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum) {
857 int32_t iSize = m_IndexArray.GetSize(); 894 int32_t iSize = m_IndexArray.GetSize();
858 if (iSize == 0) { 895 if (iSize == 0) {
859 m_IndexArray.Add(objnum); 896 m_IndexArray.Add(objnum);
860 m_IndexArray.Add(1); 897 m_IndexArray.Add(1);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 m_bNewCrypto = FALSE; 938 m_bNewCrypto = FALSE;
902 } 939 }
903 CPDF_Creator::~CPDF_Creator() { 940 CPDF_Creator::~CPDF_Creator() {
904 ResetStandardSecurity(); 941 ResetStandardSecurity();
905 if (m_bEncryptCloned && m_pEncryptDict) { 942 if (m_bEncryptCloned && m_pEncryptDict) {
906 m_pEncryptDict->Release(); 943 m_pEncryptDict->Release();
907 m_pEncryptDict = NULL; 944 m_pEncryptDict = NULL;
908 } 945 }
909 Clear(); 946 Clear();
910 } 947 }
911 static FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag) { 948
912 if (!(flag & FPDFCREATE_INCREMENTAL)) {
913 return FALSE;
914 }
915 int32_t iSize = pXRef->m_IndexArray.GetSize() / 2;
916 int32_t iCount = 0;
917 for (int32_t i = 0; i < iSize; i++) {
918 iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);
919 }
920 return (iCount >= PDF_XREFSTREAM_MAXSIZE);
921 }
922 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { 949 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) {
923 if (!m_pXRefStream) 950 if (!m_pXRefStream)
924 return 1; 951 return 1;
925 952
926 FX_DWORD objnum = pObj->GetObjNum(); 953 FX_DWORD objnum = pObj->GetObjNum();
927 if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (int32_t)objnum && 954 if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (int32_t)objnum &&
928 m_pParser->m_ObjVersion[objnum] > 0) { 955 m_pParser->m_ObjVersion[objnum] > 0) {
929 return 1; 956 return 1;
930 } 957 }
931 958
932 if (pObj->IsNumber()) 959 if (pObj->IsNumber())
933 return 1; 960 return 1;
934 961
935 CPDF_Dictionary* pDict = pObj->GetDict(); 962 CPDF_Dictionary* pDict = pObj->GetDict();
936 if (pObj->IsStream()) 963 if (pObj->IsStream()) {
937 if (pDict && pDict->GetString("Type") == "XRef") 964 if (pDict && pDict->GetString("Type") == "XRef")
938 return 0; 965 return 0;
939 return 1; 966 return 1;
967 }
940 968
941 if (pDict) { 969 if (pDict) {
942 if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) 970 if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict)
943 return 1; 971 return 1;
944 if (IsSignatureDict(pDict)) 972 if (IsSignatureDict(pDict))
945 return 1; 973 return 1;
946 if (pDict->GetString("Type") == "Page") 974 if (pDict->GetString("Type") == "Page")
947 return 1; 975 return 1;
948 } 976 }
949 977
950 m_pXRefStream->AddObjectNumberToIndexArray(objnum); 978 m_pXRefStream->AddObjectNumberToIndexArray(objnum);
951 if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) 979 if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0)
952 return -1; 980 return -1;
953 if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) 981 if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags))
954 return 0; 982 return 0;
955 if (!m_pXRefStream->End(this)) 983 if (!m_pXRefStream->End(this))
956 return -1; 984 return -1;
957 if (!m_pXRefStream->Start()) 985 if (!m_pXRefStream->Start())
958 return -1; 986 return -1;
959 return 0; 987 return 0;
960 } 988 }
961 int32_t CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, 989 int32_t CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum,
962 const uint8_t* pBuffer, 990 const uint8_t* pBuffer,
963 FX_DWORD dwSize) { 991 FX_DWORD dwSize) {
964 if (!m_pXRefStream) { 992 if (!m_pXRefStream) {
965 return 1; 993 return 1;
966 } 994 }
967 m_pXRefStream->AddObjectNumberToIndexArray(objnum); 995 m_pXRefStream->AddObjectNumberToIndexArray(objnum);
968 int32_t iRet = 996 int32_t iRet =
969 m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this); 997 m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);
970 if (iRet < 1) { 998 if (iRet < 1) {
971 return iRet; 999 return iRet;
972 } 1000 }
973 if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) { 1001 if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
974 return 0; 1002 return 0;
975 } 1003 }
976 if (!m_pXRefStream->End(this)) { 1004 if (!m_pXRefStream->End(this)) {
977 return -1; 1005 return -1;
978 } 1006 }
979 if (!m_pXRefStream->Start()) { 1007 if (!m_pXRefStream->Start()) {
980 return -1; 1008 return -1;
981 } 1009 }
982 return 0; 1010 return 0;
983 } 1011 }
984 int32_t CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum) { 1012 int32_t CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum) {
985 if (!m_pXRefStream) { 1013 if (!m_pXRefStream) {
986 return 1; 1014 return 1;
987 } 1015 }
988 m_pXRefStream->AddObjectNumberToIndexArray(objnum); 1016 m_pXRefStream->AddObjectNumberToIndexArray(objnum);
989 if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) { 1017 if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
990 return 0; 1018 return 0;
991 } 1019 }
992 if (!m_pXRefStream->End(this)) { 1020 if (!m_pXRefStream->End(this)) {
993 return -1; 1021 return -1;
994 } 1022 }
995 if (!m_pXRefStream->Start()) { 1023 if (!m_pXRefStream->Start()) {
996 return -1; 1024 return -1;
997 } 1025 }
998 return 0; 1026 return 0;
999 } 1027 }
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
1716 } 1744 }
1717 if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) { 1745 if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {
1718 m_Pos = (void*)(uintptr_t)i; 1746 m_Pos = (void*)(uintptr_t)i;
1719 return 1; 1747 return 1;
1720 } 1748 }
1721 } 1749 }
1722 m_iStage = 90; 1750 m_iStage = 90;
1723 } 1751 }
1724 return m_iStage; 1752 return m_iStage;
1725 } 1753 }
1726 static int32_t _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) { 1754
1727 FXSYS_assert(pFile);
1728 if (sizeof(offset) > 4) {
1729 if (FX_GETBYTEOFFSET32(offset)) {
1730 if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {
1731 return -1;
1732 }
1733 if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {
1734 return -1;
1735 }
1736 if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {
1737 return -1;
1738 }
1739 if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {
1740 return -1;
1741 }
1742 }
1743 }
1744 if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {
1745 return -1;
1746 }
1747 if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {
1748 return -1;
1749 }
1750 if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {
1751 return -1;
1752 }
1753 if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {
1754 return -1;
1755 }
1756 if (pFile->AppendByte(0) < 0) {
1757 return -1;
1758 }
1759 return 0;
1760 }
1761 int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { 1755 int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) {
1762 FXSYS_assert(m_iStage >= 90); 1756 FXSYS_assert(m_iStage >= 90);
1763 if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) { 1757 if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {
1764 FX_BOOL bXRefStream = 1758 FX_BOOL bXRefStream =
1765 (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream(); 1759 (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();
1766 if (!bXRefStream) { 1760 if (!bXRefStream) {
1767 if (m_File.AppendString("trailer\r\n<<") < 0) { 1761 if (m_File.AppendString("trailer\r\n<<") < 0) {
1768 return -1; 1762 return -1;
1769 } 1763 }
1770 } else { 1764 } else {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1907 return -1; 1901 return -1;
1908 } 1902 }
1909 if (m_File.AppendString(">>stream\r\n") < 0) { 1903 if (m_File.AppendString(">>stream\r\n") < 0) {
1910 return -1; 1904 return -1;
1911 } 1905 }
1912 for (i = 0; i < m_dwLastObjNum; i++) { 1906 for (i = 0; i < m_dwLastObjNum; i++) {
1913 FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i); 1907 FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);
1914 if (!offset) { 1908 if (!offset) {
1915 continue; 1909 continue;
1916 } 1910 }
1917 _OutPutIndex(&m_File, *offset); 1911 OutputIndex(&m_File, *offset);
1918 } 1912 }
1919 } else { 1913 } else {
1920 int count = m_NewObjNumArray.GetSize(); 1914 int count = m_NewObjNumArray.GetSize();
1921 int32_t i = 0; 1915 int32_t i = 0;
1922 for (i = 0; i < count; i++) { 1916 for (i = 0; i < count; i++) {
1923 FX_DWORD objnum = m_NewObjNumArray.ElementAt(i); 1917 FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
1924 if (m_File.AppendDWord(objnum) < 0) { 1918 if (m_File.AppendDWord(objnum) < 0) {
1925 return -1; 1919 return -1;
1926 } 1920 }
1927 if (m_File.AppendString(" 1 ") < 0) { 1921 if (m_File.AppendString(" 1 ") < 0) {
1928 return -1; 1922 return -1;
1929 } 1923 }
1930 } 1924 }
1931 if (m_File.AppendString("]/Length ") < 0) { 1925 if (m_File.AppendString("]/Length ") < 0) {
1932 return -1; 1926 return -1;
1933 } 1927 }
1934 if (m_File.AppendDWord(count * 5) < 0) { 1928 if (m_File.AppendDWord(count * 5) < 0) {
1935 return -1; 1929 return -1;
1936 } 1930 }
1937 if (m_File.AppendString(">>stream\r\n") < 0) { 1931 if (m_File.AppendString(">>stream\r\n") < 0) {
1938 return -1; 1932 return -1;
1939 } 1933 }
1940 for (i = 0; i < count; i++) { 1934 for (i = 0; i < count; i++) {
1941 FX_DWORD objnum = m_NewObjNumArray.ElementAt(i); 1935 FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
1942 FX_FILESIZE offset = m_ObjectOffset[objnum]; 1936 FX_FILESIZE offset = m_ObjectOffset[objnum];
1943 _OutPutIndex(&m_File, offset); 1937 OutputIndex(&m_File, offset);
1944 } 1938 }
1945 } 1939 }
1946 if (m_File.AppendString("\r\nendstream") < 0) { 1940 if (m_File.AppendString("\r\nendstream") < 0) {
1947 return -1; 1941 return -1;
1948 } 1942 }
1949 } 1943 }
1950 } 1944 }
1951 if (m_File.AppendString("\r\nstartxref\r\n") < 0) { 1945 if (m_File.AppendString("\r\nstartxref\r\n") < 0) {
1952 return -1; 1946 return -1;
1953 } 1947 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 InitID(); 1986 InitID();
1993 if (flags & FPDFCREATE_PROGRESSIVE) { 1987 if (flags & FPDFCREATE_PROGRESSIVE) {
1994 return TRUE; 1988 return TRUE;
1995 } 1989 }
1996 return Continue(NULL) > -1; 1990 return Continue(NULL) > -1;
1997 } 1991 }
1998 void CPDF_Creator::InitID(FX_BOOL bDefault) { 1992 void CPDF_Creator::InitID(FX_BOOL bDefault) {
1999 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL; 1993 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;
2000 FX_BOOL bNewId = !m_pIDArray; 1994 FX_BOOL bNewId = !m_pIDArray;
2001 if (!m_pIDArray) { 1995 if (!m_pIDArray) {
2002 FX_DWORD* pBuffer = NULL;
2003 m_pIDArray = new CPDF_Array; 1996 m_pIDArray = new CPDF_Array;
2004 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetElement(0) : NULL; 1997 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetElement(0) : NULL;
2005 if (pID1) { 1998 if (pID1) {
2006 m_pIDArray->Add(pID1->Clone()); 1999 m_pIDArray->Add(pID1->Clone());
2007 } else { 2000 } else {
2008 pBuffer = FX_Alloc(FX_DWORD, 4); 2001 std::vector<uint8_t> buffer =
2009 PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum, pBuffer); 2002 PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum);
2010 CFX_ByteStringC bsBuffer((const uint8_t*)pBuffer, 4 * sizeof(FX_DWORD)); 2003 CFX_ByteStringC bsBuffer(buffer.data(), buffer.size());
2011 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument); 2004 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument);
2012 } 2005 }
2013 FX_Free(pBuffer);
2014 } 2006 }
2015 if (!bDefault) { 2007 if (!bDefault) {
2016 return; 2008 return;
2017 } 2009 }
2018 if (pOldIDArray) { 2010 if (pOldIDArray) {
2019 CPDF_Object* pID2 = pOldIDArray->GetElement(1); 2011 CPDF_Object* pID2 = pOldIDArray->GetElement(1);
2020 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) { 2012 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
2021 m_pIDArray->Add(pID2->Clone()); 2013 m_pIDArray->Add(pID2->Clone());
2022 return; 2014 return;
2023 } 2015 }
2024 FX_DWORD* pBuffer = FX_Alloc(FX_DWORD, 4); 2016 std::vector<uint8_t> buffer =
2025 PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum, pBuffer); 2017 PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum);
2026 CFX_ByteStringC bsBuffer((const uint8_t*)pBuffer, 4 * sizeof(FX_DWORD)); 2018 CFX_ByteStringC bsBuffer(buffer.data(), buffer.size());
2027 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument); 2019 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument);
2028 FX_Free(pBuffer);
2029 return; 2020 return;
2030 } 2021 }
2031 m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone()); 2022 m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());
2032 if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) { 2023 if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
2033 if (m_pEncryptDict->GetString("Filter") == "Standard") { 2024 if (m_pEncryptDict->GetString("Filter") == "Standard") {
2034 CPDF_StandardSecurityHandler handler; 2025 CPDF_StandardSecurityHandler handler;
2035 CFX_ByteString user_pass = m_pParser->GetPassword(); 2026 CFX_ByteString user_pass = m_pParser->GetPassword();
2036 FX_DWORD flag = PDF_ENCRYPT_CONTENT; 2027 FX_DWORD flag = PDF_ENCRYPT_CONTENT;
2037 handler.OnCreate(m_pEncryptDict, m_pIDArray, (const uint8_t*)user_pass, 2028 handler.OnCreate(m_pEncryptDict, m_pIDArray, (const uint8_t*)user_pass,
2038 user_pass.GetLength(), flag); 2029 user_pass.GetLength(), flag);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 m_bNewCrypto = FALSE; 2084 m_bNewCrypto = FALSE;
2094 if (!m_bStandardSecurity) { 2085 if (!m_bStandardSecurity) {
2095 return; 2086 return;
2096 } 2087 }
2097 if (m_pEncryptDict) { 2088 if (m_pEncryptDict) {
2098 m_pEncryptDict->Release(); 2089 m_pEncryptDict->Release();
2099 m_pEncryptDict = NULL; 2090 m_pEncryptDict = NULL;
2100 } 2091 }
2101 m_bStandardSecurity = FALSE; 2092 m_bStandardSecurity = FALSE;
2102 } 2093 }
OLDNEW
« no previous file with comments | « no previous file | core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698