From e027ba9c47fc777c90c7d09adca875ecaa38b07b Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Tue, 10 Oct 2017 03:13:40 +1100 Subject: [PATCH] Add nativeImage.createFromNamedImage API --- atom/common/api/atom_api_native_image.cc | 9 +++++++++ atom/common/api/atom_api_native_image.h | 2 ++ atom/common/api/atom_api_native_image_mac.mm | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 4d30a88e0d9..419a6c6a61f 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -541,6 +541,14 @@ mate::Handle NativeImage::CreateFromDataURL( return CreateEmpty(isolate); } +#if !defined(OS_MACOSX) +mate::Handle 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 prototype) { @@ -609,6 +617,7 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("createFromBuffer", &atom::api::NativeImage::CreateFromBuffer); dict.SetMethod("createFromDataURL", &atom::api::NativeImage::CreateFromDataURL); + dict.SetMethod("createFromNamedImage", &atom::api::NativeImage::CreateFromNamedImage); } } // namespace diff --git a/atom/common/api/atom_api_native_image.h b/atom/common/api/atom_api_native_image.h index 6ff7a0e29f3..8bdca3a1a7b 100644 --- a/atom/common/api/atom_api_native_image.h +++ b/atom/common/api/atom_api_native_image.h @@ -53,6 +53,8 @@ class NativeImage : public mate::Wrappable { mate::Arguments* args, v8::Local buffer); static mate::Handle CreateFromDataURL( v8::Isolate* isolate, const GURL& url); + static mate::Handle CreateFromNamedImage( + mate::Arguments* args, const std::string& name); static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); diff --git a/atom/common/api/atom_api_native_image_mac.mm b/atom/common/api/atom_api_native_image_mac.mm index ad72d4b1492..d19a580dcfb 100644 --- a/atom/common/api/atom_api_native_image_mac.mm +++ b/atom/common/api/atom_api_native_image_mac.mm @@ -6,10 +6,30 @@ #import +#include "base/strings/sys_string_conversions.h" + namespace atom { namespace api { +mate::Handle 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]; }