Handle jpeg errors with exceptions
This commit is contained in:
parent
3c261d254e
commit
6cd13e1057
1 changed files with 106 additions and 113 deletions
|
|
@ -23,21 +23,6 @@
|
|||
#include <QtSvg/QSvgRenderer>
|
||||
|
||||
#include <jpeglib.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
struct my_error_mgr : public jpeg_error_mgr {
|
||||
jmp_buf setjmp_buffer;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
|
||||
static void my_error_exit(j_common_ptr cinfo) {
|
||||
(*cinfo->err->output_message)(cinfo);
|
||||
my_error_mgr* myerr = (my_error_mgr*)cinfo->err;
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
namespace Images {
|
||||
namespace {
|
||||
|
|
@ -1268,14 +1253,15 @@ QImage Prepare(QImage image, int w, int h, const PrepareArgs &args) {
|
|||
}
|
||||
|
||||
bool IsProgressiveJpeg(const QByteArray &bytes) {
|
||||
try {
|
||||
struct jpeg_decompress_struct info;
|
||||
struct my_error_mgr jerr;
|
||||
struct jpeg_error_mgr jerr;
|
||||
|
||||
info.err = jpeg_std_error(&jerr);
|
||||
jerr.error_exit = my_error_exit;
|
||||
if (setjmp(jerr.setjmp_buffer)) {
|
||||
return false;
|
||||
}
|
||||
jerr.error_exit = [](j_common_ptr cinfo) {
|
||||
(*cinfo->err->output_message)(cinfo);
|
||||
throw new std::exception;
|
||||
};
|
||||
|
||||
jpeg_create_decompress(&info);
|
||||
const auto guard = gsl::finally([&] {
|
||||
|
|
@ -1291,19 +1277,23 @@ bool IsProgressiveJpeg(const QByteArray &bytes) {
|
|||
}
|
||||
|
||||
return (info.progressive_mode > 0);
|
||||
} catch (...) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray MakeProgressiveJpeg(const QByteArray &bytes) {
|
||||
try {
|
||||
struct jpeg_decompress_struct srcinfo;
|
||||
struct jpeg_compress_struct dstinfo;
|
||||
struct my_error_mgr jerr;
|
||||
struct jpeg_error_mgr jerr;
|
||||
|
||||
srcinfo.err = jpeg_std_error(&jerr);
|
||||
dstinfo.err = jpeg_std_error(&jerr);
|
||||
jerr.error_exit = my_error_exit;
|
||||
if (setjmp(jerr.setjmp_buffer)) {
|
||||
return {};
|
||||
}
|
||||
jerr.error_exit = [](j_common_ptr cinfo) {
|
||||
(*cinfo->err->output_message)(cinfo);
|
||||
throw new std::exception;
|
||||
};
|
||||
|
||||
jpeg_create_decompress(&srcinfo);
|
||||
const auto srcguard = gsl::finally([&] {
|
||||
|
|
@ -1375,6 +1365,9 @@ QByteArray MakeProgressiveJpeg(const QByteArray &bytes) {
|
|||
return QByteArray::fromRawData(
|
||||
reinterpret_cast<char*>(outbuffer),
|
||||
outsize);
|
||||
} catch (...) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Images
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue