From 1e2f0220a25638a12fa1a207c66732fb81d08399 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 20 Feb 2020 16:39:30 +1100 Subject: [PATCH] viewerglwidget: use OIIO::ImageInput rather than OIIO::ImageBuf Gives us better control over the file I/O (using ImageBuf would fail to release file handles sometimes). --- app/widget/viewer/viewerglwidget.cpp | 65 ++++++++++++++-------------- app/widget/viewer/viewerglwidget.h | 5 +++ 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/app/widget/viewer/viewerglwidget.cpp b/app/widget/viewer/viewerglwidget.cpp index 94e29e610..9abb17426 100644 --- a/app/widget/viewer/viewerglwidget.cpp +++ b/app/widget/viewer/viewerglwidget.cpp @@ -77,50 +77,51 @@ void ViewerGLWidget::SetMatrix(const QMatrix4x4 &mat) void ViewerGLWidget::SetImage(const QString &fn) { - OIIO::ImageBuf* in; - has_image_ = false; - if (fn.isEmpty()) { - // Backend had no filename - goto end; - } + if (!fn.isEmpty() && QFile::exists(fn)) { + auto input = OIIO::ImageInput::open(fn.toStdString()); - if (!QFileInfo::exists(fn)) { - goto end; - } + if (input) { - in = new OIIO::ImageBuf(fn.toStdString()); + PixelFormat::Format image_format = PixelService::OIIOFormatToOliveFormat(input->spec().format); - if (in->read(0, 0, true)) { + // Ensure the following texture operations are done in our context (in case we're in a separate window for instance) + makeCurrent(); - PixelFormat::Format image_format = PixelService::OIIOFormatToOliveFormat(in->spec().format); + if (!texture_.IsCreated() + || texture_.width() != input->spec().width + || texture_.height() != input->spec().height + || texture_.format() != image_format) { + load_buffer_.destroy(); + texture_.Destroy(); - // Ensure the following texture operations are done in our context (in case we're in a separate window for instance) - makeCurrent(); + load_buffer_.set_width(input->spec().width); + load_buffer_.set_height(input->spec().height); + load_buffer_.set_format(image_format); + load_buffer_.allocate(); - if (!texture_.IsCreated() - || texture_.width() != in->spec().width - || texture_.height() != in->spec().height - || texture_.format() != image_format) { - texture_.Destroy(); + texture_.Create(context(), input->spec().width, input->spec().height, image_format); + } - texture_.Create(context(), in->spec().width, in->spec().height, image_format); + input->read_image(input->spec().format, load_buffer_.data()); + input->close(); + + texture_.Upload(load_buffer_.data()); + + doneCurrent(); + + has_image_ = true; + +#if OIIO_VERSION < 10903 + OIIO::ImageInput::destroy(image_); +#endif + + } else { + qWarning() << "OIIO Error:" << OIIO::geterror().c_str(); } - - texture_.Upload(in->localpixels()); - - doneCurrent(); - - has_image_ = true; - - } else { - qWarning() << "OIIO Error:" << OIIO::geterror().c_str(); } - delete in; - -end: update(); } diff --git a/app/widget/viewer/viewerglwidget.h b/app/widget/viewer/viewerglwidget.h index 48e15055d..c9b2fccd0 100644 --- a/app/widget/viewer/viewerglwidget.h +++ b/app/widget/viewer/viewerglwidget.h @@ -191,6 +191,11 @@ private: */ QMatrix4x4 matrix_; + /** + * @brief Buffer to load images into RAM before sending them to the display + */ + Frame load_buffer_; + #ifdef Q_OS_LINUX static bool nouveau_check_done_; #endif