Index: src/gpu/SkGrPixelRef.cpp |
diff --git a/src/gpu/SkGrPixelRef.cpp b/src/gpu/SkGrPixelRef.cpp |
index dc5d7558f0d7a3e5c0294ec59f08f1622ef0ea16..882995e088013d6674efc7317cddc0aa78ee126e 100644 |
--- a/src/gpu/SkGrPixelRef.cpp |
+++ b/src/gpu/SkGrPixelRef.cpp |
@@ -18,16 +18,14 @@ |
// to avoid deadlock with the default one provided by SkPixelRef. |
SK_DECLARE_STATIC_MUTEX(gROLockPixelsPixelRefMutex); |
-SkROLockPixelsPixelRef::SkROLockPixelsPixelRef() : INHERITED(&gROLockPixelsPixelRefMutex) { |
+SkROLockPixelsPixelRef::SkROLockPixelsPixelRef(const SkImageInfo& info) |
+ : INHERITED(info, &gROLockPixelsPixelRefMutex) { |
} |
SkROLockPixelsPixelRef::~SkROLockPixelsPixelRef() { |
} |
-void* SkROLockPixelsPixelRef::onLockPixels(SkColorTable** ctable) { |
- if (ctable) { |
- *ctable = NULL; |
- } |
+bool SkROLockPixelsPixelRef::onNewLockPixels(LockRec* rec) { |
fBitmap.reset(); |
// SkDebugf("---------- calling readpixels in support of lockpixels\n"); |
if (!this->onReadPixels(&fBitmap, NULL)) { |
@@ -35,7 +33,14 @@ void* SkROLockPixelsPixelRef::onLockPixels(SkColorTable** ctable) { |
return NULL; |
} |
fBitmap.lockPixels(); |
- return fBitmap.getPixels(); |
+ if (NULL == fBitmap.getPixels()) { |
+ return false; |
+ } |
+ |
+ rec->fPixels = fBitmap.getPixels(); |
+ rec->fColorTable = NULL; |
+ rec->fRowBytes = fBitmap.rowBytes(); |
+ return true; |
} |
void SkROLockPixelsPixelRef::onUnlockPixels() { |
@@ -76,6 +81,14 @@ static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, SkBitmap::Config |
desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; |
desc.fConfig = SkBitmapConfig2GrPixelConfig(dstConfig); |
+ SkImageInfo info; |
+ if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) { |
+ return NULL; |
+ } |
+ info.fWidth = desc.fWidth; |
+ info.fHeight = desc.fHeight; |
+ info.fAlphaType = kPremul_SkAlphaType; |
+ |
GrTexture* dst = context->createUncachedTexture(desc, NULL, 0); |
if (NULL == dst) { |
return NULL; |
@@ -93,14 +106,17 @@ static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, SkBitmap::Config |
dst->releaseRenderTarget(); |
#endif |
- SkGrPixelRef* pixelRef = SkNEW_ARGS(SkGrPixelRef, (dst)); |
+ SkGrPixelRef* pixelRef = SkNEW_ARGS(SkGrPixelRef, (info, dst)); |
SkSafeUnref(dst); |
return pixelRef; |
} |
/////////////////////////////////////////////////////////////////////////////// |
-SkGrPixelRef::SkGrPixelRef(GrSurface* surface, bool transferCacheLock) { |
+SkGrPixelRef::SkGrPixelRef(const SkImageInfo& info, GrSurface* surface, |
+ bool transferCacheLock) |
+ : INHERITED(info) |
+{ |
// TODO: figure out if this is responsible for Chrome canvas errors |
#if 0 |
// The GrTexture has a ref to the GrRenderTarget but not vice versa. |