| Index: src/core/SkBitmap.cpp
|
| diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
|
| index 2a8c8e45e2d47508a058d0d5256d8d6d206b01ce..72395172dace5fdffc5b31ee71f41787de7915ca 100644
|
| --- a/src/core/SkBitmap.cpp
|
| +++ b/src/core/SkBitmap.cpp
|
| @@ -946,7 +946,7 @@
|
|
|
| if (fPixelRef->getTexture() != NULL) {
|
| // Do a deep copy
|
| - SkPixelRef* pixelRef = fPixelRef->deepCopy(&subset);
|
| + SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset);
|
| if (pixelRef != NULL) {
|
| SkBitmap dst;
|
| dst.setConfig(this->config(), subset.width(), subset.height(), 0,
|
| @@ -1145,7 +1145,8 @@
|
| }
|
|
|
| bool SkBitmap::deepCopyTo(SkBitmap* dst) const {
|
| - const SkColorType dstCT = this->colorType();
|
| + const SkBitmap::Config dstConfig = this->config();
|
| + const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig);
|
|
|
| if (!this->canCopyTo(dstCT)) {
|
| return false;
|
| @@ -1154,15 +1155,24 @@
|
| // If we have a PixelRef, and it supports deep copy, use it.
|
| // Currently supported only by texture-backed bitmaps.
|
| if (fPixelRef) {
|
| - SkPixelRef* pixelRef = fPixelRef->deepCopy();
|
| + SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig);
|
| if (pixelRef) {
|
| - // Since there is no subset to pass to deepCopy, and deepCopy
|
| - // succeeded, the new pixel ref must be identical.
|
| - SkASSERT(fPixelRef->info() == pixelRef->info());
|
| - pixelRef->cloneGenID(*fPixelRef);
|
| + uint32_t rowBytes;
|
| + if (this->colorType() == dstCT) {
|
| + // Since there is no subset to pass to deepCopy, and deepCopy
|
| + // succeeded, the new pixel ref must be identical.
|
| + SkASSERT(fPixelRef->info() == pixelRef->info());
|
| + pixelRef->cloneGenID(*fPixelRef);
|
| + // Use the same rowBytes as the original.
|
| + rowBytes = fRowBytes;
|
| + } else {
|
| + // With the new config, an appropriate fRowBytes will be computed by setConfig.
|
| + rowBytes = 0;
|
| + }
|
|
|
| SkImageInfo info = fInfo;
|
| - if (!dst->setConfig(info, fRowBytes)) {
|
| + info.fColorType = dstCT;
|
| + if (!dst->setConfig(info, rowBytes)) {
|
| return false;
|
| }
|
| dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref();
|
|
|