Index: src/pdf/SkPDFDocument.cpp |
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp |
index 28602ed17681bbb1e6f0821ea81637bf40ac9e91..cc8fa480bc61277ec38a5f0d1620db1dcaa06b25 100644 |
--- a/src/pdf/SkPDFDocument.cpp |
+++ b/src/pdf/SkPDFDocument.cpp |
@@ -35,14 +35,15 @@ static_assert((SKPDF_MAGIC[1] & 0x7F) == "Skia"[1], ""); |
static_assert((SKPDF_MAGIC[2] & 0x7F) == "Skia"[2], ""); |
static_assert((SKPDF_MAGIC[3] & 0x7F) == "Skia"[3], ""); |
#endif |
-void SkPDFObjectSerializer::serializeHeader(SkWStream* wStream, const SkPDFMetadata& md) { |
+void SkPDFObjectSerializer::serializeHeader(SkWStream* wStream, |
+ const SkDocument::PDFMetadata& md) { |
fBaseOffset = wStream->bytesWritten(); |
static const char kHeader[] = "%PDF-1.4\n%" SKPDF_MAGIC "\n"; |
wStream->write(kHeader, strlen(kHeader)); |
// The PDF spec recommends including a comment with four |
// bytes, all with their high bits set. "\xD3\xEB\xE9\xE1" is |
// "Skia" with the high bits set. |
- fInfoDict.reset(md.createDocumentInformationDict()); |
+ fInfoDict = SkPDFMetadata::MakeDocumentInformationDict(md); |
this->addObjectRecursively(fInfoDict); |
this->serializeObjects(wStream); |
} |
@@ -215,12 +216,14 @@ template <typename T> static T* clone(const T* o) { return o ? new T(*o) : nullp |
SkPDFDocument::SkPDFDocument(SkWStream* stream, |
void (*doneProc)(SkWStream*, bool), |
SkScalar rasterDpi, |
- SkPixelSerializer* jpegEncoder, |
+ const SkDocument::PDFMetadata& metadata, |
+ sk_sp<SkPixelSerializer> jpegEncoder, |
bool pdfa) |
: SkDocument(stream, doneProc) |
, fRasterDpi(rasterDpi) |
+ , fMetadata(metadata) |
, fPDFA(pdfa) { |
- fCanon.setPixelSerializer(SkSafeRef(jpegEncoder)); |
+ fCanon.setPixelSerializer(std::move(jpegEncoder)); |
} |
SkPDFDocument::~SkPDFDocument() { |
@@ -241,14 +244,14 @@ SkCanvas* SkPDFDocument::onBeginPage(SkScalar width, SkScalar height, |
fObjectSerializer.serializeHeader(this->getStream(), fMetadata); |
fDests = sk_make_sp<SkPDFDict>(); |
if (fPDFA) { |
- SkPDFMetadata::UUID uuid = fMetadata.uuid(); |
+ SkPDFMetadata::UUID uuid = SkPDFMetadata::CreateUUID(fMetadata); |
// We use the same UUID for Document ID and Instance ID since this |
// is the first revision of this document (and Skia does not |
// support revising existing PDF documents). |
// If we are not in PDF/A mode, don't use a UUID since testing |
// works best with reproducible outputs. |
- fID.reset(SkPDFMetadata::CreatePdfId(uuid, uuid)); |
- fXMP.reset(fMetadata.createXMPObject(uuid, uuid)); |
+ fID = SkPDFMetadata::MakePdfId(uuid, uuid); |
+ fXMP = SkPDFMetadata::MakeXMPObject(fMetadata, uuid, uuid); |
fObjectSerializer.addObjectRecursively(fXMP); |
fObjectSerializer.serializeObjects(this->getStream()); |
} |
@@ -293,14 +296,25 @@ void SkPDFDocument::onAbort() { |
renew(&fObjectSerializer); |
} |
+#ifdef SK_SUPPORT_LEGACY_DOCUMENT_API |
void SkPDFDocument::setMetadata(const SkDocument::Attribute info[], |
int infoCount, |
const SkTime::DateTime* creationDate, |
const SkTime::DateTime* modifiedDate) { |
- fMetadata.fInfo.reset(info, infoCount); |
- fMetadata.fCreation.reset(clone(creationDate)); |
- fMetadata.fModified.reset(clone(modifiedDate)); |
+ for (int i = 0; i < infoCount; ++i) { |
+ const SkDocument::Attribute& kv = info[i]; |
+ SkPDFMetadata::SetMetadataByKey(kv.fKey, kv.fValue, &fMetadata); |
+ } |
+ if (creationDate) { |
+ fMetadata.fCreation.fEnabled = true; |
+ fMetadata.fCreation.fDateTime = *creationDate; |
+ } |
+ if (modifiedDate) { |
+ fMetadata.fModified.fEnabled = true; |
+ fMetadata.fModified.fDateTime = *modifiedDate; |
+ } |
} |
+#endif // SK_SUPPORT_LEGACY_DOCUMENT_API |
static sk_sp<SkData> SkSrgbIcm() { |
// Source: http://www.argyllcms.com/icclibsrc.html |
@@ -493,34 +507,29 @@ bool SkPDFDocument::onClose(SkWStream* stream) { |
sk_sp<SkDocument> SkPDFMakeDocument(SkWStream* stream, |
void (*proc)(SkWStream*, bool), |
SkScalar dpi, |
- SkPixelSerializer* jpeg, |
+ const SkDocument::PDFMetadata& metadata, |
+ sk_sp<SkPixelSerializer> jpeg, |
bool pdfa) { |
- return stream ? sk_make_sp<SkPDFDocument>(stream, proc, dpi, jpeg, pdfa) |
+ return stream ? sk_make_sp<SkPDFDocument>(stream, proc, dpi, metadata, |
+ std::move(jpeg), pdfa) |
: nullptr; |
} |
-#ifdef SK_PDF_GENERATE_PDFA |
- static const bool kPDFA = true; |
-#else |
- static const bool kPDFA = false; |
-#endif |
- |
-SkDocument* SkDocument::CreatePDF(SkWStream* stream, SkScalar dpi) { |
- return SkPDFMakeDocument(stream, nullptr, dpi, nullptr, kPDFA).release(); |
-} |
- |
-SkDocument* SkDocument::CreatePDF(SkWStream* stream, |
- SkScalar dpi, |
- SkPixelSerializer* jpegEncoder) { |
- return SkPDFMakeDocument(stream, nullptr, dpi, |
- jpegEncoder, kPDFA).release(); |
-} |
- |
-SkDocument* SkDocument::CreatePDF(const char path[], SkScalar dpi) { |
+sk_sp<SkDocument> SkDocument::MakePDF(const char path[], SkScalar dpi) { |
auto delete_wstream = [](SkWStream* stream, bool) { delete stream; }; |
std::unique_ptr<SkFILEWStream> stream(new SkFILEWStream(path)); |
return stream->isValid() |
- ? SkPDFMakeDocument(stream.release(), delete_wstream, dpi, |
- nullptr, kPDFA).release() |
- : nullptr; |
+ ? SkPDFMakeDocument(stream.release(), delete_wstream, dpi, |
+ SkDocument::PDFMetadata(), nullptr, |
+ false) |
+ : nullptr; |
+} |
+ |
+sk_sp<SkDocument> SkDocument::MakePDF(SkWStream* stream, |
+ SkScalar dpi, |
+ const SkDocument::PDFMetadata& metadata, |
+ sk_sp<SkPixelSerializer> jpegEncoder, |
+ bool pdfa) { |
+ return SkPDFMakeDocument(stream, nullptr, dpi, metadata, |
+ std::move(jpegEncoder), pdfa); |
} |