diff options
author | 2014-02-06 14:11:56 +0000 | |
---|---|---|
committer | 2014-02-06 14:11:56 +0000 | |
commit | 4f7c61583b16e3056cf3350fcef42dcc6d3483b7 (patch) | |
tree | a88af2149ff7f8f08be9479321b30aba859bc2ce /src/image/SkImage_Raster.cpp | |
parent | 999da9c5e45fb533efe8782c9096794b9ad1c1b3 (diff) |
add ways to peer into an image to get its pixels
BUG=skia:
R=bsalomon@google.com, scroggo@google.com
Review URL: https://codereview.chromium.org/155763004
git-svn-id: http://skia.googlecode.com/svn/trunk@13339 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/image/SkImage_Raster.cpp')
-rw-r--r-- | src/image/SkImage_Raster.cpp | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index ab8a635c1c..262fb97bfa 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -55,6 +55,8 @@ public: virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE; virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, const SkPaint*) SK_OVERRIDE; + virtual bool onReadPixels(SkBitmap*, const SkIRect&) const SK_OVERRIDE; + virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const SK_OVERRIDE; virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE; // exposed for SkSurface_Raster via SkNewImageFromPixelRef @@ -82,13 +84,20 @@ SkImage* SkImage_Raster::NewEmpty() { return gEmpty; } +static void release_data(void* addr, void* context) { + SkData* data = static_cast<SkData*>(context); + data->unref(); +} + SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes) - : INHERITED(info.fWidth, info.fHeight) { - fBitmap.setConfig(info, rowBytes); - SkAutoTUnref<SkPixelRef> ref( - SkMallocPixelRef::NewWithData(info, rowBytes, NULL, data, 0)); - fBitmap.setPixelRef(ref); + : INHERITED(info.fWidth, info.fHeight) +{ + data->ref(); + void* addr = const_cast<void*>(data->data()); + + fBitmap.installPixels(info, addr, rowBytes, release_data, data); fBitmap.setImmutable(); + fBitmap.lockPixels(); } SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes) @@ -96,6 +105,7 @@ SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes { fBitmap.setConfig(info, rowBytes); fBitmap.setPixelRef(pr); + fBitmap.lockPixels(); } SkImage_Raster::~SkImage_Raster() {} @@ -104,10 +114,34 @@ void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPa canvas->drawBitmap(fBitmap, x, y, paint); } -void SkImage_Raster::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, const SkPaint* paint) { +void SkImage_Raster::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, + const SkRect& dst, const SkPaint* paint) { canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); } +bool SkImage_Raster::onReadPixels(SkBitmap* dst, const SkIRect& subset) const { + if (dst->pixelRef()) { + return this->INHERITED::onReadPixels(dst, subset); + } else { + SkBitmap src; + if (!fBitmap.extractSubset(&src, subset)) { + return false; + } + return src.copyTo(dst, src.config()); + } +} + +const void* SkImage_Raster::onPeekPixels(SkImageInfo* infoPtr, + size_t* rowBytesPtr) const { + SkImageInfo info; + if (!fBitmap.asImageInfo(&info) || !fBitmap.getPixels()) { + return false; + } + *infoPtr = info; + *rowBytesPtr = fBitmap.rowBytes(); + return fBitmap.getPixels(); +} + bool SkImage_Raster::getROPixels(SkBitmap* dst) const { *dst = fBitmap; return true; |