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

Side by Side Diff: src/pdf/SkPDFTypes.cpp

Issue 1227913008: SkPDF: Memory improvements for PDF Streams (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-08-19 (Wednesday) 17:47:45 EDT Created 5 years, 4 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 | « src/pdf/SkPDFTypes.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkDeflate.h"
9 #include "SkPDFTypes.h" 10 #include "SkPDFTypes.h"
10 #include "SkPDFUtils.h" 11 #include "SkPDFUtils.h"
11 #include "SkStream.h" 12 #include "SkStreamPriv.h"
12
13 #ifdef SK_BUILD_FOR_WIN
14 #define SNPRINTF _snprintf
15 #else
16 #define SNPRINTF snprintf
17 #endif
18 13
19 //////////////////////////////////////////////////////////////////////////////// 14 ////////////////////////////////////////////////////////////////////////////////
20 15
21 SkString* pun(char* x) { return reinterpret_cast<SkString*>(x); } 16 SkString* pun(char* x) { return reinterpret_cast<SkString*>(x); }
22 const SkString* pun(const char* x) { 17 const SkString* pun(const char* x) {
23 return reinterpret_cast<const SkString*>(x); 18 return reinterpret_cast<const SkString*>(x);
24 } 19 }
25 20
26 SkPDFUnion::SkPDFUnion(Type t) : fType(t) {} 21 SkPDFUnion::SkPDFUnion(Type t) : fType(t) {}
27 22
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 SkPDFDict::SkPDFDict() {} 343 SkPDFDict::SkPDFDict() {}
349 344
350 SkPDFDict::~SkPDFDict() { this->clear(); } 345 SkPDFDict::~SkPDFDict() { this->clear(); }
351 346
352 SkPDFDict::SkPDFDict(const char type[]) { this->insertName("Type", type); } 347 SkPDFDict::SkPDFDict(const char type[]) { this->insertName("Type", type); }
353 348
354 void SkPDFDict::emitObject(SkWStream* stream, 349 void SkPDFDict::emitObject(SkWStream* stream,
355 const SkPDFObjNumMap& objNumMap, 350 const SkPDFObjNumMap& objNumMap,
356 const SkPDFSubstituteMap& substitutes) const { 351 const SkPDFSubstituteMap& substitutes) const {
357 stream->writeText("<<"); 352 stream->writeText("<<");
353 this->emitAll(stream, objNumMap, substitutes);
354 stream->writeText(">>");
355 }
356
357 void SkPDFDict::emitAll(SkWStream* stream,
358 const SkPDFObjNumMap& objNumMap,
359 const SkPDFSubstituteMap& substitutes) const {
358 for (int i = 0; i < fRecords.count(); i++) { 360 for (int i = 0; i < fRecords.count(); i++) {
359 fRecords[i].fKey.emitObject(stream, objNumMap, substitutes); 361 fRecords[i].fKey.emitObject(stream, objNumMap, substitutes);
360 stream->writeText(" "); 362 stream->writeText(" ");
361 fRecords[i].fValue.emitObject(stream, objNumMap, substitutes); 363 fRecords[i].fValue.emitObject(stream, objNumMap, substitutes);
362 if (i + 1 < fRecords.count()) { 364 if (i + 1 < fRecords.count()) {
363 stream->writeText("\n"); 365 stream->writeText("\n");
364 } 366 }
365 } 367 }
366 stream->writeText(">>");
367 } 368 }
368 369
369 void SkPDFDict::addResources(SkPDFObjNumMap* catalog, 370 void SkPDFDict::addResources(SkPDFObjNumMap* catalog,
370 const SkPDFSubstituteMap& substitutes) const { 371 const SkPDFSubstituteMap& substitutes) const {
371 for (int i = 0; i < fRecords.count(); i++) { 372 for (int i = 0; i < fRecords.count(); i++) {
372 fRecords[i].fKey.addResources(catalog, substitutes); 373 fRecords[i].fKey.addResources(catalog, substitutes);
373 fRecords[i].fValue.addResources(catalog, substitutes); 374 fRecords[i].fValue.addResources(catalog, substitutes);
374 } 375 }
375 } 376 }
376 377
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 void SkPDFDict::clear() { 433 void SkPDFDict::clear() {
433 for (Record& rec : fRecords) { 434 for (Record& rec : fRecords) {
434 rec.fKey.~SkPDFUnion(); 435 rec.fKey.~SkPDFUnion();
435 rec.fValue.~SkPDFUnion(); 436 rec.fValue.~SkPDFUnion();
436 } 437 }
437 fRecords.reset(); 438 fRecords.reset();
438 } 439 }
439 440
440 //////////////////////////////////////////////////////////////////////////////// 441 ////////////////////////////////////////////////////////////////////////////////
441 442
443 void SkPDFSharedStream::emitObject(
444 SkWStream* stream,
445 const SkPDFObjNumMap& objNumMap,
446 const SkPDFSubstituteMap& substitutes) const {
447 SkDynamicMemoryWStream buffer;
448 SkDeflateWStream deflateWStream(&buffer);
449 // Since emitObject is const, this function doesn't change the dictionary.
450 SkAutoTDelete<SkStreamAsset> dup(fAsset->duplicate()); // Cheap copy
451 SkASSERT(dup);
452 SkStreamCopy(&deflateWStream, dup.get());
453 deflateWStream.finalize();
454 size_t length = buffer.bytesWritten();
455 stream->writeText("<<");
456 fDict->emitAll(stream, objNumMap, substitutes);
457 stream->writeText("\n");
458 SkPDFUnion::Name("Length").emitObject(stream, objNumMap, substitutes);
459 stream->writeText(" ");
460 SkPDFUnion::Int(length).emitObject(stream, objNumMap, substitutes);
461 stream->writeText("\n");
462 SkPDFUnion::Name("Filter").emitObject(stream, objNumMap, substitutes);
463 stream->writeText(" ");
464 SkPDFUnion::Name("FlateDecode").emitObject(stream, objNumMap, substitutes);
465 stream->writeText(">>");
466 stream->writeText(" stream\n");
467 buffer.writeToStream(stream);
468 stream->writeText("\nendstream");
469 }
470
471 void SkPDFSharedStream::addResources(
472 SkPDFObjNumMap* catalog, const SkPDFSubstituteMap& substitutes) const {
473 fDict->addResources(catalog, substitutes);
474 }
475
476 ////////////////////////////////////////////////////////////////////////////////
477
442 SkPDFSubstituteMap::~SkPDFSubstituteMap() { 478 SkPDFSubstituteMap::~SkPDFSubstituteMap() {
443 fSubstituteMap.foreach( 479 fSubstituteMap.foreach(
444 [](SkPDFObject*, SkPDFObject** v) { (*v)->unref(); }); 480 [](SkPDFObject*, SkPDFObject** v) { (*v)->unref(); });
445 } 481 }
446 482
447 void SkPDFSubstituteMap::setSubstitute(SkPDFObject* original, 483 void SkPDFSubstituteMap::setSubstitute(SkPDFObject* original,
448 SkPDFObject* substitute) { 484 SkPDFObject* substitute) {
449 SkASSERT(original != substitute); 485 SkASSERT(original != substitute);
450 SkASSERT(!fSubstituteMap.find(original)); 486 SkASSERT(!fSubstituteMap.find(original));
451 fSubstituteMap.set(original, SkRef(substitute)); 487 fSubstituteMap.set(original, SkRef(substitute));
(...skipping 14 matching lines...) Expand all
466 fObjects.push(obj); 502 fObjects.push(obj);
467 return true; 503 return true;
468 } 504 }
469 505
470 int32_t SkPDFObjNumMap::getObjectNumber(SkPDFObject* obj) const { 506 int32_t SkPDFObjNumMap::getObjectNumber(SkPDFObject* obj) const {
471 int32_t* objectNumberFound = fObjectNumbers.find(obj); 507 int32_t* objectNumberFound = fObjectNumbers.find(obj);
472 SkASSERT(objectNumberFound); 508 SkASSERT(objectNumberFound);
473 return *objectNumberFound; 509 return *objectNumberFound;
474 } 510 }
475 511
OLDNEW
« no previous file with comments | « src/pdf/SkPDFTypes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698