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

Side by Side Diff: fpdfsdk/fpdf_flatten.cpp

Issue 2345063002: Use string pools in some dictionaries (Closed)
Patch Set: windows compile Created 4 years, 2 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 | « fpdfsdk/formfiller/cba_fontmap.cpp ('k') | fpdfsdk/fpdf_transformpage.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 "public/fpdf_flatten.h" 7 #include "public/fpdf_flatten.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 CPDF_Dictionary* pPage, 186 CPDF_Dictionary* pPage,
187 CPDF_Document* pDocument) { 187 CPDF_Document* pDocument) {
188 CPDF_Object* pContentsObj = pPage->GetStreamFor("Contents"); 188 CPDF_Object* pContentsObj = pPage->GetStreamFor("Contents");
189 if (!pContentsObj) { 189 if (!pContentsObj) {
190 pContentsObj = pPage->GetArrayFor("Contents"); 190 pContentsObj = pPage->GetArrayFor("Contents");
191 } 191 }
192 192
193 if (!pContentsObj) { 193 if (!pContentsObj) {
194 // Create a new contents dictionary 194 // Create a new contents dictionary
195 if (!key.IsEmpty()) { 195 if (!key.IsEmpty()) {
196 CPDF_Stream* pNewContents = 196 CPDF_Stream* pNewContents = new CPDF_Stream(
197 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); 197 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool()));
198 CFX_ByteString sStream; 198 CFX_ByteString sStream;
199 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); 199 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str());
200 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); 200 pNewContents->SetData(sStream.raw_str(), sStream.GetLength());
201 pPage->SetReferenceFor("Contents", pDocument, 201 pPage->SetReferenceFor("Contents", pDocument,
202 pDocument->AddIndirectObject(pNewContents)); 202 pDocument->AddIndirectObject(pNewContents));
203 } 203 }
204 return; 204 return;
205 } 205 }
206 206
207 CPDF_Array* pContentsArray = nullptr; 207 CPDF_Array* pContentsArray = nullptr;
208
209 switch (pContentsObj->GetType()) { 208 switch (pContentsObj->GetType()) {
210 case CPDF_Object::STREAM: { 209 case CPDF_Object::STREAM: {
211 pContentsArray = new CPDF_Array; 210 pContentsArray = new CPDF_Array;
212 CPDF_Stream* pContents = pContentsObj->AsStream(); 211 CPDF_Stream* pContents = pContentsObj->AsStream();
213 uint32_t dwObjNum = pDocument->AddIndirectObject(pContents); 212 uint32_t dwObjNum = pDocument->AddIndirectObject(pContents);
214 CPDF_StreamAcc acc; 213 CPDF_StreamAcc acc;
215 acc.LoadAllData(pContents); 214 acc.LoadAllData(pContents);
216 CFX_ByteString sStream = "q\n"; 215 CFX_ByteString sStream = "q\n";
217 CFX_ByteString sBody = 216 CFX_ByteString sBody =
218 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); 217 CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize());
(...skipping 11 matching lines...) Expand all
230 break; 229 break;
231 } 230 }
232 231
233 if (!pContentsArray) 232 if (!pContentsArray)
234 return; 233 return;
235 234
236 pPage->SetReferenceFor("Contents", pDocument, 235 pPage->SetReferenceFor("Contents", pDocument,
237 pDocument->AddIndirectObject(pContentsArray)); 236 pDocument->AddIndirectObject(pContentsArray));
238 237
239 if (!key.IsEmpty()) { 238 if (!key.IsEmpty()) {
240 CPDF_Stream* pNewContents = 239 CPDF_Stream* pNewContents = new CPDF_Stream(
241 new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); 240 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool()));
242 CFX_ByteString sStream; 241 CFX_ByteString sStream;
243 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); 242 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str());
244 pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); 243 pNewContents->SetData(sStream.raw_str(), sStream.GetLength());
245 pContentsArray->AddReference(pDocument, 244 pContentsArray->AddReference(pDocument,
246 pDocument->AddIndirectObject(pNewContents)); 245 pDocument->AddIndirectObject(pNewContents));
247 } 246 }
248 } 247 }
249 248
250 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, 249 CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot,
251 CFX_FloatRect rcStream, 250 CFX_FloatRect rcStream,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 CPDF_Array* pCropBox = new CPDF_Array(); 362 CPDF_Array* pCropBox = new CPDF_Array();
364 pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); 363 pCropBox->Add(new CPDF_Number(rcOriginalCB.left));
365 pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); 364 pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom));
366 pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); 365 pCropBox->Add(new CPDF_Number(rcOriginalCB.right));
367 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); 366 pCropBox->Add(new CPDF_Number(rcOriginalCB.top));
368 pPageDict->SetFor("ArtBox", pCropBox); 367 pPageDict->SetFor("ArtBox", pCropBox);
369 } 368 }
370 369
371 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); 370 CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources");
372 if (!pRes) { 371 if (!pRes) {
373 pRes = new CPDF_Dictionary; 372 pRes = new CPDF_Dictionary(pDocument->GetByteStringPool());
374 pPageDict->SetFor("Resources", pRes); 373 pPageDict->SetFor("Resources", pRes);
375 } 374 }
376 375
377 CPDF_Stream* pNewXObject = new CPDF_Stream(nullptr, 0, new CPDF_Dictionary); 376 CPDF_Stream* pNewXObject = new CPDF_Stream(
377 nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool()));
378
378 uint32_t dwObjNum = pDocument->AddIndirectObject(pNewXObject); 379 uint32_t dwObjNum = pDocument->AddIndirectObject(pNewXObject);
379 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); 380 CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject");
380 if (!pPageXObject) { 381 if (!pPageXObject) {
381 pPageXObject = new CPDF_Dictionary; 382 pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool());
382 pRes->SetFor("XObject", pPageXObject); 383 pRes->SetFor("XObject", pPageXObject);
383 } 384 }
384 385
385 CFX_ByteString key = ""; 386 CFX_ByteString key = "";
386 int nStreams = ObjectArray.GetSize(); 387 int nStreams = ObjectArray.GetSize();
387 388
388 if (nStreams > 0) { 389 if (nStreams > 0) {
389 for (int iKey = 0; /*iKey < 100*/; iKey++) { 390 for (int iKey = 0; /*iKey < 100*/; iKey++) {
390 char sExtend[5] = {}; 391 char sExtend[5] = {};
391 FXSYS_itoa(iKey, sExtend, 10); 392 FXSYS_itoa(iKey, sExtend, 10);
392 key = CFX_ByteString("FFT") + CFX_ByteString(sExtend); 393 key = CFX_ByteString("FFT") + CFX_ByteString(sExtend);
393 if (!pPageXObject->KeyExist(key)) 394 if (!pPageXObject->KeyExist(key))
394 break; 395 break;
395 } 396 }
396 } 397 }
397 398
398 SetPageContents(key, pPageDict, pDocument); 399 SetPageContents(key, pPageDict, pDocument);
399 400
400 CPDF_Dictionary* pNewXORes = nullptr; 401 CPDF_Dictionary* pNewXORes = nullptr;
401 402
402 if (!key.IsEmpty()) { 403 if (!key.IsEmpty()) {
403 pPageXObject->SetReferenceFor(key, pDocument, dwObjNum); 404 pPageXObject->SetReferenceFor(key, pDocument, dwObjNum);
404 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); 405 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict();
405 pNewXORes = new CPDF_Dictionary; 406 pNewXORes = new CPDF_Dictionary(pDocument->GetByteStringPool());
406 pNewOXbjectDic->SetFor("Resources", pNewXORes); 407 pNewOXbjectDic->SetFor("Resources", pNewXORes);
407 pNewOXbjectDic->SetNameFor("Type", "XObject"); 408 pNewOXbjectDic->SetNameFor("Type", "XObject");
408 pNewOXbjectDic->SetNameFor("Subtype", "Form"); 409 pNewOXbjectDic->SetNameFor("Subtype", "Form");
409 pNewOXbjectDic->SetIntegerFor("FormType", 1); 410 pNewOXbjectDic->SetIntegerFor("FormType", 1);
410 pNewOXbjectDic->SetNameFor("Name", "FRM"); 411 pNewOXbjectDic->SetNameFor("Name", "FRM");
411 CFX_FloatRect rcBBox = pPageDict->GetRectFor("ArtBox"); 412 CFX_FloatRect rcBBox = pPageDict->GetRectFor("ArtBox");
412 pNewOXbjectDic->SetRectFor("BBox", rcBBox); 413 pNewOXbjectDic->SetRectFor("BBox", rcBBox);
413 } 414 }
414 415
415 for (int i = 0; i < nStreams; i++) { 416 for (int i = 0; i < nStreams; i++) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 if (pObj) { 468 if (pObj) {
468 CPDF_Dictionary* pObjDic = pObj->GetDict(); 469 CPDF_Dictionary* pObjDic = pObj->GetDict();
469 if (pObjDic) { 470 if (pObjDic) {
470 pObjDic->SetNameFor("Type", "XObject"); 471 pObjDic->SetNameFor("Type", "XObject");
471 pObjDic->SetNameFor("Subtype", "Form"); 472 pObjDic->SetNameFor("Subtype", "Form");
472 } 473 }
473 } 474 }
474 475
475 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); 476 CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject");
476 if (!pXObject) { 477 if (!pXObject) {
477 pXObject = new CPDF_Dictionary; 478 pXObject = new CPDF_Dictionary(pDocument->GetByteStringPool());
478 pNewXORes->SetFor("XObject", pXObject); 479 pNewXORes->SetFor("XObject", pXObject);
479 } 480 }
480 481
481 CFX_ByteString sFormName; 482 CFX_ByteString sFormName;
482 sFormName.Format("F%d", i); 483 sFormName.Format("F%d", i);
483 pXObject->SetReferenceFor(sFormName, pDocument, 484 pXObject->SetReferenceFor(sFormName, pDocument,
484 pDocument->AddIndirectObject(pObj)); 485 pDocument->AddIndirectObject(pObj));
485 486
486 CPDF_StreamAcc acc; 487 CPDF_StreamAcc acc;
487 acc.LoadAllData(pNewXObject); 488 acc.LoadAllData(pNewXObject);
(...skipping 17 matching lines...) Expand all
505 sStream += sTemp; 506 sStream += sTemp;
506 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); 507 pNewXObject->SetData(sStream.raw_str(), sStream.GetLength());
507 } 508 }
508 pPageDict->RemoveFor("Annots"); 509 pPageDict->RemoveFor("Annots");
509 510
510 ObjectArray.RemoveAll(); 511 ObjectArray.RemoveAll();
511 RectArray.RemoveAll(); 512 RectArray.RemoveAll();
512 513
513 return FLATTEN_SUCCESS; 514 return FLATTEN_SUCCESS;
514 } 515 }
OLDNEW
« no previous file with comments | « fpdfsdk/formfiller/cba_fontmap.cpp ('k') | fpdfsdk/fpdf_transformpage.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698