Adds read pixels to GrTexture and GrRenderTarget
Adds SkGrRenderTargetPixelRef for SkBitmaps that are backed by RTs that aren't textures.
Adds onReadPixels implementations for SkGr pixel ref types
git-svn-id: http://skia.googlecode.com/svn/trunk@1056 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index a9b9c99..c19e84d 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -869,10 +869,7 @@
SkBitmap tmpSrc;
const SkBitmap* src = this;
- if (this->getTexture()) {
- if (!fPixelRef->readPixels(&tmpSrc)) {
- return false;
- }
+ if (fPixelRef && fPixelRef->readPixels(&tmpSrc)) {
SkASSERT(tmpSrc.width() == this->width());
SkASSERT(tmpSrc.height() == this->height());
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index ce48be6..76777f0 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -171,11 +171,15 @@
this->width(), this->height());
GrAssert(false);
}
- } else if (Current3DApiRenderTarget() == renderTargetOrNull) {
- fRenderTarget = fContext->createRenderTargetFrom3DApiState();
} else {
- fRenderTarget = renderTargetOrNull;
- fRenderTarget->ref();
+ if (Current3DApiRenderTarget() == renderTargetOrNull) {
+ fRenderTarget = fContext->createRenderTargetFrom3DApiState();
+ } else {
+ fRenderTarget = renderTargetOrNull;
+ fRenderTarget->ref();
+ }
+ SkGrRenderTargetPixelRef* pr = new SkGrRenderTargetPixelRef(fRenderTarget);
+ this->setPixelRef(pr, 0)->unref();
}
}
@@ -233,15 +237,12 @@
}
SkAutoLockPixels alp(tmp);
- fContext->setRenderTarget(fRenderTarget);
- // we aren't setting the clip or matrix, so mark as dirty
- // we don't need to set them for this call and don't have them anyway
- fNeedPrepareRenderTarget = true;
- if (!fContext->readPixels(bounds.fLeft, bounds.fTop,
- bounds.width(), bounds.height(),
- GrTexture::kRGBA_8888_PixelConfig,
- tmp.getPixels())) {
+ if (!fContext->readRenderTargetPixels(fRenderTarget,
+ bounds.fLeft, bounds.fTop,
+ bounds.width(), bounds.height(),
+ kRGBA_8888_GrPixelConfig,
+ tmp.getPixels())) {
return false;
}
@@ -254,8 +255,8 @@
if (!bitmap.readyToDraw()) {
return;
}
- GrTexture::PixelConfig config = SkGr::BitmapConfig2PixelConfig(bitmap.config(),
- bitmap.isOpaque());
+ GrPixelConfig config = SkGr::BitmapConfig2PixelConfig(bitmap.config(),
+ bitmap.isOpaque());
fContext->setRenderTarget(fRenderTarget);
// we aren't setting the clip or matrix, so mark as dirty
// we don't need to set them for this call and don't have them anyway
@@ -709,7 +710,7 @@
GrGpu::kNone_AALevel,
dstM.fBounds.width(),
dstM.fBounds.height(),
- GrTexture::kAlpha_8_PixelConfig
+ kAlpha_8_GrPixelConfig
};
GrTexture* texture = context->createUncachedTexture(desc, dstM.fImage,
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 630c3f4..e7e2365 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -213,25 +213,25 @@
///////////////////////////////////////////////////////////////////////////////
-GrTexture::PixelConfig SkGr::BitmapConfig2PixelConfig(SkBitmap::Config config,
+GrPixelConfig SkGr::BitmapConfig2PixelConfig(SkBitmap::Config config,
bool isOpaque) {
switch (config) {
case SkBitmap::kA8_Config:
- return GrTexture::kAlpha_8_PixelConfig;
+ return kAlpha_8_GrPixelConfig;
case SkBitmap::kIndex8_Config:
- return GrTexture::kIndex_8_PixelConfig;
+ return kIndex_8_GrPixelConfig;
case SkBitmap::kRGB_565_Config:
- return GrTexture::kRGB_565_PixelConfig;
+ return kRGB_565_GrPixelConfig;
case SkBitmap::kARGB_4444_Config:
- return GrTexture::kRGBA_4444_PixelConfig;
+ return kRGBA_4444_GrPixelConfig;
case SkBitmap::kARGB_8888_Config:
if (isOpaque) {
- return GrTexture::kRGBX_8888_PixelConfig;
+ return kRGBX_8888_GrPixelConfig;
} else {
- return GrTexture::kRGBA_8888_PixelConfig;
+ return kRGBA_8888_GrPixelConfig;
}
default:
- return GrTexture::kUnknown_PixelConfig;
+ return kUnknown_GrPixelConfig;
}
}
diff --git a/src/gpu/SkGrTexturePixelRef.cpp b/src/gpu/SkGrTexturePixelRef.cpp
index de19f1d..2b173f1 100644
--- a/src/gpu/SkGrTexturePixelRef.cpp
+++ b/src/gpu/SkGrTexturePixelRef.cpp
@@ -16,8 +16,12 @@
#include "SkGrTexturePixelRef.h"
+
#include "GrTexture.h"
+#include "SkRect.h"
+#include "SkBitmap.h"
+
SkGrTexturePixelRef::SkGrTexturePixelRef(GrTexture* tex) {
fTexture = tex;
GrSafeRef(tex);
@@ -28,6 +32,71 @@
}
bool SkGrTexturePixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {
- return false;
+ if (NULL != fTexture && fTexture->isValid()) {
+ int left, top, width, height;
+ if (NULL != subset) {
+ left = subset->fLeft;
+ width = subset->width();
+ top = subset->fTop;
+ height = subset->height();
+ } else {
+ left = 0;
+ width = fTexture->width();
+ top = 0;
+ height = fTexture->height();
+ }
+ dst->setConfig(SkBitmap::kARGB_8888_Config, width, height);
+ dst->allocPixels();
+ SkAutoLockPixels al(*dst);
+ void* buffer = dst->getPixels();
+ return fTexture->readPixels(left, top, width, height,
+ kRGBA_8888_GrPixelConfig,
+ buffer);
+ } else {
+ return false;
+ }
}
+////////////////////////////////////////////////////////////////////////////////
+
+SkGrRenderTargetPixelRef::SkGrRenderTargetPixelRef(GrRenderTarget* rt) {
+ fRenderTarget = rt;
+ GrSafeRef(fRenderTarget);
+}
+
+SkGrRenderTargetPixelRef::~SkGrRenderTargetPixelRef() {
+ GrSafeUnref(fRenderTarget);
+}
+
+SkGpuTexture* SkGrRenderTargetPixelRef::getTexture() {
+ if (NULL != fRenderTarget) {
+ return (SkGpuTexture*) fRenderTarget->asTexture();
+ }
+ return NULL;
+}
+
+bool SkGrRenderTargetPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {
+ if (NULL != fRenderTarget && fRenderTarget->isValid()) {
+ int left, top, width, height;
+ if (NULL != subset) {
+ left = subset->fLeft;
+ width = subset->width();
+ top = subset->fTop;
+ height = subset->height();
+ } else {
+ left = 0;
+ width = fRenderTarget->width();
+ top = 0;
+ height = fRenderTarget->height();
+ }
+ dst->setConfig(SkBitmap::kARGB_8888_Config, width, height);
+ dst->allocPixels();
+ SkAutoLockPixels al(*dst);
+ void* buffer = dst->getPixels();
+ return fRenderTarget->readPixels(left, top, width, height,
+ kRGBA_8888_GrPixelConfig,
+ buffer);
+ } else {
+ return false;
+ }
+}
\ No newline at end of file