Index: src/core/SkBitmap.cpp |
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
index 520ccd39f88755e896c2f32f0bf4df5dc9d3c264..32cb7b25cd57360cd94434a1e0dbc5de0d0a930c 100644 |
--- a/src/core/SkBitmap.cpp |
+++ b/src/core/SkBitmap.cpp |
@@ -982,32 +982,43 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const { |
#include "SkCanvas.h" |
#include "SkPaint.h" |
-bool SkBitmap::canCopyTo(Config dstConfig) const { |
- if (this->config() == kNo_Config) { |
+#ifdef SK_SUPPORT_LEGACY_COPYTO_CONFIG |
+bool SkBitmap::copyTo(SkBitmap* dst, Config c, Allocator* allocator) const { |
+ return this->copyTo(dst, SkBitmapConfigToSkColorType(c), allocator); |
+} |
+ |
+bool SkBitmap::canCopyTo(Config newConfig) const { |
+ return this->canCopyTo(SkBitmapConfigToSkColorType(c)); |
+} |
+#endif |
+ |
+bool SkBitmap::canCopyTo(SkColorType dstColorType) const { |
+ if (this->colorType() == kUnknown_SkColorType) { |
return false; |
} |
- bool sameConfigs = (this->config() == dstConfig); |
- switch (dstConfig) { |
- case kA8_Config: |
- case kRGB_565_Config: |
- case kARGB_8888_Config: |
+ bool sameConfigs = (this->colorType() == dstColorType); |
+ switch (dstColorType) { |
+ case kAlpha_8_SkColorType: |
+ case kRGB_565_SkColorType: |
+ case kPMColor_SkColorType: |
break; |
- case kIndex8_Config: |
+ case kIndex_8_SkColorType: |
if (!sameConfigs) { |
return false; |
} |
break; |
- case kARGB_4444_Config: |
- return sameConfigs || kARGB_8888_Config == this->config(); |
+ case kARGB_4444_SkColorType: |
+ return sameConfigs || kPMColor_SkColorType == this->colorType(); |
default: |
return false; |
} |
return true; |
} |
-bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
- if (!this->canCopyTo(dstConfig)) { |
+bool SkBitmap::copyTo(SkBitmap* dst, SkColorType dstColorType, |
+ Allocator* alloc) const { |
+ if (!this->canCopyTo(dstColorType)) { |
return false; |
} |
@@ -1024,7 +1035,7 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
SkASSERT(tmpSrc.height() == this->height()); |
// did we get lucky and we can just return tmpSrc? |
- if (tmpSrc.config() == dstConfig && NULL == alloc) { |
+ if (tmpSrc.colorType() == dstColorType && NULL == alloc) { |
dst->swap(tmpSrc); |
// If the result is an exact copy, clone the gen ID. |
if (dst->pixelRef() && dst->pixelRef()->info() == fPixelRef->info()) { |
@@ -1047,14 +1058,20 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
// The only way to be readyToDraw is if fPixelRef is non NULL. |
SkASSERT(fPixelRef != NULL); |
+ SkImageInfo dstInfo = src->info(); |
+ dstInfo.fColorType = dstColorType; |
+ |
SkBitmap tmpDst; |
- tmpDst.setConfig(dstConfig, src->width(), src->height(), 0, |
- src->alphaType()); |
+ if (!tmpDst.setConfig(dstInfo)) { |
+ return false; |
+ } |
// allocate colortable if srcConfig == kIndex8_Config |
- SkColorTable* ctable = (dstConfig == kIndex8_Config) ? |
- new SkColorTable(*src->getColorTable()) : NULL; |
- SkAutoUnref au(ctable); |
+ SkAutoTUnref<SkColorTable> ctable; |
+ if (dstColorType == kIndex_8_SkColorType) { |
+ // TODO: can we just ref() the src colortable? Is it reentrant-safe? |
+ ctable.reset(SkNEW_ARGS(SkColorTable, (*src->getColorTable()))); |
+ } |
if (!tmpDst.allocPixels(alloc, ctable)) { |
return false; |
} |
@@ -1070,7 +1087,7 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
/* do memcpy for the same configs cases, else use drawing |
*/ |
- if (src->config() == dstConfig) { |
+ if (src->colorType() == dstColorType) { |
if (tmpDst.getSize() == src->getSize()) { |
memcpy(tmpDst.getPixels(), src->getPixels(), src->getSafeSize()); |
SkPixelRef* pixelRef = tmpDst.pixelRef(); |
@@ -1102,8 +1119,8 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
dstP += tmpDst.rowBytes(); |
} |
} |
- } else if (SkBitmap::kARGB_4444_Config == dstConfig |
- && SkBitmap::kARGB_8888_Config == src->config()) { |
+ } else if (kARGB_4444_SkColorType == dstColorType |
+ && kPMColor_SkColorType == src->colorType()) { |
SkASSERT(src->height() == tmpDst.height()); |
SkASSERT(src->width() == tmpDst.width()); |
for (int y = 0; y < src->height(); ++y) { |
@@ -1134,7 +1151,7 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { |
const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig); |
- if (!this->canCopyTo(dstConfig)) { |
+ if (!this->canCopyTo(dstCT)) { |
return false; |
} |
@@ -1169,7 +1186,7 @@ bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { |
if (this->getTexture()) { |
return false; |
} else { |
- return this->copyTo(dst, dstConfig, NULL); |
+ return this->copyTo(dst, dstCT, NULL); |
} |
} |