diff options
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DMSrcSink.cpp | 34 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 4 |
2 files changed, 24 insertions, 14 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index f505bb7476..d34117b76f 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -26,6 +26,7 @@ #include "SkLiteDL.h" #include "SkLiteRecorder.h" #include "SkMallocPixelRef.h" +#include "SkMultiPictureDocumentPriv.h" #include "SkMultiPictureDraw.h" #include "SkNullCanvas.h" #include "SkOSFile.h" @@ -1194,30 +1195,39 @@ bool SVGSrc::veto(SinkFlags flags) const { MSKPSrc::MSKPSrc(Path path) : fPath(path) { std::unique_ptr<SkStreamAsset> stream = SkStream::MakeFromFile(fPath.c_str()); - (void)fReader.init(stream.get()); + int count = SkMultiPictureDocumentReadPageCount(stream.get()); + if (count > 0) { + fPages.reset(count); + (void)SkMultiPictureDocumentReadPageSizes(stream.get(), &fPages[0], fPages.count()); + } } -int MSKPSrc::pageCount() const { return fReader.pageCount(); } +int MSKPSrc::pageCount() const { return fPages.count(); } SkISize MSKPSrc::size() const { return this->size(0); } -SkISize MSKPSrc::size(int i) const { return fReader.pageSize(i).toCeil(); } +SkISize MSKPSrc::size(int i) const { + return i >= 0 && i < fPages.count() ? fPages[i].fSize.toCeil() : SkISize::Make(0, 0); +} Error MSKPSrc::draw(SkCanvas* c) const { return this->draw(0, c); } Error MSKPSrc::draw(int i, SkCanvas* canvas) const { - std::unique_ptr<SkStreamAsset> stream = SkStream::MakeFromFile(fPath.c_str()); - if (!stream) { - return SkStringPrintf("Unable to open file: %s", fPath.c_str()); - } - if (fReader.pageCount() == 0) { + if (this->pageCount() == 0) { return SkStringPrintf("Unable to parse MultiPictureDocument file: %s", fPath.c_str()); } - if (i >= fReader.pageCount()) { + if (i >= fPages.count() || i < 0) { return SkStringPrintf("MultiPictureDocument page number out of range: %d", i); } - sk_sp<SkPicture> page = fReader.readPage(stream.get(), i); + SkPicture* page = fPages[i].fPicture.get(); if (!page) { - return SkStringPrintf("SkMultiPictureDocumentReader failed on page %d: %s", - i, fPath.c_str()); + std::unique_ptr<SkStreamAsset> stream = SkStream::MakeFromFile(fPath.c_str()); + if (!stream) { + return SkStringPrintf("Unable to open file: %s", fPath.c_str()); + } + if (!SkMultiPictureDocumentRead(stream.get(), &fPages[0], fPages.count())) { + return SkStringPrintf("SkMultiPictureDocument reader failed on page %d: %s", i, + fPath.c_str()); + } + page = fPages[i].fPicture.get(); } canvas->drawPicture(page); return ""; diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index b6e1b5955c..d72d86814b 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -15,7 +15,7 @@ #include "SkBitmapRegionDecoder.h" #include "SkCanvas.h" #include "SkData.h" -#include "SkMultiPictureDocumentReader.h" +#include "SkMultiPictureDocument.h" #include "SkPicture.h" #include "gm.h" @@ -288,7 +288,7 @@ public: private: Path fPath; - SkMultiPictureDocumentReader fReader; + mutable SkTArray<SkDocumentPage> fPages; }; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |