helper to convert CGImage -> SkImage
authorMike Reed <reed@google.com>
Wed, 21 Dec 2016 17:01:12 +0000 (12:01 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Wed, 21 Dec 2016 17:38:18 +0000 (17:38 +0000)
BUG=skia:

Change-Id: I07e0b8fe510d34ab541de7572cb6775478527624
Reviewed-on: https://skia-review.googlesource.com/6386
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
gm/aaclip.cpp
include/utils/mac/SkCGUtils.h
src/utils/mac/SkCreateCGImageRef.cpp
tools/Resources.cpp
tools/Resources.h

index 683f5ff..e9d4476 100644 (file)
@@ -199,9 +199,10 @@ static void test_image(SkCanvas* canvas, const SkImageInfo& info) {
 
     SkBitmap bm2;
     SkCreateBitmapFromCGImage(&bm2, image);
-    CGImageRelease(image);
-
     canvas->drawBitmap(bm2, 10, 120);
+    canvas->drawImage(SkMakeImageFromCGImage(image), 10, 120 + bm2.height() + 10);
+
+    CGImageRelease(image);
 }
 
 class CGImageGM : public skiagm::GM {
@@ -243,10 +244,7 @@ protected:
 private:
     typedef skiagm::GM INHERITED;
 };
-
-#if 0 // Disabled pending fix from reed@
-DEF_GM( return new CGImageGM; )
-#endif
+//DEF_GM( return new CGImageGM; )
 #endif
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
index 29df8b8..592f2f6 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "SkSize.h"
 #include "SkImageInfo.h"
+#include "SkImage.h"
 
 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
 
@@ -32,7 +33,9 @@ class SkStreamRewindable;
  *
  *  On failure, return false, and leave bitmap unchanged.
  */
-SK_API bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef src, SkISize* scaleToFit = NULL);
+SK_API bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef src);
+
+SK_API sk_sp<SkImage> SkMakeImageFromCGImage(CGImageRef);
 
 /**
  *  Copy the pixels from src into the memory specified by info/rowBytes/dstPixels. On failure,
index d9cdb86..1b7e12b 100644 (file)
@@ -212,9 +212,9 @@ SK_API bool SkCopyPixelsFromCGImage(const SkImageInfo& info, size_t rowBytes, vo
     return true;
 }
 
-bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef image, SkISize* scaleToFit) {
-    const int width = scaleToFit ? scaleToFit->width() : SkToInt(CGImageGetWidth(image));
-    const int height = scaleToFit ? scaleToFit->height() : SkToInt(CGImageGetHeight(image));
+bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef image) {
+    const int width = SkToInt(CGImageGetWidth(image));
+    const int height = SkToInt(CGImageGetHeight(image));
     SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
 
     SkBitmap tmp;
@@ -245,4 +245,14 @@ bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef image, SkISize* scaleTo
     return true;
 }
 
+sk_sp<SkImage> SkMakeImageFromCGImage(CGImageRef src) {
+    SkBitmap bm;
+    if (!SkCreateBitmapFromCGImage(&bm, src)) {
+        return nullptr;
+    }
+
+    bm.setImmutable();
+    return SkImage::MakeFromBitmap(bm);
+}
+
 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
index 0c6e4b4..aa81d34 100644 (file)
@@ -57,6 +57,19 @@ SkStreamAsset* GetResourceAsStream(const char* resource) {
     return stream.release();
 }
 
+sk_sp<SkData> GetResourceAsData(const char* resource) {
+    SkString resourcePath = GetResourcePath(resource);
+    std::unique_ptr<SkFILEStream> stream(new SkFILEStream(resourcePath.c_str()));
+    if (!stream->isValid()) {
+        SkDebugf("Resource %s not found.\n", resource);
+        return nullptr;
+    }
+    size_t bytes = stream->getLength();
+    sk_sp<SkData> data = SkData::MakeUninitialized(bytes);
+    stream->read(data->writable_data(), bytes);
+    return data;
+}
+
 sk_sp<SkTypeface> MakeResourceAsTypeface(const char* resource) {
     std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream(resource));
     if (!stream) {
index 8115fbb..fa1ca45 100644 (file)
@@ -12,6 +12,7 @@
 #include "SkString.h"
 
 class SkBitmap;
+class SkData;
 class SkImage;
 class SkStreamAsset;
 class SkTypeface;
@@ -22,6 +23,7 @@ void SetResourcePath(const char* );
 bool GetResourceAsBitmap(const char* resource, SkBitmap* dst);
 sk_sp<SkImage> GetResourceAsImage(const char* resource);
 SkStreamAsset* GetResourceAsStream(const char* resource);
+sk_sp<SkData> GetResourceAsData(const char* resource);
 sk_sp<SkTypeface> MakeResourceAsTypeface(const char* resource);
 
 #endif  // Resources_DEFINED