refactor: spanify image utils (#44127)
* refactor: electron::util::AddImageSkiaRepFromJPEG() takes a span arg * refactor: electron::util::AddImageSkiaRepFromPNG() takes a span arg * refactor: electron::util::AddImageSkiaRepFromBuffer() takes a span arg * feat: add Node-buffer-to-base-span helper function * refactor: electron::api::NativeImage::CreateFromPNG() now takes a span param * refactor: electron::api::NativeImage::CreateFromJPEG() now takes a span param * refactor: use base::as_byte_span() * fix: -Wunsafe-buffer-usage warning in NativeImage::CreateFromNamedImage() Warning fixed by this commit: ../../electron/shell/common/api/electron_api_native_image_mac.mm:131:11: error: function introduces unsafe buffer manipulation [-Werror,-Wunsafe-buffer-usage] 131 | {reinterpret_cast<const uint8_t*>((char*)[png_data bytes]), | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 132 | [png_data length]}); | ~~~~~~~~~~~~~~~~~~ ../../electron/shell/common/api/electron_api_native_image_mac.mm:131:11: note: See //docs/unsafe_buffers.md for help. * chore: add // SAFETY comment for Node-buffer-to-span func * chore: add // SAFETY comment for NSData-to-span func
This commit is contained in:
parent
d51ef7d794
commit
3d2f68a9df
7 changed files with 77 additions and 57 deletions
|
@ -30,6 +30,7 @@
|
|||
#include "shell/common/gin_helper/function_template_extensions.h"
|
||||
#include "shell/common/gin_helper/object_template_builder.h"
|
||||
#include "shell/common/node_includes.h"
|
||||
#include "shell/common/node_util.h"
|
||||
#include "shell/common/process_util.h"
|
||||
#include "shell/common/skia_util.h"
|
||||
#include "shell/common/thread_restrictions.h"
|
||||
|
@ -397,20 +398,18 @@ void NativeImage::AddRepresentation(const gin_helper::Dictionary& options) {
|
|||
v8::Local<v8::Value> buffer;
|
||||
GURL url;
|
||||
if (options.Get("buffer", &buffer) && node::Buffer::HasInstance(buffer)) {
|
||||
auto* data = reinterpret_cast<unsigned char*>(node::Buffer::Data(buffer));
|
||||
auto size = node::Buffer::Length(buffer);
|
||||
skia_rep_added = electron::util::AddImageSkiaRepFromBuffer(
|
||||
&image_skia, data, size, width, height, scale_factor);
|
||||
&image_skia, electron::util::as_byte_span(buffer), width, height,
|
||||
scale_factor);
|
||||
} else if (options.Get("dataURL", &url)) {
|
||||
std::string mime_type, charset, data;
|
||||
if (net::DataURL::Parse(url, &mime_type, &charset, &data)) {
|
||||
auto* data_ptr = reinterpret_cast<const unsigned char*>(data.c_str());
|
||||
if (mime_type == "image/png") {
|
||||
skia_rep_added = electron::util::AddImageSkiaRepFromPNG(
|
||||
&image_skia, data_ptr, data.size(), scale_factor);
|
||||
&image_skia, base::as_byte_span(data), scale_factor);
|
||||
} else if (mime_type == "image/jpeg") {
|
||||
skia_rep_added = electron::util::AddImageSkiaRepFromJPEG(
|
||||
&image_skia, data_ptr, data.size(), scale_factor);
|
||||
&image_skia, base::as_byte_span(data), scale_factor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -442,22 +441,20 @@ gin::Handle<NativeImage> NativeImage::Create(v8::Isolate* isolate,
|
|||
}
|
||||
|
||||
// static
|
||||
gin::Handle<NativeImage> NativeImage::CreateFromPNG(v8::Isolate* isolate,
|
||||
const char* buffer,
|
||||
size_t length) {
|
||||
gin::Handle<NativeImage> NativeImage::CreateFromPNG(
|
||||
v8::Isolate* isolate,
|
||||
const base::span<const uint8_t> data) {
|
||||
gfx::ImageSkia image_skia;
|
||||
electron::util::AddImageSkiaRepFromPNG(
|
||||
&image_skia, reinterpret_cast<const unsigned char*>(buffer), length, 1.0);
|
||||
electron::util::AddImageSkiaRepFromPNG(&image_skia, data, 1.0);
|
||||
return Create(isolate, gfx::Image(image_skia));
|
||||
}
|
||||
|
||||
// static
|
||||
gin::Handle<NativeImage> NativeImage::CreateFromJPEG(v8::Isolate* isolate,
|
||||
const char* buffer,
|
||||
size_t length) {
|
||||
gin::Handle<NativeImage> NativeImage::CreateFromJPEG(
|
||||
v8::Isolate* isolate,
|
||||
const base::span<const uint8_t> buffer) {
|
||||
gfx::ImageSkia image_skia;
|
||||
electron::util::AddImageSkiaRepFromJPEG(
|
||||
&image_skia, reinterpret_cast<const unsigned char*>(buffer), length, 1.0);
|
||||
electron::util::AddImageSkiaRepFromJPEG(&image_skia, buffer, 1.0);
|
||||
return Create(isolate, gfx::Image(image_skia));
|
||||
}
|
||||
|
||||
|
@ -509,7 +506,8 @@ gin::Handle<NativeImage> NativeImage::CreateFromBitmap(
|
|||
auto info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
|
||||
auto size_bytes = info.computeMinByteSize();
|
||||
|
||||
if (size_bytes != node::Buffer::Length(buffer)) {
|
||||
const auto buffer_data = electron::util::as_byte_span(buffer);
|
||||
if (size_bytes != buffer_data.size()) {
|
||||
thrower.ThrowError("invalid buffer size");
|
||||
return gin::Handle<NativeImage>();
|
||||
}
|
||||
|
@ -522,7 +520,7 @@ gin::Handle<NativeImage> NativeImage::CreateFromBitmap(
|
|||
|
||||
SkBitmap bitmap;
|
||||
bitmap.allocN32Pixels(width, height, false);
|
||||
bitmap.writePixels({info, node::Buffer::Data(buffer), bitmap.rowBytes()});
|
||||
bitmap.writePixels({info, buffer_data.data(), bitmap.rowBytes()});
|
||||
|
||||
gfx::ImageSkia image_skia =
|
||||
gfx::ImageSkia::CreateFromBitmap(bitmap, scale_factor);
|
||||
|
@ -553,8 +551,8 @@ gin::Handle<NativeImage> NativeImage::CreateFromBuffer(
|
|||
|
||||
gfx::ImageSkia image_skia;
|
||||
electron::util::AddImageSkiaRepFromBuffer(
|
||||
&image_skia, reinterpret_cast<unsigned char*>(node::Buffer::Data(buffer)),
|
||||
node::Buffer::Length(buffer), width, height, scale_factor);
|
||||
&image_skia, electron::util::as_byte_span(buffer), width, height,
|
||||
scale_factor);
|
||||
return Create(args->isolate(), gfx::Image(image_skia));
|
||||
}
|
||||
|
||||
|
@ -564,9 +562,9 @@ gin::Handle<NativeImage> NativeImage::CreateFromDataURL(v8::Isolate* isolate,
|
|||
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 CreateFromPNG(isolate, base::as_byte_span(data));
|
||||
if (mime_type == "image/jpeg")
|
||||
return CreateFromJPEG(isolate, base::as_byte_span(data));
|
||||
}
|
||||
|
||||
return CreateEmpty(isolate);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue