aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-06-18 13:41:40 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-06-18 13:41:40 -0700
commitde49988bc24977f97bb1da8c17ceee5432fcc8e7 (patch)
treec714ed2bda1b676964d804b4e8e7cc393db3d627 /src/image
parentd7395d82d53202e831d9f1c73f7a0196883f0c1f (diff)
add callbacks to Images that wrap client-provided content
Diffstat (limited to 'src/image')
-rw-r--r--src/image/SkImage.cpp3
-rw-r--r--src/image/SkImage_Gpu.cpp15
-rw-r--r--src/image/SkImage_Raster.cpp35
3 files changed, 38 insertions, 15 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 520255776f..66756cb512 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -205,7 +205,8 @@ SkImage* SkImage_Base::onNewImage(int newWidth, int newHeight, const SkIRect* su
#if !SK_SUPPORT_GPU
-SkImage* SkImage::NewFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType) {
+SkImage* SkImage::NewFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType,
+ TextureReleaseProc, ReleaseContext) {
return NULL;
}
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 281f762dff..973f4ba304 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -115,7 +115,9 @@ bool SkImage_Gpu::onReadPixels(const SkImageInfo& info, void* pixels, size_t row
///////////////////////////////////////////////////////////////////////////////////////////////////
static SkImage* new_wrapped_texture_common(GrContext* ctx, const GrBackendTextureDesc& desc,
- SkAlphaType at, GrWrapOwnership ownership) {
+ SkAlphaType at, GrWrapOwnership ownership,
+ SkImage::TextureReleaseProc releaseProc,
+ SkImage::ReleaseContext releaseCtx) {
if (desc.fWidth <= 0 || desc.fHeight <= 0) {
return NULL;
}
@@ -123,18 +125,23 @@ static SkImage* new_wrapped_texture_common(GrContext* ctx, const GrBackendTextur
if (!tex) {
return NULL;
}
+ if (releaseProc) {
+ tex->setRelease(releaseProc, releaseCtx);
+ }
+
const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted;
return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, tex, 0, budgeted));
}
-SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at) {
- return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership);
+SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at,
+ TextureReleaseProc releaseP, ReleaseContext releaseC) {
+ return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, releaseP, releaseC);
}
SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDesc& desc,
SkAlphaType at) {
- return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership);
+ return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, NULL, NULL);
}
SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& srcDesc,
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 20ae62c9f7..2b64839bc5 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -16,9 +16,8 @@
class SkImage_Raster : public SkImage_Base {
public:
- static bool ValidArgs(const Info& info, size_t rowBytes) {
+ static bool ValidArgs(const Info& info, size_t rowBytes, size_t* minSize) {
const int maxDimension = SK_MaxS32 >> 2;
- const size_t kMaxPixelByteSize = SK_MaxS32;
if (info.width() <= 0 || info.height() <= 0) {
return false;
@@ -43,10 +42,14 @@ public:
return false;
}
- int64_t size = (int64_t)info.height() * rowBytes;
- if (size > (int64_t)kMaxPixelByteSize) {
+ size_t size = info.getSafeSize(rowBytes);
+ if (0 == size) {
return false;
}
+
+ if (minSize) {
+ *minSize = size;
+ }
return true;
}
@@ -146,23 +149,24 @@ bool SkImage_Raster::getROPixels(SkBitmap* dst) const {
///////////////////////////////////////////////////////////////////////////////
SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, size_t rowBytes) {
- if (!SkImage_Raster::ValidArgs(info, rowBytes) || !pixels) {
+ size_t size;
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) {
return NULL;
}
// Here we actually make a copy of the caller's pixel data
- SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.height() * rowBytes));
+ SkAutoDataUnref data(SkData::NewWithCopy(pixels, size));
return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL));
}
SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t rowBytes) {
- if (!SkImage_Raster::ValidArgs(info, rowBytes) || !data) {
+ size_t size;
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !data) {
return NULL;
}
// did they give us enough data?
- size_t size = info.height() * rowBytes;
if (data->size() < size) {
return NULL;
}
@@ -170,6 +174,17 @@ SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t ro
return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL));
}
+SkImage* SkImage::NewFromRaster(const SkImageInfo& info, const void* pixels, size_t rowBytes,
+ RasterReleaseProc proc, ReleaseContext ctx) {
+ size_t size;
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) {
+ return NULL;
+ }
+
+ SkAutoDataUnref data(SkData::NewWithProc(pixels, size, proc, ctx));
+ return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL));
+}
+
SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
SkBitmap bitmap;
if (!SkInstallDiscardablePixelRef(generator, &bitmap)) {
@@ -185,7 +200,7 @@ SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
const SkIPoint& pixelRefOrigin, size_t rowBytes,
const SkSurfaceProps* props) {
- if (!SkImage_Raster::ValidArgs(info, rowBytes)) {
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL)) {
return NULL;
}
return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props));
@@ -193,7 +208,7 @@ SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef,
const SkSurfaceProps* props) {
- if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes())) {
+ if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL)) {
return NULL;
}