feat: add safer nativeImage.createFromBitmap(), which does not decode PNG/JPEG (#17337)
This commit is contained in:
parent
aa8b66aae1
commit
878538f2e8
4 changed files with 91 additions and 1 deletions
|
@ -504,6 +504,54 @@ mate::Handle<NativeImage> NativeImage::CreateFromPath(
|
|||
return handle;
|
||||
}
|
||||
|
||||
// static
|
||||
mate::Handle<NativeImage> NativeImage::CreateFromBitmap(
|
||||
mate::Arguments* args,
|
||||
v8::Local<v8::Value> buffer,
|
||||
const mate::Dictionary& options) {
|
||||
if (!node::Buffer::HasInstance(buffer)) {
|
||||
args->ThrowError("buffer must be a node Buffer");
|
||||
return mate::Handle<NativeImage>();
|
||||
}
|
||||
|
||||
unsigned int width = 0;
|
||||
unsigned int height = 0;
|
||||
double scale_factor = 1.;
|
||||
|
||||
if (!options.Get("width", &width)) {
|
||||
args->ThrowError("width is required");
|
||||
return mate::Handle<NativeImage>();
|
||||
}
|
||||
|
||||
if (!options.Get("height", &height)) {
|
||||
args->ThrowError("height is required");
|
||||
return mate::Handle<NativeImage>();
|
||||
}
|
||||
|
||||
auto info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
|
||||
auto size_bytes = info.computeMinByteSize();
|
||||
|
||||
if (size_bytes != node::Buffer::Length(buffer)) {
|
||||
args->ThrowError("invalid buffer size");
|
||||
return mate::Handle<NativeImage>();
|
||||
}
|
||||
|
||||
options.Get("scaleFactor", &scale_factor);
|
||||
|
||||
if (width == 0 || height == 0) {
|
||||
return CreateEmpty(args->isolate());
|
||||
}
|
||||
|
||||
SkBitmap bitmap;
|
||||
bitmap.allocN32Pixels(width, height, false);
|
||||
bitmap.setPixels(node::Buffer::Data(buffer));
|
||||
|
||||
gfx::ImageSkia image_skia;
|
||||
image_skia.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale_factor));
|
||||
|
||||
return Create(args->isolate(), gfx::Image(image_skia));
|
||||
}
|
||||
|
||||
// static
|
||||
mate::Handle<NativeImage> NativeImage::CreateFromBuffer(
|
||||
mate::Arguments* args,
|
||||
|
@ -618,6 +666,7 @@ void Initialize(v8::Local<v8::Object> exports,
|
|||
mate::Dictionary dict(context->GetIsolate(), exports);
|
||||
dict.SetMethod("createEmpty", &atom::api::NativeImage::CreateEmpty);
|
||||
dict.SetMethod("createFromPath", &atom::api::NativeImage::CreateFromPath);
|
||||
dict.SetMethod("createFromBitmap", &atom::api::NativeImage::CreateFromBitmap);
|
||||
dict.SetMethod("createFromBuffer", &atom::api::NativeImage::CreateFromBuffer);
|
||||
dict.SetMethod("createFromDataURL",
|
||||
&atom::api::NativeImage::CreateFromDataURL);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue