From 7dc66d9253014682cfca32da0676e8b27e2409a3 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 25 Feb 2025 08:46:19 +0100 Subject: [PATCH 1/2] error handling in encodeImageData --- packages/skia/cpp/api/JsiSkImage.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/skia/cpp/api/JsiSkImage.h b/packages/skia/cpp/api/JsiSkImage.h index 8c949b3b22..0304751c3b 100644 --- a/packages/skia/cpp/api/JsiSkImage.h +++ b/packages/skia/cpp/api/JsiSkImage.h @@ -103,7 +103,7 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { std::make_shared(getContext(), std::move(shader))); } - sk_sp encodeImageData(const jsi::Value *arguments, size_t count) { + sk_sp encodeImageData(const jsi::Value *arguments, size_t count, bool rasterIfNeeded) { // Get optional parameters auto format = count >= 1 ? static_cast(arguments[0].asNumber()) @@ -116,12 +116,14 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { #if defined(SK_GRAPHITE) image = DawnContext::getInstance().MakeRasterImage(image); #else - if (image->isTextureBacked()) { + if (image->isTextureBacked() && rasterIfNeeded) { auto grContext = getContext()->getDirectContext(); image = image->makeRasterImage(grContext); if (!image) { - return nullptr; + throw std::runtime_error("Failed to create raster image from texture in encodeImageData"); } + } else if (image->isTextureBacked() && rasterIfNeeded) { + throw std::runtime_error("Cannot encode texture-backed image directly"); } #endif sk_sp data; @@ -144,12 +146,15 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { SkPngEncoder::Options options; data = SkPngEncoder::Encode(nullptr, image.get(), options); } - + if (data == nullptr) { + throw std::runtime_error("Failed to encode image data or read pixels from the image"); + } return data; } JSI_HOST_FUNCTION(encodeToBytes) { - auto data = encodeImageData(arguments, count); + bool rasterIfNeeded = count > 0 && arguments[0].isBool() ? arguments[0].asBool() : true; + auto data = encodeImageData(arguments, count, rasterIfNeeded); if (!data) { return jsi::Value::null(); } @@ -172,6 +177,7 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { } JSI_HOST_FUNCTION(encodeToBase64) { + bool rasterIfNeeded = count > 0 && arguments[0].isBool() ? arguments[0].asBool() : true; auto data = encodeImageData(arguments, count); if (!data) { return jsi::Value::null(); From d41e7115c285126e52fc4fa8fe2b3f8b724c0790 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 25 Feb 2025 08:49:24 +0100 Subject: [PATCH 2/2] :green_heart: --- packages/skia/cpp/api/JsiSkImage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/skia/cpp/api/JsiSkImage.h b/packages/skia/cpp/api/JsiSkImage.h index 0304751c3b..f7d9da0755 100644 --- a/packages/skia/cpp/api/JsiSkImage.h +++ b/packages/skia/cpp/api/JsiSkImage.h @@ -122,7 +122,7 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { if (!image) { throw std::runtime_error("Failed to create raster image from texture in encodeImageData"); } - } else if (image->isTextureBacked() && rasterIfNeeded) { + } else if (image->isTextureBacked() && !rasterIfNeeded) { throw std::runtime_error("Cannot encode texture-backed image directly"); } #endif @@ -178,7 +178,7 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { JSI_HOST_FUNCTION(encodeToBase64) { bool rasterIfNeeded = count > 0 && arguments[0].isBool() ? arguments[0].asBool() : true; - auto data = encodeImageData(arguments, count); + auto data = encodeImageData(arguments, count, rasterIfNeeded); if (!data) { return jsi::Value::null(); }