diff options
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/SkImage.cpp | 3 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 15 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 35 |
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; } |