Chromium Code Reviews| Index: src/core/SkBitmap.cpp |
| diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
| index d2a308b03ab950fe536980ea0a84a8d6122f62f9..829a1e548c066131aee0308af9716b15e952df7b 100644 |
| --- a/src/core/SkBitmap.cpp |
| +++ b/src/core/SkBitmap.cpp |
| @@ -361,6 +361,47 @@ void SkBitmap::updatePixelsFromRef() const { |
| } |
| } |
| +static bool config2ColorType(SkBitmap::Config config, SkColorType* ctOut) { |
|
scroggo
2013/12/06 14:50:33
style nit: underscores for static functions.
reed1
2013/12/06 15:48:46
Done.
|
| + SkColorType ct; |
| + switch (config) { |
| + case SkBitmap::kNo_Config: |
| + return false; |
| + case SkBitmap::kA8_Config: |
| + ct = kAlpha_8_SkColorType; |
| + break; |
| + case SkBitmap::kIndex8_Config: |
| + ct = kIndex8_SkColorType; |
| + break; |
| + case SkBitmap::kRGB_565_Config: |
| + ct = kRGB_565_SkColorType; |
| + break; |
| + case SkBitmap::kARGB_4444_Config: |
| + ct = kARGB_4444_SkColorType; |
| + break; |
| + case SkBitmap::kARGB_8888_Config: |
| + ct = kPMColor_SkColorType; |
| + break; |
| + } |
| + if (ctOut) { |
| + *ctOut = ct; |
| + } |
| + return true; |
| +} |
| + |
| +bool SkBitmap::asImageInfo(SkImageInfo* info) const { |
| + SkColorType ct; |
| + if (!config2ColorType(this->config(), &ct)) { |
| + return false; |
| + } |
| + if (info) { |
| + info->fWidth = fWidth; |
| + info->fHeight = fHeight; |
| + info->fAlphaType = this->alphaType(); |
| + info->fColorType = ct; |
| + } |
| + return true; |
| +} |
| + |
| SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, size_t offset) { |
| // do this first, we that we never have a non-zero offset with a null ref |
| if (NULL == pr) { |
| @@ -411,10 +452,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();) |
| @@ -479,17 +530,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); |
|
mtklein
2013/12/06 14:44:34
ctable looks so lonely on this line
|
| + 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; |
| @@ -1596,6 +1649,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); |