aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gyp/core.gypi1
-rw-r--r--gyp/tests.gypi1
-rw-r--r--src/image/SkImagePriv.cpp36
-rw-r--r--src/image/SkImagePriv.h4
-rw-r--r--src/image/SkImage_Raster.cpp41
-rw-r--r--tests/SkImageTest.cpp49
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);
+}