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

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

Issue 2112943002: SkPDF: Glyph Useage Map improvements (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 5 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/SkPDFDocument.h ('k') | src/pdf/SkPDFFont.h » ('j') | 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 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkColorSpace_Base.h" 8 #include "SkColorSpace_Base.h"
9 #include "SkPDFCanvas.h" 9 #include "SkPDFCanvas.h"
10 #include "SkPDFDevice.h" 10 #include "SkPDFDevice.h"
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 fCanvas->clipRect(trimBox); 263 fCanvas->clipRect(trimBox);
264 fCanvas->translate(trimBox.x(), trimBox.y()); 264 fCanvas->translate(trimBox.x(), trimBox.y());
265 return fCanvas.get(); 265 return fCanvas.get();
266 } 266 }
267 267
268 void SkPDFDocument::onEndPage() { 268 void SkPDFDocument::onEndPage() {
269 SkASSERT(fCanvas.get()); 269 SkASSERT(fCanvas.get());
270 fCanvas->flush(); 270 fCanvas->flush();
271 fCanvas.reset(nullptr); 271 fCanvas.reset(nullptr);
272 SkASSERT(fPageDevice); 272 SkASSERT(fPageDevice);
273 fGlyphUsage.merge(fPageDevice->getFontGlyphUsage());
274 auto page = sk_make_sp<SkPDFDict>("Page"); 273 auto page = sk_make_sp<SkPDFDict>("Page");
275 page->insertObject("Resources", fPageDevice->makeResourceDict()); 274 page->insertObject("Resources", fPageDevice->makeResourceDict());
276 page->insertObject("MediaBox", fPageDevice->copyMediaBox()); 275 page->insertObject("MediaBox", fPageDevice->copyMediaBox());
277 auto annotations = sk_make_sp<SkPDFArray>(); 276 auto annotations = sk_make_sp<SkPDFArray>();
278 fPageDevice->appendAnnotations(annotations.get()); 277 fPageDevice->appendAnnotations(annotations.get());
279 if (annotations->size() > 0) { 278 if (annotations->size() > 0) {
280 page->insertObject("Annots", std::move(annotations)); 279 page->insertObject("Annots", std::move(annotations));
281 } 280 }
282 auto contentData = fPageDevice->content(); 281 auto contentData = fPageDevice->content();
283 auto contentObject = sk_make_sp<SkPDFStream>(contentData.get()); 282 auto contentObject = sk_make_sp<SkPDFStream>(contentData.get());
284 this->serialize(contentObject); 283 this->serialize(contentObject);
285 page->insertObjRef("Contents", std::move(contentObject)); 284 page->insertObjRef("Contents", std::move(contentObject));
286 fPageDevice->appendDestinations(fDests.get(), page.get()); 285 fPageDevice->appendDestinations(fDests.get(), page.get());
287 fPages.emplace_back(std::move(page)); 286 fPages.emplace_back(std::move(page));
288 fPageDevice.reset(nullptr); 287 fPageDevice.reset(nullptr);
289 } 288 }
290 289
291 void SkPDFDocument::onAbort() { 290 void SkPDFDocument::onAbort() {
292 fCanvas.reset(nullptr); 291 fCanvas.reset(nullptr);
293 fPages.reset(); 292 fPages.reset();
294 fCanon.reset(); 293 fCanon.reset();
295 renew(&fObjectSerializer); 294 renew(&fObjectSerializer);
295 renew(&fGlyphUsage);
296 } 296 }
297 297
298 #ifdef SK_SUPPORT_LEGACY_DOCUMENT_API 298 #ifdef SK_SUPPORT_LEGACY_DOCUMENT_API
299 void SkPDFDocument::setMetadata(const SkDocument::Attribute info[], 299 void SkPDFDocument::setMetadata(const SkDocument::Attribute info[],
300 int infoCount, 300 int infoCount,
301 const SkTime::DateTime* creationDate, 301 const SkTime::DateTime* creationDate,
302 const SkTime::DateTime* modifiedDate) { 302 const SkTime::DateTime* modifiedDate) {
303 for (int i = 0; i < infoCount; ++i) { 303 for (int i = 0; i < infoCount; ++i) {
304 const SkDocument::Attribute& kv = info[i]; 304 const SkDocument::Attribute& kv = info[i];
305 SkPDFMetadata::SetMetadataByKey(kv.fKey, kv.fValue, &fMetadata); 305 SkPDFMetadata::SetMetadataByKey(kv.fKey, kv.fValue, &fMetadata);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 intentArray->appendObject(std::move(outputIntent)); 349 intentArray->appendObject(std::move(outputIntent));
350 return intentArray; 350 return intentArray;
351 } 351 }
352 352
353 bool SkPDFDocument::onClose(SkWStream* stream) { 353 bool SkPDFDocument::onClose(SkWStream* stream) {
354 SkASSERT(!fCanvas.get()); 354 SkASSERT(!fCanvas.get());
355 if (fPages.empty()) { 355 if (fPages.empty()) {
356 fPages.reset(); 356 fPages.reset();
357 fCanon.reset(); 357 fCanon.reset();
358 renew(&fObjectSerializer); 358 renew(&fObjectSerializer);
359 renew(&fGlyphUsage);
359 return false; 360 return false;
360 } 361 }
361 auto docCatalog = sk_make_sp<SkPDFDict>("Catalog"); 362 auto docCatalog = sk_make_sp<SkPDFDict>("Catalog");
362 if (fPDFA) { 363 if (fPDFA) {
363 SkASSERT(fXMP); 364 SkASSERT(fXMP);
364 docCatalog->insertObjRef("Metadata", fXMP); 365 docCatalog->insertObjRef("Metadata", fXMP);
365 // Don't specify OutputIntents if we are not in PDF/A mode since 366 // Don't specify OutputIntents if we are not in PDF/A mode since
366 // no one has ever asked for this feature. 367 // no one has ever asked for this feature.
367 docCatalog->insertObject("OutputIntents", make_srgb_output_intents()); 368 docCatalog->insertObject("OutputIntents", make_srgb_output_intents());
368 } 369 }
369 SkASSERT(!fPages.empty()); 370 SkASSERT(!fPages.empty());
370 docCatalog->insertObjRef("Pages", generate_page_tree(&fPages)); 371 docCatalog->insertObjRef("Pages", generate_page_tree(&fPages));
371 SkASSERT(fPages.empty()); 372 SkASSERT(fPages.empty());
372 373
373 if (fDests->size() > 0) { 374 if (fDests->size() > 0) {
374 docCatalog->insertObjRef("Dests", std::move(fDests)); 375 docCatalog->insertObjRef("Dests", std::move(fDests));
375 } 376 }
376 377
377 // Build font subsetting info before calling addObjectRecursively(). 378 // Build font subsetting info before calling addObjectRecursively().
378 for (const auto& entry : fGlyphUsage) { 379 for (const auto& entry : fGlyphUsage) {
379 sk_sp<SkPDFFont> subsetFont( 380 sk_sp<SkPDFFont> subsetFont(
380 entry.fFont->getFontSubset(entry.fGlyphSet)); 381 entry.fFont->getFontSubset(&entry.fGlyphSet));
381 if (subsetFont) { 382 if (subsetFont) {
382 fObjectSerializer.fSubstituteMap.setSubstitute( 383 fObjectSerializer.fSubstituteMap.setSubstitute(
383 entry.fFont, subsetFont.get()); 384 entry.fFont, subsetFont.get());
384 } 385 }
385 } 386 }
386 387
387 fObjectSerializer.addObjectRecursively(docCatalog); 388 fObjectSerializer.addObjectRecursively(docCatalog);
388 fObjectSerializer.serializeObjects(this->getStream()); 389 fObjectSerializer.serializeObjects(this->getStream());
389 fObjectSerializer.serializeFooter(this->getStream(), docCatalog, fID); 390 fObjectSerializer.serializeFooter(this->getStream(), docCatalog, fID);
390 fCanon.reset(); 391 fCanon.reset();
391 renew(&fObjectSerializer); 392 renew(&fObjectSerializer);
393 renew(&fGlyphUsage);
392 return true; 394 return true;
393 } 395 }
394 396
395 /////////////////////////////////////////////////////////////////////////////// 397 ///////////////////////////////////////////////////////////////////////////////
396 398
397 sk_sp<SkDocument> SkPDFMakeDocument(SkWStream* stream, 399 sk_sp<SkDocument> SkPDFMakeDocument(SkWStream* stream,
398 void (*proc)(SkWStream*, bool), 400 void (*proc)(SkWStream*, bool),
399 SkScalar dpi, 401 SkScalar dpi,
400 const SkDocument::PDFMetadata& metadata, 402 const SkDocument::PDFMetadata& metadata,
401 sk_sp<SkPixelSerializer> jpeg, 403 sk_sp<SkPixelSerializer> jpeg,
(...skipping 14 matching lines...) Expand all
416 } 418 }
417 419
418 sk_sp<SkDocument> SkDocument::MakePDF(SkWStream* stream, 420 sk_sp<SkDocument> SkDocument::MakePDF(SkWStream* stream,
419 SkScalar dpi, 421 SkScalar dpi,
420 const SkDocument::PDFMetadata& metadata, 422 const SkDocument::PDFMetadata& metadata,
421 sk_sp<SkPixelSerializer> jpegEncoder, 423 sk_sp<SkPixelSerializer> jpegEncoder,
422 bool pdfa) { 424 bool pdfa) {
423 return SkPDFMakeDocument(stream, nullptr, dpi, metadata, 425 return SkPDFMakeDocument(stream, nullptr, dpi, metadata,
424 std::move(jpegEncoder), pdfa); 426 std::move(jpegEncoder), pdfa);
425 } 427 }
OLDNEW
« no previous file with comments | « src/pdf/SkPDFDocument.h ('k') | src/pdf/SkPDFFont.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698