From 2291c0b864ddb457e1244438bd98b5fc2228b646 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Fri, 23 Jan 2026 20:48:15 +0000 Subject: [PATCH] Switch from custom VError to standard runtime_error --- src/common.cc | 26 +++++++++++++------------- src/metadata.cc | 2 +- src/operations.cc | 5 ++--- src/pipeline.cc | 24 +++++++++++------------- src/stats.cc | 5 ++--- src/utilities.cc | 2 +- 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/common.cc b/src/common.cc index bc608348..4b1f1c46 100644 --- a/src/common.cc +++ b/src/common.cc @@ -510,11 +510,11 @@ namespace sharp { option = GetOptionsForImageType(imageType, descriptor); image = VImage::new_from_buffer(descriptor->buffer, descriptor->bufferLength, nullptr, option); } - } catch (vips::VError const &err) { - throw vips::VError(std::string("Input buffer has corrupt header: ") + err.what()); + } catch (std::runtime_error const &err) { + throw std::runtime_error(std::string("Input buffer has corrupt header: ") + err.what()); } } else { - throw vips::VError("Input buffer contains unsupported image format"); + throw std::runtime_error("Input buffer contains unsupported image format"); } } } else { @@ -585,10 +585,10 @@ namespace sharp { imageType = DetermineImageType(descriptor->file.data()); if (imageType == ImageType::MISSING) { if (descriptor->file.find("file.substr(0, 8) + "...')?"); } - throw vips::VError("Input file is missing: " + descriptor->file); + throw std::runtime_error("Input file is missing: " + descriptor->file); } if (imageType != ImageType::UNKNOWN) { try { @@ -600,11 +600,11 @@ namespace sharp { option = GetOptionsForImageType(imageType, descriptor); image = VImage::new_from_file(descriptor->file.data(), option); } - } catch (vips::VError const &err) { - throw vips::VError(std::string("Input file has corrupt header: ") + err.what()); + } catch (std::runtime_error const &err) { + throw std::runtime_error(std::string("Input file has corrupt header: ") + err.what()); } } else { - throw vips::VError("Input file contains unsupported image format"); + throw std::runtime_error("Input file contains unsupported image format"); } } } @@ -612,7 +612,7 @@ namespace sharp { // Limit input images to a given number of pixels, where pixels = width * height if (descriptor->limitInputPixels > 0 && static_cast(image.width()) * image.height() > descriptor->limitInputPixels) { - throw vips::VError("Input image exceeds pixel limit"); + throw std::runtime_error("Input image exceeds pixel limit"); } return std::make_tuple(image, imageType); } @@ -788,19 +788,19 @@ namespace sharp { : image.height(); if (imageType == ImageType::JPEG) { if (image.width() > 65535 || height > 65535) { - throw vips::VError("Processed image is too large for the JPEG format"); + throw std::runtime_error("Processed image is too large for the JPEG format"); } } else if (imageType == ImageType::WEBP) { if (image.width() > 16383 || height > 16383) { - throw vips::VError("Processed image is too large for the WebP format"); + throw std::runtime_error("Processed image is too large for the WebP format"); } } else if (imageType == ImageType::GIF) { if (image.width() > 65535 || height > 65535) { - throw vips::VError("Processed image is too large for the GIF format"); + throw std::runtime_error("Processed image is too large for the GIF format"); } } else if (imageType == ImageType::HEIF) { if (image.width() > 16384 || height > 16384) { - throw vips::VError("Processed image is too large for the HEIF format"); + throw std::runtime_error("Processed image is too large for the HEIF format"); } } } diff --git a/src/metadata.cc b/src/metadata.cc index 01cbd51f..bb8e9787 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -31,7 +31,7 @@ class MetadataWorker : public Napi::AsyncWorker { sharp::ImageType imageType = sharp::ImageType::UNKNOWN; try { std::tie(image, imageType) = OpenInput(baton->input); - } catch (vips::VError const &err) { + } catch (std::runtime_error const &err) { (baton->err).append(err.what()); } if (imageType != sharp::ImageType::UNKNOWN) { diff --git a/src/operations.cc b/src/operations.cc index 50b4bed2..d4701729 100644 --- a/src/operations.cc +++ b/src/operations.cc @@ -14,7 +14,6 @@ #include "./operations.h" using vips::VImage; -using vips::VError; namespace sharp { /* @@ -287,7 +286,7 @@ namespace sharp { */ VImage Trim(VImage image, std::vector background, double threshold, bool const lineArt, int const margin) { if (image.width() < 3 && image.height() < 3) { - throw VError("Image to trim must be at least 3x3 pixels"); + throw std::runtime_error("Image to trim must be at least 3x3 pixels"); } if (background.size() == 0) { // Top-left pixel provides the default background colour if none is given @@ -361,7 +360,7 @@ namespace sharp { VImage Linear(VImage image, std::vector const a, std::vector const b) { size_t const bands = static_cast(image.bands()); if (a.size() > bands) { - throw VError("Band expansion using linear is unsupported"); + throw std::runtime_error("Band expansion using linear is unsupported"); } bool const uchar = !Is16Bit(image.interpretation()); if (image.has_alpha() && a.size() != bands && (a.size() == 1 || a.size() == bands - 1 || bands - 1 == 1)) { diff --git a/src/pipeline.cc b/src/pipeline.cc index 2de6d43e..4c6f0983 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -274,7 +274,7 @@ class PipelineWorker : public Napi::AsyncWorker { } sharp::SetDensity(image, baton->input->density); if (image.width() > 32767 || image.height() > 32767) { - throw vips::VError("Input SVG image will exceed 32767x32767 pixel limit when scaled"); + throw std::runtime_error("Input SVG image will exceed 32767x32767 pixel limit when scaled"); } } else if (inputImageType == sharp::ImageType::PDF) { if (baton->input->buffer != nullptr) { @@ -290,7 +290,7 @@ class PipelineWorker : public Napi::AsyncWorker { } } else { if (inputImageType == sharp::ImageType::SVG && (image.width() > 32767 || image.height() > 32767)) { - throw vips::VError("Input SVG image exceeds 32767x32767 pixel limit"); + throw std::runtime_error("Input SVG image exceeds 32767x32767 pixel limit"); } } if (baton->input->autoOrient) { @@ -675,7 +675,7 @@ class PipelineWorker : public Napi::AsyncWorker { // Verify within current dimensions if (compositeImage.width() > image.width() || compositeImage.height() > image.height()) { - throw vips::VError("Image to composite must have same dimensions or smaller"); + throw std::runtime_error("Image to composite must have same dimensions or smaller"); } // Check if overlay is tiled if (composite->tile) { @@ -1086,20 +1086,19 @@ class PipelineWorker : public Napi::AsyncWorker { // Get raw image data baton->bufferOut = static_cast(image.write_to_memory(&baton->bufferOutLength)); if (baton->bufferOut == nullptr) { - (baton->err).append("Could not allocate enough memory for raw output"); - return Error(); + throw std::runtime_error("Could not allocate enough memory for raw output"); } baton->formatOut = "raw"; } else { // Unsupported output format - (baton->err).append("Unsupported output format "); + auto unsupported = std::string("Unsupported output format "); if (baton->formatOut == "input") { - (baton->err).append("when trying to match input format of "); - (baton->err).append(ImageTypeId(inputImageType)); + unsupported.append("when trying to match input format of "); + unsupported.append(ImageTypeId(inputImageType)); } else { - (baton->err).append(baton->formatOut); + unsupported.append(baton->formatOut); } - return Error(); + throw std::runtime_error(unsupported); } } else { // File output @@ -1274,7 +1273,7 @@ class PipelineWorker : public Napi::AsyncWorker { return Error(); } } - } catch (vips::VError const &err) { + } catch (std::runtime_error const &err) { char const *what = err.what(); if (what && what[0]) { (baton->err).append(what); @@ -1306,7 +1305,6 @@ class PipelineWorker : public Napi::AsyncWorker { } warning = sharp::VipsWarningPop(); } - if (baton->err.empty()) { int width = baton->width; int height = baton->height; @@ -1407,7 +1405,7 @@ class PipelineWorker : public Napi::AsyncWorker { void MultiPageUnsupported(int const pages, std::string op) { if (pages > 1) { - throw vips::VError(op + " is not supported for multi-page images"); + throw std::runtime_error(op + " is not supported for multi-page images"); } } diff --git a/src/stats.cc b/src/stats.cc index b1fd27a7..4951db75 100644 --- a/src/stats.cc +++ b/src/stats.cc @@ -39,7 +39,7 @@ class StatsWorker : public Napi::AsyncWorker { sharp::ImageType imageType = sharp::ImageType::UNKNOWN; try { std::tie(image, imageType) = OpenInput(baton->input); - } catch (vips::VError const &err) { + } catch (std::runtime_error const &err) { (baton->err).append(err.what()); } if (imageType != sharp::ImageType::UNKNOWN) { @@ -92,7 +92,7 @@ class StatsWorker : public Napi::AsyncWorker { baton->dominantRed = dx * 16 + 8; baton->dominantGreen = dy * 16 + 8; baton->dominantBlue = dz * 16 + 8; - } catch (vips::VError const &err) { + } catch (std::runtime_error const &err) { (baton->err).append(err.what()); } } @@ -112,7 +112,6 @@ class StatsWorker : public Napi::AsyncWorker { debuglog.Call(Receiver().Value(), { Napi::String::New(env, warning) }); warning = sharp::VipsWarningPop(); } - if (baton->err.empty()) { // Stats Object Napi::Object info = Napi::Object::New(env); diff --git a/src/utilities.cc b/src/utilities.cc index 03164b5c..9fcdb1cb 100644 --- a/src/utilities.cc +++ b/src/utilities.cc @@ -244,7 +244,7 @@ Napi::Value _maxColourDistance(const Napi::CallbackInfo& info) { } // Calculate colour distance maxColourDistance = image1.dE00(image2).max(); - } catch (vips::VError const &err) { + } catch (std::runtime_error const &err) { throw Napi::Error::New(env, err.what()); }