9#if IMPELLER_SUPPORTS_RENDERING
20typedef CanvasImage
Image;
27CanvasImage::CanvasImage() =
default;
32 Dart_Handle ui_lib = Dart_LookupLibrary(
tonic::ToDart(
"dart:ui"));
46 if (image_->skia_image()) {
48 }
else if (image_->impeller_texture()) {
49#if IMPELLER_SUPPORTS_RENDERING
63 switch (pixel_format) {
74SkColorType PixelFormatToSkColorType(
PixelFormat pixel_format) {
75 switch (pixel_format) {
77 return kRGBA_8888_SkColorType;
79 return kBGRA_8888_SkColorType;
81 return kRGBA_F32_SkColorType;
83 return kUnknown_SkColorType;
85 return kUnknown_SkColorType;
89const char* DoDecodeImageFromPixelsSync(Dart_Handle pixels_handle,
93 Dart_Handle raw_image_handle) {
96 return "Dart state is null.";
99 if (!dart_state->IsImpellerEnabled()) {
100 return "decodeImageFromPixelsSync is not implemented on Skia.";
104 return "Image dimensions must be greater than zero.";
107 if (pixel_format < 0 ||
109 return "Invalid pixel format.";
113 sk_sp<SkData> sk_data;
114 sk_sp<SkImage> sk_image;
116 tonic::Uint8List pixels(pixels_handle);
117 if (!pixels.data()) {
118 return "Pixels must not be null.";
121 int32_t row_bytes =
width * BytesPerPixel(format);
122 SkColorType
color_type = PixelFormatToSkColorType(format);
124 return "Unsupported pixel format.";
127 SkImageInfo image_info =
129 if (pixel_format == 2) {
130 image_info = image_info.makeAlphaType(kUnpremul_SkAlphaType);
132 image_info = image_info.makeAlphaType(kPremul_SkAlphaType);
135 sk_data = SkData::MakeWithCopy(pixels.data(), pixels.num_elements());
136 sk_image = SkImages::RasterFromData(image_info, sk_data, row_bytes);
138 return "Failed to create image from pixels.";
142 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
143 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
146 sk_sp<DlImage> deferred_image;
148#if IMPELLER_SUPPORTS_RENDERING
150 sk_image, std::move(snapshot_delegate), std::move(raster_task_runner));
153 result_image->set_image(deferred_image);
154 result_image->AssociateWithDartWrapper(raw_image_handle);
163 int32_t pixel_format,
164 Dart_Handle raw_image_handle) {
165 const char*
error = DoDecodeImageFromPixelsSync(
166 pixels_handle,
width,
height, pixel_format, raw_image_handle);
Dart_Handle toByteData(int format, Dart_Handle callback)
static void decodeImageFromPixelsSync(Dart_Handle pixels_handle, uint32_t width, uint32_t height, int32_t pixel_format, Dart_Handle raw_image_handle)
static fml::RefPtr< CanvasImage > Create()
Dart_Handle CreateOuterWrapping()
static int GetColorSpace(const std::shared_ptr< impeller::Texture > &texture)
static sk_sp< PixelDeferredImageGPUImpeller > Make(sk_sp< SkImage > image, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner)
static UIDartState * Current()
const uint8_t uint32_t uint32_t GError ** error
uint32_t uint32_t * format
FlutterDesktopBinaryReply callback
constexpr PixelFormat kLastPixelFormat
static const tonic::DartWrapperInfo kDartWrapperInfoUIImage("ui", "_Image")
Dart_Handle EncodeImage(CanvasImage *canvas_image, int format, Dart_Handle callback_handle)
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Dart_Handle ToDart(const T &object)
Dart_Handle DartInvokeField(Dart_Handle target, const char *name, std::initializer_list< Dart_Handle > args)