| 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;
|
| }
|
| }
|
|
|