Index: src/core/SkBitmap.cpp |
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
index 25a6b1dba44790ce0bee01bb22f4b92bfd54c426..b52961794fb1e226cfa16284115bcbeb9ed146b2 100644 |
--- a/src/core/SkBitmap.cpp |
+++ b/src/core/SkBitmap.cpp |
@@ -453,10 +453,20 @@ void SkBitmap::setPixels(void* p, SkColorTable* ctable) { |
return; |
} |
- Sk64 size = this->getSize64(); |
- SkASSERT(!size.isNeg() && size.is32()); |
+ SkImageInfo info; |
+ if (!this->asImageInfo(&info)) { |
+ this->setPixelRef(NULL, 0); |
+ return; |
+ } |
+ |
+ SkPixelRef* pr = SkMallocPixelRef::NewDirect(info, p, fRowBytes, ctable); |
+ if (NULL == pr) { |
+ this->setPixelRef(NULL, 0); |
+ return; |
+ } |
+ |
+ this->setPixelRef(pr)->unref(); |
- this->setPixelRef(new SkMallocPixelRef(p, size.get32(), ctable, false))->unref(); |
// since we're already allocated, we lockPixels right away |
this->lockPixels(); |
SkDEBUGCODE(this->validate();) |
@@ -521,17 +531,19 @@ GrTexture* SkBitmap::getTexture() const { |
*/ |
bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst, |
SkColorTable* ctable) { |
- Sk64 size = dst->getSize64(); |
- if (size.isNeg() || !size.is32()) { |
+ SkImageInfo info; |
+ if (!dst->asImageInfo(&info)) { |
+// SkDebugf("unsupported config for info %d\n", dst->config()); |
return false; |
} |
- |
- void* addr = sk_malloc_flags(size.get32(), 0); // returns NULL on failure |
- if (NULL == addr) { |
+ |
+ SkPixelRef* pr = SkMallocPixelRef::NewAllocate(info, dst->rowBytes(), |
+ ctable); |
+ if (NULL == pr) { |
return false; |
} |
- dst->setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))->unref(); |
+ dst->setPixelRef(pr, 0)->unref(); |
// since we're already allocated, we lockPixels right away |
dst->lockPixels(); |
return true; |
@@ -1641,6 +1653,28 @@ SkBitmap::RLEPixels::~RLEPixels() { |
/////////////////////////////////////////////////////////////////////////////// |
+void SkImageInfo::unflatten(SkFlattenableReadBuffer& buffer) { |
+ fWidth = buffer.read32(); |
+ fHeight = buffer.read32(); |
+ |
+ uint32_t packed = buffer.read32(); |
+ SkASSERT(0 == (packed >> 16)); |
+ fAlphaType = (SkAlphaType)((packed >> 8) & 0xFF); |
+ fColorType = (SkColorType)((packed >> 0) & 0xFF); |
+} |
+ |
+void SkImageInfo::flatten(SkFlattenableWriteBuffer& buffer) const { |
+ buffer.write32(fWidth); |
+ buffer.write32(fHeight); |
+ |
+ SkASSERT(0 == (fAlphaType & ~0xFF)); |
+ SkASSERT(0 == (fColorType & ~0xFF)); |
+ uint32_t packed = (fAlphaType << 8) | fColorType; |
+ buffer.write32(packed); |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
#ifdef SK_DEBUG |
void SkBitmap::validate() const { |
SkASSERT(fConfig < kConfigCount); |