Index: src/core/SkBitmap.cpp |
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
index 84f363e564f2a7a46e6928c430d2744dca88bb46..9fb041ff8e7fc56947fc3a2f3a2c74bdb9d97464 100644 |
--- a/src/core/SkBitmap.cpp |
+++ b/src/core/SkBitmap.cpp |
@@ -315,7 +315,14 @@ SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) { |
const SkImageInfo& prInfo = pr->info(); |
SkASSERT(info.fWidth <= prInfo.fWidth); |
SkASSERT(info.fHeight <= prInfo.fHeight); |
- SkASSERT(info.fColorType == prInfo.fColorType); |
+ // We can't always assert that the two colortypes are the same, since ganesh is free |
+ // to change the 32bit swizzles as needed (e.g. RGBA <--> BGRA), so we have a softer |
+ // check. |
+ // |
+ // TODO: perhaps setPixelRef should just overwrite the values in the the bitmap anyway. |
+ if (info.fColorType != prInfo.fColorType) { |
+ SkASSERT(4 == info.bytesPerPixel() && 4 == prInfo.bytesPerPixel()); |
+ } |
switch (prInfo.fAlphaType) { |
case kIgnore_SkAlphaType: |
SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType); |
@@ -885,7 +892,7 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const { |
if (fPixelRef->getTexture() != NULL) { |
// Do a deep copy |
- SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset); |
+ SkPixelRef* pixelRef = fPixelRef->deepCopy(&subset); |
if (pixelRef != NULL) { |
SkBitmap dst; |
dst.setConfig(this->config(), subset.width(), subset.height(), 0, |
@@ -1085,8 +1092,7 @@ bool SkBitmap::copyTo(SkBitmap* dst, SkColorType dstColorType, |
} |
bool SkBitmap::deepCopyTo(SkBitmap* dst) const { |
- const SkBitmap::Config dstConfig = this->config(); |
- const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig); |
+ const SkColorType dstCT = this->colorType(); |
if (!this->canCopyTo(dstCT)) { |
return false; |
@@ -1095,27 +1101,13 @@ bool SkBitmap::deepCopyTo(SkBitmap* dst) const { |
// 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(dstConfig); |
- if (pixelRef) { |
- 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; |
- info.fColorType = dstCT; |
- if (!dst->setConfig(info, rowBytes)) { |
+ SkAutoTUnref<SkPixelRef> pixelRef(fPixelRef->deepCopy()); |
+ if (pixelRef.get()) { |
+ pixelRef->cloneGenID(*fPixelRef); |
+ if (!dst->setConfig(pixelRef->info(), fRowBytes)) { |
return false; |
} |
- dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); |
+ dst->setPixelRef(pixelRef, fPixelRefOrigin); |
return true; |
} |
} |