aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkSurface.h29
-rw-r--r--src/image/SkSurface.cpp14
2 files changed, 43 insertions, 0 deletions
diff --git a/include/core/SkSurface.h b/include/core/SkSurface.h
index 0e238f8429..62d2252af1 100644
--- a/include/core/SkSurface.h
+++ b/include/core/SkSurface.h
@@ -212,6 +212,35 @@ public:
*/
const void* peekPixels(SkImageInfo* info, size_t* rowBytes);
+ /**
+ * Copy the pixels from the surface into the specified buffer (pixels + rowBytes),
+ * converting them into the requested format (dstInfo). The base-layer pixels are read
+ * starting at the specified (srcX,srcY) location in the coordinate system of the base-layer.
+ *
+ * The specified ImageInfo and (srcX,srcY) offset specifies a source rectangle
+ *
+ * srcR.setXYWH(srcX, srcY, dstInfo.width(), dstInfo.height());
+ *
+ * srcR is intersected with the bounds of the base-layer. If this intersection is not empty,
+ * then we have two sets of pixels (of equal size). Replace the dst pixels with the
+ * corresponding src pixels, performing any colortype/alphatype transformations needed
+ * (in the case where the src and dst have different colortypes or alphatypes).
+ *
+ * This call can fail, returning false, for several reasons:
+ * - If srcR does not intersect the surface bounds.
+ * - If the requested colortype/alphatype cannot be converted from the base-layer's types.
+ */
+ bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
+ int srcX, int srcY);
+
+ /**
+ * Helper for allocating pixels and then calling readPixels(info, ...). The bitmap is resized
+ * to the intersection of srcRect and the surface bounds (if srcRect is non-null).
+ * On success, pixels will be allocated in bitmap and true returned. On failure,
+ * false is returned and bitmap will be set to empty.
+ */
+ bool readPixels(SkBitmap* dst, const SkIRect* srcRect = NULL);
+
const SkSurfaceProps& props() const { return fProps; }
protected:
diff --git a/src/image/SkSurface.cpp b/src/image/SkSurface.cpp
index 3ca5747252..13b7d65546 100644
--- a/src/image/SkSurface.cpp
+++ b/src/image/SkSurface.cpp
@@ -170,6 +170,20 @@ const void* SkSurface::peekPixels(SkImageInfo* info, size_t* rowBytes) {
return this->getCanvas()->peekPixels(info, rowBytes);
}
+bool SkSurface::readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
+ int srcX, int srcY) {
+ return this->getCanvas()->readPixels(dstInfo, dstPixels, dstRowBytes, srcX, srcY);
+}
+
+bool SkSurface::readPixels(SkBitmap* dst, const SkIRect* srcRect) {
+ SkIRect storage;
+ if (NULL == srcRect) {
+ storage.set(0, 0, this->width(), this->height());
+ srcRect = &storage;
+ }
+ return this->getCanvas()->readPixels(*srcRect, dst);
+}
+
//////////////////////////////////////////////////////////////////////////////////////
#ifdef SK_SUPPORT_LEGACY_TEXTRENDERMODE