49static constexpr char kMagic[] =
"Skia Multi-Picture Doc\n\n";
51static constexpr char kEndPage[] =
"SkMultiPictureEndPage";
53const uint32_t kVersion = 2;
58 joined =
SkSize{std::max(joined.
width(),
s.width()), std::max(joined.
height(),
s.height())};
63struct MultiPictureDocument final :
public SkDocument {
69 std::function<void(
const SkPicture*)> fOnEndPage;
72 std::function<
void(
const SkPicture*)> onEndPage)
75 , fOnEndPage(
std::move(onEndPage)) {}
77 ~MultiPictureDocument()
override { this->
close(); }
80 fCurrentPageSize.
set(
w,
h);
88 fOnEndPage(lastPage.
get());
108 p->serialize(wStream, &fProcs);
128 if (fIndex < fCount) {
134 if (0 == strcmp(
key, kEndPage)) {
136 if (fIndex < fCount) {
152 std::function<
void(
const SkPicture*)> onEndPage) {
153 return sk_make_sp<MultiPictureDocument>(dst, procs, std::move(onEndPage));
161 const size_t size =
sizeof(
kMagic) - 1;
167 uint32_t versionNumber;
168 if (!src->readU32(&versionNumber) || versionNumber != kVersion) {
172 if (!src->readU32(&pageCount) || pageCount > INT_MAX) {
176 return SkTo<int>(pageCount);
182 if (!dstArray || dstArrayCount < 1) {
186 if (pageCount < 1 || pageCount != dstArrayCount) {
189 for (
int i = 0; i < pageCount; ++i) {
191 if (
sizeof(
s) != stream->read(&
s,
sizeof(
s))) {
206 SkSize joined = {0.0f, 0.0f};
207 for (
int i = 0; i < dstArrayCount; ++i) {
217 PagerCanvas canvas(joined.
toCeil(), dstArray, dstArrayCount);
221 if (canvas.fIndex != dstArrayCount) {
222 SkDEBUGF(
"Malformed SkMultiPictureDocument: canvas.fIndex=%d dstArrayCount=%d\n",
223 canvas.fIndex, dstArrayCount);
static const char kMagic[]
constexpr uint32_t SkToU32(S x)
void drawAnnotation(const SkRect &rect, const char key[], SkData *value)
void drawPicture(const SkPicture *picture)
static sk_sp< SkData > MakeWithCString(const char cstr[])
virtual void onClose(SkWStream *)=0
virtual SkCanvas * onBeginPage(SkScalar width, SkScalar height)=0
virtual void onEndPage()=0
virtual void addCanvas(SkCanvas *)
void onDrawAnnotation(const SkRect &, const char[], SkData *) override
SkCanvas * beginRecording(const SkRect &bounds, sk_sp< SkBBoxHierarchy > bbh)
sk_sp< SkPicture > finishRecordingAsPicture()
virtual void playback(SkCanvas *canvas, AbortCallback *callback=nullptr) const =0
static sk_sp< SkPicture > MakeFromStream(SkStream *stream, const SkDeserialProcs *procs=nullptr)
virtual bool write(const void *buffer, size_t size)=0
virtual size_t bytesWritten() const =0
bool writeText(const char text[])
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
static const uint8_t buffer[]
SK_API sk_sp< SkDocument > Make(SkWStream *dst, const SkSerialProcs *=nullptr, std::function< void(const SkPicture *)> onEndPage=nullptr)
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
SK_API int ReadPageCount(SkStreamSeekable *src)
bool ReadPageSizes(SkStreamSeekable *stream, SkDocumentPage *dstArray, int dstArrayCount)
Optional< SkRect > bounds
SINT Vec< 2 *N, T > join(const Vec< N, T > &lo, const Vec< N, T > &hi)
static constexpr SkRect MakeEmpty()
static constexpr SkRect MakeSize(const SkSize &size)
void set(SkScalar w, SkScalar h)