First hack at being able to return NSImage pointers
authorPaul Betts <paul@paulbetts.org>
Mon, 14 Mar 2016 03:08:53 +0000 (20:08 -0700)
committerPaul Betts <paul@paulbetts.org>
Mon, 14 Mar 2016 03:08:53 +0000 (20:08 -0700)
atom/common/api/atom_api_native_image.cc

index 69ead04645852db1a599238dea775c9c574a660a..aac11fdfaaf1588573d666d5d14ac5a6e7a2b26c 100644 (file)
@@ -58,6 +58,20 @@ ScaleFactorPair kScaleFactorPairs[] = {
   { "@2.5x"  , 2.5f },
 };
 
+enum NativeRepresentation {
+  INVALID = 0,
+  AS_NSIMAGE,
+};
+
+struct NativeRepresentationPair {
+  const char* name;
+  NativeRepresentation rep;
+};
+
+NativeRepresentationPair kNativeRepresentations[] {
+  { "nsimage", NativeRepresentation::AS_NSIMAGE },
+};
+
 float GetScaleFactorFromPath(const base::FilePath& path) {
   std::string filename(path.BaseName().RemoveExtension().AsUTF8Unsafe());
 
@@ -184,6 +198,7 @@ mate::ObjectTemplateBuilder NativeImage::GetObjectTemplateBuilder(
     template_.Reset(isolate, mate::ObjectTemplateBuilder(isolate)
         .SetMethod("toPng", &NativeImage::ToPNG)
         .SetMethod("toJpeg", &NativeImage::ToJPEG)
+        .SetMethod("asNativeRepresentation", &NativeImage::AsNativeRepresentation)
         .SetMethod("toDataURL", &NativeImage::ToDataURL)
         .SetMethod("toDataUrl", &NativeImage::ToDataURL)  // deprecated.
         .SetMethod("isEmpty", &NativeImage::IsEmpty)
@@ -221,6 +236,47 @@ std::string NativeImage::ToDataURL() {
   return data_url;
 }
 
+v8::Local<v8::Value> NativeImage::AsNativeRepresentation(v8::Isolate* isolate, mate::Arguments* args) {
+  NativeRepresentation desiredRep = NativeRepresentation::INVALID;
+  void* ptr = nullptr;
+  std::string type;
+  
+  if (!args->GetNext(&type)) {
+    args->ThrowError();
+    goto out;
+  }
+  
+  for (const NativeRepresentationPair& item : kNativeRepresentations) {
+    if (type.compare(item.name) == 0) {
+      desiredRep = item.rep;
+      break;
+    }
+  }
+  
+  if (desiredRep == NativeRepresentation::INVALID) {
+    args->ThrowError();
+    goto out;
+  }
+  
+  switch (desiredRep) {
+#if defined(OS_MACOSX)
+  case NativeRepresentation::AS_NSIMAGE:
+    ptr = reinterpret_cast<void*>(image_.AsNSImage());
+    break;
+#endif
+  default:
+    args->ThrowError();
+    break;
+  }
+  
+out:
+  
+  return node::Buffer::Copy(
+    isolate,
+    reinterpret_cast<char*>(ptr),
+    sizeof(void*)).ToLocalChecked();
+}
+
 bool NativeImage::IsEmpty() {
   return image_.IsEmpty();
 }