diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index e74d681cc0..44c0ae309d 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -9,10 +9,12 @@ #include "atom/common/native_mate_converters/file_path_converter.h" #include "atom/common/native_mate_converters/gfx_converter.h" +#include "atom/common/native_mate_converters/gurl_converter.h" #include "base/files/file_util.h" #include "base/strings/string_util.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" +#include "net/base/data_url.h" #include "ui/base/layout.h" #include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/codec/png_codec.h" @@ -169,19 +171,17 @@ mate::Handle NativeImage::Create( // static mate::Handle NativeImage::CreateFromPNG( - v8::Isolate* isolate, v8::Handle buffer) { + v8::Isolate* isolate, const char* buffer, size_t length) { gfx::Image image = gfx::Image::CreateFrom1xPNGBytes( - reinterpret_cast(node::Buffer::Data(buffer)), - node::Buffer::Length(buffer)); + reinterpret_cast(buffer), length); return Create(isolate, image); } // static mate::Handle NativeImage::CreateFromJPEG( - v8::Isolate* isolate, v8::Handle buffer) { + v8::Isolate* isolate, const char* buffer, size_t length) { gfx::Image image = gfx::ImageFrom1xJPEGEncodedData( - reinterpret_cast(node::Buffer::Data(buffer)), - node::Buffer::Length(buffer)); + reinterpret_cast(buffer), length); return Create(isolate, image); } @@ -198,6 +198,20 @@ mate::Handle NativeImage::CreateFromPath( return Create(isolate, image); } +// static +mate::Handle NativeImage::CreateFromDataURL( + v8::Isolate* isolate, const GURL& url) { + std::string mime_type, charset, data; + if (net::DataURL::Parse(url, &mime_type, &charset, &data)) { + if (mime_type == "image/png") + return CreateFromPNG(isolate, data.c_str(), data.size()); + else if (mime_type == "image/jpeg") + return CreateFromJPEG(isolate, data.c_str(), data.size()); + } + + return CreateEmpty(isolate); +} + } // namespace api } // namespace atom @@ -209,9 +223,9 @@ void Initialize(v8::Handle exports, v8::Handle unused, v8::Handle context, void* priv) { mate::Dictionary dict(context->GetIsolate(), exports); dict.SetMethod("createEmpty", &atom::api::NativeImage::CreateEmpty); - dict.SetMethod("createFromPng", &atom::api::NativeImage::CreateFromPNG); - dict.SetMethod("createFromJpeg", &atom::api::NativeImage::CreateFromJPEG); dict.SetMethod("createFromPath", &atom::api::NativeImage::CreateFromPath); + dict.SetMethod("createFromDataUrl", + &atom::api::NativeImage::CreateFromDataURL); } } // namespace diff --git a/atom/common/api/atom_api_native_image.h b/atom/common/api/atom_api_native_image.h index 33c020f21a..2104a305f0 100644 --- a/atom/common/api/atom_api_native_image.h +++ b/atom/common/api/atom_api_native_image.h @@ -9,6 +9,8 @@ #include "native_mate/wrappable.h" #include "ui/gfx/image/image.h" +class GURL; + namespace base { class FilePath; } @@ -27,11 +29,13 @@ class NativeImage : public mate::Wrappable { static mate::Handle Create( v8::Isolate* isolate, const gfx::Image& image); static mate::Handle CreateFromPNG( - v8::Isolate* isolate, v8::Handle buffer); + v8::Isolate* isolate, const char* buffer, size_t length); static mate::Handle CreateFromJPEG( - v8::Isolate* isolate, v8::Handle buffer); + v8::Isolate* isolate, const char* buffer, size_t length); static mate::Handle CreateFromPath( v8::Isolate* isolate, const base::FilePath& path); + static mate::Handle CreateFromDataURL( + v8::Isolate* isolate, const GURL& url); // The default constructor should only be used by image_converter.cc. NativeImage();