Browse Source

Add nativeImage.createFromNamedImage API

Samuel Attard 7 years ago
parent
commit
e027ba9c47

+ 9 - 0
atom/common/api/atom_api_native_image.cc

@@ -541,6 +541,14 @@ mate::Handle<NativeImage> NativeImage::CreateFromDataURL(
   return CreateEmpty(isolate);
 }
 
+#if !defined(OS_MACOSX)
+mate::Handle<NativeImage> NativeImage::CreateFromNamedImage(
+  mate::Arguments* args, const std::string& name) {
+  args->ThrowError("Cannot create NativeImage from a name on non-darwin platforms");
+  return CreateEmpty(args->isolate());
+}
+#endif
+
 // static
 void NativeImage::BuildPrototype(
     v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> prototype) {
@@ -609,6 +617,7 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
   dict.SetMethod("createFromBuffer", &atom::api::NativeImage::CreateFromBuffer);
   dict.SetMethod("createFromDataURL",
                  &atom::api::NativeImage::CreateFromDataURL);
+  dict.SetMethod("createFromNamedImage", &atom::api::NativeImage::CreateFromNamedImage);
 }
 
 }  // namespace

+ 2 - 0
atom/common/api/atom_api_native_image.h

@@ -53,6 +53,8 @@ class NativeImage : public mate::Wrappable<NativeImage> {
       mate::Arguments* args, v8::Local<v8::Value> buffer);
   static mate::Handle<NativeImage> CreateFromDataURL(
       v8::Isolate* isolate, const GURL& url);
+  static mate::Handle<NativeImage> CreateFromNamedImage(
+      mate::Arguments* args, const std::string& name);
 
   static void BuildPrototype(v8::Isolate* isolate,
                              v8::Local<v8::FunctionTemplate> prototype);

+ 20 - 0
atom/common/api/atom_api_native_image_mac.mm

@@ -6,10 +6,30 @@
 
 #import <Cocoa/Cocoa.h>
 
+#include "base/strings/sys_string_conversions.h"
+
 namespace atom {
 
 namespace api {
 
+mate::Handle<NativeImage> NativeImage::CreateFromNamedImage(
+  mate::Arguments* args, const std::string& name) {
+  @autoreleasepool {
+    NSImage* image = [NSImage imageNamed:base::SysUTF8ToNSString(name)];
+    if (!image.valid) {
+      args->ThrowError("Cannot create image from name: " + name);
+      return CreateEmpty(args->isolate());
+    }
+
+    CGImageRef ref = [image CGImageForProposedRect:nil context:nil hints:nil];
+    NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithCGImage:ref];
+    [rep setSize:[image size]];
+    NSData* pngData = [rep representationUsingType:NSPNGFileType properties:[[NSDictionary alloc] init]];
+
+    return CreateFromPNG(args->isolate(), (char *) [pngData bytes], [pngData length]);
+  }
+}
+
 void NativeImage::SetTemplateImage(bool setAsTemplate) {
   [image_.AsNSImage() setTemplate:setAsTemplate];
 }