diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 69ead0464585..aac11fdfaaf1 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -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 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(image_.AsNSImage()); + break; +#endif + default: + args->ThrowError(); + break; + } + +out: + + return node::Buffer::Copy( + isolate, + reinterpret_cast(ptr), + sizeof(void*)).ToLocalChecked(); +} + bool NativeImage::IsEmpty() { return image_.IsEmpty(); }