Index: src/core/SkBitmap.cpp |
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
index 84f363e564f2a7a46e6928c430d2744dca88bb46..70d99074d13ac7e545039f840b384c0244f90d60 100644 |
--- a/src/core/SkBitmap.cpp |
+++ b/src/core/SkBitmap.cpp |
@@ -1266,11 +1266,88 @@ bool SkBitmap::extractAlpha(SkBitmap* dst, const SkPaint* paint, |
/////////////////////////////////////////////////////////////////////////////// |
+void SkBitmap::WriteRawPixels(SkWriteBuffer* buffer, const SkBitmap& bitmap) { |
+ const SkImageInfo info = bitmap.info(); |
+ SkAutoLockPixels alp(bitmap); |
+ if (0 == info.width() || 0 == info.height() || NULL == bitmap.getPixels()) { |
+ buffer->writeUInt(0); // instead of snugRB, signaling no pixels |
+ return; |
+ } |
+ |
+ const size_t snugRB = info.width() * info.bytesPerPixel(); |
+ const char* src = (const char*)bitmap.getPixels(); |
+ const size_t ramRB = bitmap.rowBytes(); |
+ |
+ buffer->write32(SkToU32(snugRB)); |
+ info.flatten(*buffer); |
+ |
+ const size_t size = snugRB * info.height(); |
+ SkAutoMalloc storage(size); |
+ char* dst = (char*)storage.get(); |
+ for (int y = 0; y < info.height(); ++y) { |
+ memcpy(dst, src, snugRB); |
+ dst += snugRB; |
+ src += ramRB; |
+ } |
+ buffer->writeByteArray(storage.get(), size); |
+ |
+ SkColorTable* ct = bitmap.getColorTable(); |
+ if (kIndex_8_SkColorType == info.colorType() && ct) { |
+ buffer->writeBool(true); |
+ ct->writeToBuffer(*buffer); |
+ } else { |
+ buffer->writeBool(false); |
+ } |
+} |
+ |
+bool SkBitmap::ReadRawPixels(SkReadBuffer* buffer, SkBitmap* bitmap) { |
+ const size_t snugRB = buffer->readUInt(); |
+ if (0 == snugRB) { // no pixels |
+ return false; |
+ } |
+ |
+ SkImageInfo info; |
+ info.unflatten(*buffer); |
+ |
+ const size_t ramRB = info.minRowBytes(); |
+ const int height = info.height(); |
+ const size_t snugSize = snugRB * height; |
+ const size_t ramSize = ramRB * height; |
+ SkASSERT(snugSize <= ramSize); |
+ |
+ char* dst = (char*)sk_malloc_throw(ramSize); |
+ buffer->readByteArray(dst, snugSize); |
+ SkAutoDataUnref data(SkData::NewFromMalloc(dst, ramSize)); |
+ |
+ if (snugSize != ramSize) { |
+ const char* srcRow = dst + snugRB * (height - 1); |
+ char* dstRow = dst + ramRB * (height - 1); |
+ for (int y = height - 1; y >= 1; --y) { |
+ memmove(dstRow, srcRow, snugRB); |
+ srcRow -= snugRB; |
+ dstRow -= ramRB; |
+ } |
+ SkASSERT(srcRow == dstRow); // first row does not need to be moved |
+ } |
+ |
+ SkAutoTUnref<SkColorTable> ctable; |
+ if (buffer->readBool()) { |
+ ctable.reset(SkNEW_ARGS(SkColorTable, (*buffer))); |
+ } |
+ |
+ SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewWithData(info, info.minRowBytes(), |
+ ctable.get(), data.get())); |
+ bitmap->setConfig(pr->info()); |
+ bitmap->setPixelRef(pr, 0, 0); |
+ return true; |
+} |
+ |
enum { |
SERIALIZE_PIXELTYPE_NONE, |
SERIALIZE_PIXELTYPE_REF_DATA |
}; |
+#ifdef SK_SUPPORT_LEGACY_BITMAPFLATTEN |
void SkBitmap::flatten(SkWriteBuffer& buffer) const { |
fInfo.flatten(buffer); |
buffer.writeInt(fRowBytes); |
@@ -1289,6 +1366,7 @@ void SkBitmap::flatten(SkWriteBuffer& buffer) const { |
buffer.writeInt(SERIALIZE_PIXELTYPE_NONE); |
} |
} |
+#endif |
void SkBitmap::unflatten(SkReadBuffer& buffer) { |
this->reset(); |