Index: src/gpu/GrSurface.cpp |
diff --git a/src/gpu/GrSurface.cpp b/src/gpu/GrSurface.cpp |
index 9685c5627567589acf91685f706b2cb73b0efd3f..9bd9e8b5ef51b24290d80969e19dba961382d8da 100644 |
--- a/src/gpu/GrSurface.cpp |
+++ b/src/gpu/GrSurface.cpp |
@@ -13,6 +13,55 @@ |
#include "SkImageEncoder.h" |
#include <stdio.h> |
+template<typename T> static bool adjust_params(int surfaceWidth, |
+ int surfaceHeight, |
+ size_t bpp, |
+ int* left, int* top, int* width, int* height, |
+ T** data, |
+ size_t* rowBytes) { |
+ if (!*rowBytes) { |
+ *rowBytes = *width * bpp; |
+ } |
+ |
+ SkIRect subRect = SkIRect::MakeXYWH(*left, *top, *width, *height); |
+ SkIRect bounds = SkIRect::MakeWH(surfaceWidth, surfaceHeight); |
+ |
+ if (!subRect.intersect(bounds)) { |
+ return false; |
+ } |
+ *data = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(*data) + |
+ (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp); |
+ |
+ *left = subRect.fLeft; |
+ *top = subRect.fTop; |
+ *width = subRect.width(); |
+ *height = subRect.height(); |
+ return true; |
+} |
+ |
+bool GrSurfacePriv::AdjustReadPixelParams(int surfaceWidth, |
+ int surfaceHeight, |
+ size_t bpp, |
+ int* left, int* top, int* width, int* height, |
+ void** data, |
+ size_t* rowBytes) { |
+ return adjust_params<void>(surfaceWidth, surfaceHeight, bpp, left, top, width, height, data, |
+ rowBytes); |
+} |
+ |
+bool GrSurfacePriv::AdjustWritePixelParams(int surfaceWidth, |
+ int surfaceHeight, |
+ size_t bpp, |
+ int* left, int* top, int* width, int* height, |
+ const void** data, |
+ size_t* rowBytes) { |
+ return adjust_params<const void>(surfaceWidth, surfaceHeight, bpp, left, top, width, height, |
+ data, rowBytes); |
+} |
+ |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
bool GrSurface::writePixels(int left, int top, int width, int height, |
GrPixelConfig config, const void* buffer, size_t rowBytes, |
uint32_t pixelOpsFlags) { |
@@ -33,12 +82,8 @@ bool GrSurface::readPixels(int left, int top, int width, int height, |
if (NULL == context) { |
return false; |
} |
- GrRenderTarget* target = this->asRenderTarget(); |
- if (target) { |
- return context->readRenderTargetPixels(target, left, top, width, height, config, buffer, |
- rowBytes, pixelOpsFlags); |
- } |
- return false; |
+ return context->readSurfacePixels(this, left, top, width, height, config, buffer, |
+ rowBytes, pixelOpsFlags); |
} |
SkImageInfo GrSurface::info(SkAlphaType alphaType) const { |