diff --git a/packages/skia/cpp/api/JsiSkImage.h b/packages/skia/cpp/api/JsiSkImage.h index 8c949b3b22..f7d9da0755 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,7 +177,8 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { } JSI_HOST_FUNCTION(encodeToBase64) { - 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(); }