| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |