Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Functions
SkMultiPictureDocument Namespace Reference

Functions

SK_API sk_sp< SkDocumentMake (SkWStream *dst, const SkSerialProcs *=nullptr, std::function< void(const SkPicture *)> onEndPage=nullptr)
 
SK_API int ReadPageCount (SkStreamSeekable *src)
 
SK_API bool Read (SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
 
bool ReadPageSizes (SkStreamSeekable *stream, SkDocumentPage *dstArray, int dstArrayCount)
 

Function Documentation

◆ Make()

sk_sp< SkDocument > SkMultiPictureDocument::Make ( SkWStream dst,
const SkSerialProcs procs = nullptr,
std::function< void(const SkPicture *)>  onEndPage = nullptr 
)

Writes into a file format that is similar to SkPicture::serialize() Accepts a callback for endPage behavior

Definition at line 150 of file SkMultiPictureDocument.cpp.

152 {
153 return sk_make_sp<MultiPictureDocument>(dst, procs, std::move(onEndPage));
154}

◆ Read()

bool SkMultiPictureDocument::Read ( SkStreamSeekable src,
SkDocumentPage dstArray,
int  dstArrayCount,
const SkDeserialProcs procs = nullptr 
)

Read the SkMultiPictureDocument into the provided array of pages. dstArrayCount must equal SkMultiPictureDocumentReadPageCount(). Return false on error.

Definition at line 199 of file SkMultiPictureDocument.cpp.

202 {
203 if (!ReadPageSizes(src, dstArray, dstArrayCount)) {
204 return false;
205 }
206 SkSize joined = {0.0f, 0.0f};
207 for (int i = 0; i < dstArrayCount; ++i) {
208 joined = SkSize{std::max(joined.width(), dstArray[i].fSize.width()),
209 std::max(joined.height(), dstArray[i].fSize.height())};
210 }
211
212 auto picture = SkPicture::MakeFromStream(src, procs);
213 if (!picture) {
214 return false;
215 }
216
217 PagerCanvas canvas(joined.toCeil(), dstArray, dstArrayCount);
218 // Must call playback(), not drawPicture() to reach
219 // PagerCanvas::onDrawAnnotation().
220 picture->playback(&canvas);
221 if (canvas.fIndex != dstArrayCount) {
222 SkDEBUGF("Malformed SkMultiPictureDocument: canvas.fIndex=%d dstArrayCount=%d\n",
223 canvas.fIndex, dstArrayCount);
224 }
225 return true;
226}
#define SkDEBUGF(...)
Definition SkDebug.h:24
virtual void playback(SkCanvas *canvas, AbortCallback *callback=nullptr) const =0
static sk_sp< SkPicture > MakeFromStream(SkStream *stream, const SkDeserialProcs *procs=nullptr)
bool ReadPageSizes(SkStreamSeekable *stream, SkDocumentPage *dstArray, int dstArrayCount)
sk_sp< const SkPicture > picture
Definition SkRecords.h:299
SkISize toCeil() const
Definition SkSize.h:83
SkScalar width() const
Definition SkSize.h:76
SkScalar height() const
Definition SkSize.h:77

◆ ReadPageCount()

int SkMultiPictureDocument::ReadPageCount ( SkStreamSeekable src)

Returns the number of pages in the SkMultiPictureDocument.

Definition at line 156 of file SkMultiPictureDocument.cpp.

156 {
157 if (!src) {
158 return 0;
159 }
160 src->seek(0);
161 const size_t size = sizeof(kMagic) - 1;
162 char buffer[size];
163 if (size != src->read(buffer, size) || 0 != memcmp(kMagic, buffer, size)) {
164 src = nullptr;
165 return 0;
166 }
167 uint32_t versionNumber;
168 if (!src->readU32(&versionNumber) || versionNumber != kVersion) {
169 return 0;
170 }
171 uint32_t pageCount;
172 if (!src->readU32(&pageCount) || pageCount > INT_MAX) {
173 return 0;
174 }
175 // leave stream position right here.
176 return SkTo<int>(pageCount);
177}
static const char kMagic[]
Definition SkPicture.cpp:58
static const uint8_t buffer[]

◆ ReadPageSizes()

bool SkMultiPictureDocument::ReadPageSizes ( SkStreamSeekable src,
SkDocumentPage dstArray,
int  dstArrayCount 
)

Additional API allows one to read the array of page-sizes without parsing the entire file. Used by DM.

Definition at line 179 of file SkMultiPictureDocument.cpp.

181 {
182 if (!dstArray || dstArrayCount < 1) {
183 return false;
184 }
185 int pageCount = ReadPageCount(stream);
186 if (pageCount < 1 || pageCount != dstArrayCount) {
187 return false;
188 }
189 for (int i = 0; i < pageCount; ++i) {
190 SkSize& s = dstArray[i].fSize;
191 if (sizeof(s) != stream->read(&s, sizeof(s))) {
192 return false;
193 }
194 }
195 // leave stream position right here.
196 return true;
197}
struct MyStruct s