Revert ""Revert of eliminate config param -- it was always self's config (https://codereview.chromium.org/246513002/)"""

This reverts commit 3dbceb4f8283b2fb1728d0daf010d036099a2eae.

BUG=skia:
R=bsalomon@google.com, robertphillips@google.com

Author: reed@google.com

Review URL: https://codereview.chromium.org/291163005

git-svn-id: http://skia.googlecode.com/svn/trunk@14806 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2014-05-20 17:08:12 +00:00
parent 93d5355447
commit 731b28daaa
4 changed files with 21 additions and 31 deletions

View File

@ -223,14 +223,13 @@ public:
/** /**
* Makes a deep copy of this PixelRef, respecting the requested config. * Makes a deep copy of this PixelRef, respecting the requested config.
* @param config Desired config.
* @param subset Subset of this PixelRef to copy. Must be fully contained within the bounds of * @param subset Subset of this PixelRef to copy. Must be fully contained within the bounds of
* of this PixelRef. * of this PixelRef.
* @return A new SkPixelRef, or NULL if either there is an error (e.g. the destination could * @return A new SkPixelRef, or NULL if either there is an error (e.g. the destination could
* not be created with the given config), or this PixelRef does not support deep * not be created with the given config), or this PixelRef does not support deep
* copies. * copies.
*/ */
virtual SkPixelRef* deepCopy(SkBitmap::Config config, const SkIRect* subset = NULL) { virtual SkPixelRef* deepCopy(const SkIRect* subset = NULL) {
return NULL; return NULL;
} }

View File

@ -56,7 +56,7 @@ public:
protected: protected:
// overrides from SkPixelRef // overrides from SkPixelRef
virtual bool onReadPixels(SkBitmap* dst, const SkIRect* subset) SK_OVERRIDE; virtual bool onReadPixels(SkBitmap* dst, const SkIRect* subset) SK_OVERRIDE;
virtual SkPixelRef* deepCopy(SkBitmap::Config dstConfig, const SkIRect* subset) SK_OVERRIDE; virtual SkPixelRef* deepCopy(const SkIRect* subset) SK_OVERRIDE;
private: private:
GrSurface* fSurface; GrSurface* fSurface;

View File

@ -315,7 +315,14 @@ SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) {
const SkImageInfo& prInfo = pr->info(); const SkImageInfo& prInfo = pr->info();
SkASSERT(info.fWidth <= prInfo.fWidth); SkASSERT(info.fWidth <= prInfo.fWidth);
SkASSERT(info.fHeight <= prInfo.fHeight); 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) { switch (prInfo.fAlphaType) {
case kIgnore_SkAlphaType: case kIgnore_SkAlphaType:
SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType); SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType);
@ -885,7 +892,7 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const {
if (fPixelRef->getTexture() != NULL) { if (fPixelRef->getTexture() != NULL) {
// Do a deep copy // Do a deep copy
SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset); SkPixelRef* pixelRef = fPixelRef->deepCopy(&subset);
if (pixelRef != NULL) { if (pixelRef != NULL) {
SkBitmap dst; SkBitmap dst;
dst.setConfig(this->config(), subset.width(), subset.height(), 0, 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 { bool SkBitmap::deepCopyTo(SkBitmap* dst) const {
const SkBitmap::Config dstConfig = this->config(); const SkColorType dstCT = this->colorType();
const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig);
if (!this->canCopyTo(dstCT)) { if (!this->canCopyTo(dstCT)) {
return false; return false;
@ -1095,27 +1101,13 @@ bool SkBitmap::deepCopyTo(SkBitmap* dst) const {
// If we have a PixelRef, and it supports deep copy, use it. // If we have a PixelRef, and it supports deep copy, use it.
// Currently supported only by texture-backed bitmaps. // Currently supported only by texture-backed bitmaps.
if (fPixelRef) { if (fPixelRef) {
SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig); SkAutoTUnref<SkPixelRef> pixelRef(fPixelRef->deepCopy());
if (pixelRef) { if (pixelRef.get()) {
uint32_t rowBytes; pixelRef->cloneGenID(*fPixelRef);
if (this->colorType() == dstCT) { if (!dst->setConfig(pixelRef->info(), fRowBytes)) {
// 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)) {
return false; return false;
} }
dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); dst->setPixelRef(pixelRef, fPixelRefOrigin);
return true; return true;
} }
} }

View File

@ -51,8 +51,7 @@ bool SkROLockPixelsPixelRef::onLockPixelsAreWritable() const {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, SkBitmap::Config dstConfig, static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, const SkIRect* subset) {
const SkIRect* subset) {
if (NULL == texture) { if (NULL == texture) {
return NULL; return NULL;
} }
@ -77,7 +76,7 @@ static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, SkBitmap::Config
topLeft = NULL; topLeft = NULL;
} }
desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit;
desc.fConfig = SkBitmapConfig2GrPixelConfig(dstConfig); desc.fConfig = texture->config();
SkImageInfo info; SkImageInfo info;
if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) { if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) {
@ -152,7 +151,7 @@ GrTexture* SkGrPixelRef::getTexture() {
return NULL; return NULL;
} }
SkPixelRef* SkGrPixelRef::deepCopy(SkBitmap::Config dstConfig, const SkIRect* subset) { SkPixelRef* SkGrPixelRef::deepCopy(const SkIRect* subset) {
if (NULL == fSurface) { if (NULL == fSurface) {
return NULL; return NULL;
} }
@ -163,7 +162,7 @@ SkPixelRef* SkGrPixelRef::deepCopy(SkBitmap::Config dstConfig, const SkIRect* su
// a GrTexture owned elsewhere (e.g., SkGpuDevice), and cannot live // a GrTexture owned elsewhere (e.g., SkGpuDevice), and cannot live
// independently of that texture. Texture-backed pixel refs, on the other // independently of that texture. Texture-backed pixel refs, on the other
// hand, own their GrTextures, and are thus self-contained. // hand, own their GrTextures, and are thus self-contained.
return copyToTexturePixelRef(fSurface->asTexture(), dstConfig, subset); return copyToTexturePixelRef(fSurface->asTexture(), subset);
} }
bool SkGrPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) { bool SkGrPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {