| Index: src/image/SkImage_Raster.cpp
|
| diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
|
| index e3ecd6875f74dd2544e8390e492dc2cf49232623..1165d1422625c7f0f6522e8e5951afad806c32ea 100644
|
| --- a/src/image/SkImage_Raster.cpp
|
| +++ b/src/image/SkImage_Raster.cpp
|
| @@ -6,11 +6,12 @@
|
| */
|
|
|
| #include "SkImage_Base.h"
|
| -#include "SkImagePriv.h"
|
| #include "SkBitmap.h"
|
| #include "SkCanvas.h"
|
| #include "SkData.h"
|
| #include "SkImageGenerator.h"
|
| +#include "SkImagePriv.h"
|
| +#include "SkPixelRef.h"
|
| #include "SkSurface.h"
|
|
|
| class SkImage_Raster : public SkImage_Base {
|
| @@ -60,7 +61,8 @@ public:
|
| bool getROPixels(SkBitmap*) const SK_OVERRIDE;
|
|
|
| // exposed for SkSurface_Raster via SkNewImageFromPixelRef
|
| - SkImage_Raster(const SkImageInfo&, SkPixelRef*, size_t rowBytes, const SkSurfaceProps*);
|
| + SkImage_Raster(const SkImageInfo&, SkPixelRef*, const SkIPoint& pixelRefOrigin, size_t rowBytes,
|
| + const SkSurfaceProps*);
|
|
|
| SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); }
|
|
|
| @@ -102,12 +104,12 @@ SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes,
|
| fBitmap.lockPixels();
|
| }
|
|
|
| -SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes,
|
| - const SkSurfaceProps* props)
|
| +SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, const SkIPoint& pixelRefOrigin,
|
| + size_t rowBytes, const SkSurfaceProps* props)
|
| : INHERITED(info.width(), info.height(), props)
|
| {
|
| fBitmap.setInfo(info, rowBytes);
|
| - fBitmap.setPixelRef(pr);
|
| + fBitmap.setPixelRef(pr, pixelRefOrigin);
|
| fBitmap.lockPixels();
|
| }
|
|
|
| @@ -193,12 +195,37 @@ SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
|
| return SkNEW_ARGS(SkImage_Raster, (bitmap, NULL));
|
| }
|
|
|
| -SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, size_t rowBytes,
|
| +SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
|
| + const SkIPoint& pixelRefOrigin, size_t rowBytes,
|
| const SkSurfaceProps* props) {
|
| if (!SkImage_Raster::ValidArgs(info, rowBytes)) {
|
| return NULL;
|
| }
|
| - return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes, props));
|
| + return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props));
|
| +}
|
| +
|
| +SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef,
|
| + const SkSurfaceProps* props) {
|
| + if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes())) {
|
| + return NULL;
|
| + }
|
| +
|
| + SkImage* image = NULL;
|
| + if (canSharePixelRef || bm.isImmutable()) {
|
| + image = SkNEW_ARGS(SkImage_Raster, (bm, props));
|
| + } else {
|
| + bm.lockPixels();
|
| + if (bm.getPixels()) {
|
| + image = SkImage::NewRasterCopy(bm.info(), bm.getPixels(), bm.rowBytes());
|
| + }
|
| + bm.unlockPixels();
|
| +
|
| + // we don't expose props to NewRasterCopy (need a private vers) so post-init it here
|
| + if (image && props) {
|
| + as_IB(image)->initWithProps(*props);
|
| + }
|
| + }
|
| + return image;
|
| }
|
|
|
| const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {
|
|
|