Chromium Code Reviews| Index: src/core/SkPicture.cpp |
| diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp |
| index ca1b6fa22a94cf0f84d7bd6ac0c61a7338f7c12e..5aae553d05c027c10a858796350763d7f772659e 100644 |
| --- a/src/core/SkPicture.cpp |
| +++ b/src/core/SkPicture.cpp |
| @@ -293,6 +293,30 @@ bool SkPicture::StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) { |
| return true; |
| } |
| +bool SkPicture::BufferIsSKP(SkReadBuffer& buffer, SkPictInfo* pInfo) { |
| + // Check magic bytes. |
| + char magic[sizeof(kMagic)]; |
| + |
| + if (!buffer.readByteArray(magic, sizeof(kMagic)) || |
| + (0 != memcmp(magic, kMagic, sizeof(kMagic)))) { |
| + return false; |
| + } |
| + |
| + SkPictInfo info; |
| + if (!buffer.readByteArray(&info, sizeof(SkPictInfo))) { |
| + return false; |
| + } |
| + |
| + if (PICTURE_VERSION != info.fVersion) { |
| + return false; |
| + } |
| + |
| + if (pInfo != NULL) { |
| + *pInfo = info; |
| + } |
| + return true; |
| +} |
| + |
| SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height) |
| : fPlayback(playback) |
| , fRecord(NULL) |
| @@ -320,6 +344,27 @@ SkPicture* SkPicture::CreateFromStream(SkStream* stream, InstallPixelRefProc pro |
| return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight)); |
| } |
| +SkPicture* SkPicture::CreateFromBuffer(SkReadBuffer& buffer) { |
| + SkPictInfo info; |
| + |
| + if (!BufferIsSKP(buffer, &info)) { |
| + return NULL; |
| + } |
| + |
| + SkPicturePlayback* playback; |
| + // Check to see if there is a playback to recreate. |
| + if (buffer.readBool()) { |
| + playback = SkPicturePlayback::CreateFromBuffer(buffer); |
| + if (NULL == playback) { |
| + return NULL; |
| + } |
| + } else { |
| + playback = NULL; |
| + } |
| + |
| + return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight)); |
| +} |
| + |
| void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { |
| SkPicturePlayback* playback = fPlayback; |
| @@ -357,6 +402,43 @@ void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { |
| } |
| } |
|
robertphillips
2014/02/05 18:02:33
Is there some way to share more of this code (e.g.
sugoi1
2014/02/05 21:33:06
Done.
|
| +void SkPicture::flatten(SkWriteBuffer& buffer) const { |
| + SkPicturePlayback* playback = fPlayback; |
| + |
| + if (NULL == playback && fRecord) { |
| + playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); |
| + } |
| + |
| + SkPictInfo info; |
| + |
| + info.fVersion = PICTURE_VERSION; |
| + info.fWidth = fWidth; |
| + info.fHeight = fHeight; |
| + info.fFlags = SkPictInfo::kCrossProcess_Flag; |
| + // TODO: remove this flag, since we're always float (now) |
| + info.fFlags |= SkPictInfo::kScalarIsFloat_Flag; |
| + |
| + if (8 == sizeof(void*)) { |
| + info.fFlags |= SkPictInfo::kPtrIs64Bit_Flag; |
| + } |
| + |
| + // Write 8 magic bytes to ID this file format. |
| + SkASSERT(sizeof(kMagic) == 8); |
| + buffer.writeByteArray(kMagic, sizeof(kMagic)); |
| + |
| + buffer.writeByteArray(&info, sizeof(info)); |
| + if (playback) { |
| + buffer.writeBool(true); |
| + playback->flatten(buffer); |
| + // delete playback if it is a local version (i.e. cons'd up just now) |
| + if (playback != fPlayback) { |
| + SkDELETE(playback); |
| + } |
| + } else { |
| + buffer.writeBool(false); |
| + } |
| +} |
| + |
| bool SkPicture::willPlayBackBitmaps() const { |
| if (!fPlayback) return false; |
| return fPlayback->containsBitmaps(); |