diff options
-rw-r--r-- | gyp/core.gypi | 1 | ||||
-rw-r--r-- | gyp/tests.gypi | 1 | ||||
-rw-r--r-- | src/image/SkImagePriv.cpp | 36 | ||||
-rw-r--r-- | src/image/SkImagePriv.h | 4 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 41 | ||||
-rw-r--r-- | tests/SkImageTest.cpp | 49 |
6 files changed, 87 insertions, 45 deletions
diff --git a/gyp/core.gypi b/gyp/core.gypi index 4421f5da92..10db77259d 100644 --- a/gyp/core.gypi +++ b/gyp/core.gypi @@ -225,7 +225,6 @@ '<(skia_src_path)/doc/SkDocument.cpp', '<(skia_src_path)/image/SkImage.cpp', - '<(skia_src_path)/image/SkImagePriv.cpp', # '<(skia_src_path)/image/SkImage_Gpu.cpp', '<(skia_src_path)/image/SkImage_Raster.cpp', '<(skia_src_path)/image/SkSurface.cpp', diff --git a/gyp/tests.gypi b/gyp/tests.gypi index 53f3555a58..326736052a 100644 --- a/gyp/tests.gypi +++ b/gyp/tests.gypi @@ -195,6 +195,7 @@ '../tests/SizeTest.cpp', '../tests/Sk4xTest.cpp', '../tests/SkBase64Test.cpp', + '../tests/SkImageTest.cpp', '../tests/SkResourceCacheTest.cpp', '../tests/SmallAllocatorTest.cpp', '../tests/SortTest.cpp', diff --git a/src/image/SkImagePriv.cpp b/src/image/SkImagePriv.cpp deleted file mode 100644 index ad7b154e76..0000000000 --- a/src/image/SkImagePriv.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "SkImagePriv.h" -#include "SkImage_Base.h" -#include "SkCanvas.h" -#include "SkPicture.h" - -SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef, - const SkSurfaceProps* props) { - const SkImageInfo info = bm.info(); - if (kUnknown_SkColorType == info.colorType()) { - return NULL; - } - - SkImage* image = NULL; - if (canSharePixelRef || bm.isImmutable()) { - image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes(), props); - } else { - bm.lockPixels(); - if (bm.getPixels()) { - image = SkImage::NewRasterCopy(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; -} diff --git a/src/image/SkImagePriv.h b/src/image/SkImagePriv.h index 874476bbaf..1b2ae4f284 100644 --- a/src/image/SkImagePriv.h +++ b/src/image/SkImagePriv.h @@ -12,7 +12,9 @@ #include "SkSurface.h" // Call this if you explicitly want to use/share this pixelRef in the image -extern SkImage* SkNewImageFromPixelRef(const SkImageInfo&, SkPixelRef*, size_t rowBytes, +extern SkImage* SkNewImageFromPixelRef(const SkImageInfo&, SkPixelRef*, + const SkIPoint& pixelRefOrigin, + size_t rowBytes, const SkSurfaceProps*); /** diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index e3ecd6875f..1165d14226 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) { diff --git a/tests/SkImageTest.cpp b/tests/SkImageTest.cpp new file mode 100644 index 0000000000..80ba776af1 --- /dev/null +++ b/tests/SkImageTest.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkBitmapDevice.h" +#include "SkImagePriv.h" +#include "Test.h" + +static const int gWidth = 20; +static const int gHeight = 20; + +// Tests that SkNewImageFromBitmap obeys pixelref origin. +DEF_TEST(SkImageFromBitmap_extractSubset, reporter) { + SkAutoTUnref<SkImage> image; + { + SkBitmap srcBitmap; + srcBitmap.allocN32Pixels(gWidth, gHeight); + srcBitmap.eraseColor(SK_ColorRED); + SkBitmapDevice dev(srcBitmap); + SkCanvas canvas(&dev); + SkIRect r = SkIRect::MakeXYWH(5, 5, gWidth - 5, gWidth - 5); + SkPaint p; + p.setColor(SK_ColorGREEN); + canvas.drawIRect(r, p); + SkBitmap dstBitmap; + srcBitmap.extractSubset(&dstBitmap, r); + image.reset(SkNewImageFromBitmap(dstBitmap, true, NULL)); + } + + SkBitmap tgt; + tgt.allocN32Pixels(gWidth, gHeight); + SkBitmapDevice dev(tgt); + SkCanvas canvas(&dev); + canvas.clear(SK_ColorTRANSPARENT); + canvas.drawImage(image, 0, 0, NULL); + + uint32_t pixel = 0; + SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); + canvas.readPixels(info, &pixel, 4, 0, 0); + REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); + canvas.readPixels(info, &pixel, 4, gWidth - 6, gWidth - 6); + REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); + + canvas.readPixels(info, &pixel, 4, gWidth - 5, gWidth - 5); + REPORTER_ASSERT(reporter, pixel == SK_ColorTRANSPARENT); +} |