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 |