Make SkNewImageFromBitmap take pixel ref origin into account
authorkkinnunen <kkinnunen@nvidia.com>
Tue, 24 Feb 2015 06:12:12 +0000 (22:12 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 24 Feb 2015 06:12:12 +0000 (22:12 -0800)
Make SkNewImageFromBitmap take pixel ref origin into account.

BUG=skia:3388

Review URL: https://codereview.chromium.org/951483002

gyp/core.gypi
gyp/tests.gypi
src/image/SkImagePriv.cpp [deleted file]
src/image/SkImagePriv.h
src/image/SkImage_Raster.cpp
tests/SkImageTest.cpp [new file with mode: 0644]

index 4421f5d..10db772 100644 (file)
         '<(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',
index 53f3555..3267360 100644 (file)
     '../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 (file)
index ad7b154..0000000
+++ /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;
-}
index 874476b..1b2ae4f 100644 (file)
@@ -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*);
 
 /**
index e3ecd68..1165d14 100644 (file)
@@ -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 (file)
index 0000000..80ba776
--- /dev/null
@@ -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);
+}