Chromium Code Reviews| Index: src/core/SkBitmap.cpp |
| diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
| index 2fae75ae3841dd39d53c305ee83f70b8ae806fe5..626499ad40e2bd86e2c2bf6cc4541763f0233448 100644 |
| --- a/src/core/SkBitmap.cpp |
| +++ b/src/core/SkBitmap.cpp |
| @@ -368,6 +368,37 @@ void SkBitmap::updatePixelsFromRef() const { |
| } |
| } |
| +bool SkBitmap::asImageInfo(SkImageInfo* info) const { |
| + SkColorType ct; |
| + switch (this->config()) { |
| + case kNo_Config: |
| + case kA1_Config: |
| + return false; |
| + case kA8_Config: |
| + ct = kAlpha_8_SkColorType; |
| + break; |
| + case kIndex8_Config: |
| + ct = kIndex8_SkColorType; |
| + break; |
| + case kRGB_565_Config: |
| + ct = kRGB_565_SkColorType; |
| + break; |
| + case kARGB_4444_Config: |
| + ct = kARGB_4444_SkColorType; |
| + break; |
| + case kARGB_8888_Config: |
| + ct = kPMColor_SkColorType; |
| + break; |
| + } |
| + 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) { |
| @@ -421,7 +452,12 @@ void SkBitmap::setPixels(void* p, SkColorTable* ctable) { |
| Sk64 size = this->getSize64(); |
| SkASSERT(!size.isNeg() && size.is32()); |
| - this->setPixelRef(new SkMallocPixelRef(p, size.get32(), ctable, false))->unref(); |
| + SkImageInfo info; |
| + if (!this->asImageInfo(&info)) { |
| + this->setPixelRef(NULL, 0); |
| + return; |
| + } |
| + this->setPixelRef(new SkMallocPixelRef(info, p, fRowBytes, ctable, false))->unref(); |
|
scroggo
2013/11/19 18:17:09
SkNEW_ARGS
reed1
2013/11/20 20:56:56
Done.
|
| // since we're already allocated, we lockPixels right away |
| this->lockPixels(); |
| SkDEBUGCODE(this->validate();) |
| @@ -491,12 +527,20 @@ bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst, |
| return false; |
| } |
| + 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) { |
| return false; |
| } |
| - dst->setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))->unref(); |
| + SkPixelRef* pr = SkNEW_ARGS(SkMallocPixelRef, |
| + (info, addr, dst->rowBytes(), ctable, true)); |
| + dst->setPixelRef(pr, 0)->unref(); |
| // since we're already allocated, we lockPixels right away |
| dst->lockPixels(); |
| return true; |