Chromium Code Reviews| Index: src/core/SkBitmap.cpp |
| diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
| index 2fae75ae3841dd39d53c305ee83f70b8ae806fe5..3161fcd4bbf49f35c63ebf129c1e012b8eb8e9d3 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) { |
| @@ -418,10 +449,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::Create(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();) |
| @@ -486,17 +527,18 @@ 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::Allocate(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; |
| @@ -1021,7 +1063,6 @@ bool SkBitmap::canCopyTo(Config dstConfig) const { |
| case kRGB_565_Config: |
| case kARGB_8888_Config: |
| break; |
| - case kA1_Config: |
| case kIndex8_Config: |
| if (!sameConfigs) { |
| return false; |
| @@ -1029,6 +1070,7 @@ bool SkBitmap::canCopyTo(Config dstConfig) const { |
| break; |
| case kARGB_4444_Config: |
| return sameConfigs || kARGB_8888_Config == this->config(); |
| + case kA1_Config: |
|
scroggo
2013/11/20 21:04:28
This change seems to be unrelated.
reed1
2013/11/20 21:27:18
It was needed to keep unittests passing, given tha
scroggo
2013/11/20 21:35:19
sgtm. Can you add the deprecation of A1 to the cha
|
| default: |
| return false; |
| } |