From 9ffbdcee30a83a3d60c8cc7ab2a30f9bcfa82144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sat, 17 Jun 2023 21:47:06 +0200 Subject: [PATCH] Get rid of raw pointers --- imageringlist.cpp | 12 ++++------ imageringlist.h | 6 ++--- loadrunable.cpp | 56 +++++++++++++++++++++-------------------------- mainwindow.cpp | 2 +- rawimage.cpp | 6 ++--- rawimage.h | 4 ++-- 6 files changed, 38 insertions(+), 48 deletions(-) diff --git a/imageringlist.cpp b/imageringlist.cpp index a578f35..3aeeca5 100644 --- a/imageringlist.cpp +++ b/imageringlist.cpp @@ -81,24 +81,20 @@ void Image::clearThumbnail() m_thumbnail.reset(); } -void Image::imageLoaded(void *rawImage, ImageInfoData info) +void Image::imageLoaded(std::shared_ptr rawImage, ImageInfoData info) { m_loading = false; if(!m_released) { - m_rawImage.reset(static_cast(rawImage)); + m_rawImage = rawImage; m_info = info; emit pixmapLoaded(this); } - else - { - delete static_cast(rawImage); - } } -void Image::thumbnailLoadFinish(void *rawImage) +void Image::thumbnailLoadFinish(std::shared_ptr rawImage) { - m_thumbnail.reset(static_cast(rawImage)); + m_thumbnail = rawImage; if(m_thumbnail) emit thumbnailLoaded(this); } diff --git a/imageringlist.h b/imageringlist.h index 0a8ccc5..95cbc18 100644 --- a/imageringlist.h +++ b/imageringlist.h @@ -21,7 +21,7 @@ class Image : public QObject bool m_current; int m_number; std::shared_ptr m_rawImage; - std::unique_ptr m_thumbnail; + std::shared_ptr m_thumbnail; QString m_name; ImageInfoData m_info; ImageRingList *m_ringList; @@ -41,8 +41,8 @@ signals: void pixmapLoaded(Image *ptr); void thumbnailLoaded(Image *ptr); protected slots: - void imageLoaded(void *rawImage, ImageInfoData info); - void thumbnailLoadFinish(void *rawImage); + void imageLoaded(std::shared_ptr rawImage, ImageInfoData info); + void thumbnailLoadFinish(std::shared_ptr rawImage); }; typedef std::shared_ptr ImagePtr; diff --git a/loadrunable.cpp b/loadrunable.cpp index 16034e4..8c69a00 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -82,7 +82,7 @@ void printStarModel(int radius, const std::vector &data, const Star &sta std::cout << m.toStdString() << std::endl << std::endl; } -bool loadRAW(const QString path, ImageInfoData &info, RawImage **image) +bool loadRAW(const QString path, ImageInfoData &info, std::shared_ptr &image) { if(!image) return false; @@ -115,8 +115,8 @@ bool loadRAW(const QString path, ImageInfoData &info, RawImage **image) out[d++] = p; } } - *image = new RawImage(rawdata.sizes.width, rawdata.sizes.height, 1, RawImage::UINT16); - memcpy((*image)->data(), &out[0], sizeof(uint16_t)*d); + image = std::make_shared(rawdata.sizes.width, rawdata.sizes.height, 1, RawImage::UINT16); + memcpy(image->data(), &out[0], sizeof(uint16_t)*d); } QString shutterSpeed = QString::number(raw->imgdata.other.shutter); @@ -191,11 +191,8 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info) return status; } -bool loadFITS(const QString path, ImageInfoData &info, RawImage **image) +bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr &image) { - if(!image) - return false; - fitsfile *file; int status = 0; int type; @@ -270,12 +267,12 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image) } if(img.channels() == 1) - *image = new RawImage(std::move(img)); + image = std::make_shared(std::move(img)); else - *image = RawImage::fromPlanar(img); + image = RawImage::fromPlanar(img); - if(*image) - (*image)->convertToGLFormat(); + if(image) + image->convertToGLFormat(); } } noload: @@ -294,7 +291,7 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image) return true; } -bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image) +bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr &image) { try { @@ -332,18 +329,18 @@ bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image) if(xisfImage.channelCount() == 1) { - *image = new RawImage(xisfImage.width(), xisfImage.height(), 1, type); - std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize()); + image = std::make_shared(xisfImage.width(), xisfImage.height(), 1, type); + std::memcpy(image->data(), xisfImage.imageData(), xisfImage.imageDataSize()); } else if(xisfImage.channelCount() == 3 || xisfImage.channelCount() == 4) { LibXISF::Image tmpImage = xisfImage; tmpImage.convertPixelStorageTo(LibXISF::Image::Planar); - *image = RawImage::fromPlanar(tmpImage.imageData(), tmpImage.width(), tmpImage.height(), tmpImage.channelCount(), type); + image = RawImage::fromPlanar(tmpImage.imageData(), tmpImage.width(), tmpImage.height(), tmpImage.channelCount(), type); } - if(*image) + if(image) { - (*image)->convertToGLFormat(); + image->convertToGLFormat(); return true; } } @@ -361,7 +358,6 @@ void LoadRunable::run() { try { - if(!m_thumbnail && !m_receiver->isCurrent()) { return; @@ -371,23 +367,23 @@ void LoadRunable::run() QFileInfo finfo(m_file); info.info.append({QObject::tr("Filename"), finfo.fileName()}); - RawImage *rawImage = nullptr; + std::shared_ptr rawImage; bool raw = false; timer.start(); if(m_file.endsWith(".CR2", Qt::CaseInsensitive) || m_file.endsWith(".NEF", Qt::CaseInsensitive) || m_file.endsWith(".DNG", Qt::CaseInsensitive)) { - loadRAW(m_file, info, &rawImage); + loadRAW(m_file, info, rawImage); raw = true; qDebug() << "LoadRAW" << timer.elapsed(); } else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive)) { - loadFITS(m_file, info, &rawImage); + loadFITS(m_file, info, rawImage); qDebug() << "LoadFITS" << timer.elapsed(); } else if(m_file.endsWith(".XISF", Qt::CaseInsensitive)) { - loadXISF(m_file, info, &rawImage); + loadXISF(m_file, info, rawImage); qDebug() << "LoadXISF" << timer.elapsed(); } else @@ -407,7 +403,7 @@ void LoadRunable::run() loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); exif_data_free(exif); } - rawImage = new RawImage(img); + rawImage = std::make_shared(img); qDebug() << "LoadQImage" << timer.elapsed(); } @@ -479,11 +475,11 @@ void LoadRunable::run() if(rawImage) { rawImage->convertToThumbnail(); - QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(void*, rawImage)); + QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(std::shared_ptr, rawImage)); } } else - QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(void*, rawImage), Q_ARG(ImageInfoData, info)); + QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(std::shared_ptr, rawImage), Q_ARG(ImageInfoData, info)); } catch(std::exception e) { @@ -542,7 +538,7 @@ ConvertRunable::ConvertRunable(const QString &in, const QString &out, const QStr { } -void writeFITSImage(fitsfile *fw, RawImage *rawimage, ImageInfoData &imageinfo) +void writeFITSImage(fitsfile *fw, std::shared_ptr rawimage, ImageInfoData &imageinfo) { static QStringList skipKeys = {"SIMPLE", "BITPIX", "NAXIS", "NAXIS1", "NAXIS2", "NAXIS3", "BZERO", "BSCALE", "EXTEND"}; @@ -615,11 +611,11 @@ void writeFITSImage(fitsfile *fw, RawImage *rawimage, ImageInfoData &imageinfo) void ConvertRunable::run() { ImageInfoData imageinfo; - RawImage *rawimage = nullptr; + std::shared_ptr rawimage; if(m_infile.endsWith(".FITS", Qt::CaseInsensitive) || m_infile.endsWith(".FIT", Qt::CaseInsensitive)) - loadFITS(m_infile, imageinfo, &rawimage); + loadFITS(m_infile, imageinfo, rawimage); if(m_infile.endsWith(".XISF", Qt::CaseInsensitive)) - loadXISF(m_infile, imageinfo, &rawimage); + loadXISF(m_infile, imageinfo, rawimage); if(rawimage) { @@ -654,7 +650,6 @@ void ConvertRunable::run() catch(LibXISF::Error &err) { qDebug() << "Failed to save XISF image" << err.what(); - delete rawimage; } } @@ -667,6 +662,5 @@ void ConvertRunable::run() writeFITSImage(fw, rawimage, imageinfo); fits_close_file(fw, &status); } - delete rawimage; } } diff --git a/mainwindow.cpp b/mainwindow.cpp index 09f2dd6..4957c59 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -37,7 +37,7 @@ int MainWindow::socketPair[2] = {0, 0}; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { qRegisterMetaType("ImageInfoData"); - qRegisterMetaType("RawImage"); + qRegisterMetaType>("std::shared_ptr"); SettingsDialog::loadSettings(); diff --git a/rawimage.cpp b/rawimage.cpp index e5cffc2..dd93137 100644 --- a/rawimage.cpp +++ b/rawimage.cpp @@ -496,14 +496,14 @@ void RawImage::downscaleTo(uint32_t size) }*/ } -RawImage *RawImage::fromPlanar(const RawImage &img) +std::shared_ptr RawImage::fromPlanar(const RawImage &img) { return RawImage::fromPlanar(img.data(), img.width(), img.height(), img.channels(), img.type()); } -RawImage *RawImage::fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, RawImage::DataType type) +std::shared_ptr RawImage::fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, RawImage::DataType type) { - RawImage *image = new RawImage(w, h, ch, type); + std::shared_ptr image = std::make_shared(w, h, ch, type); size_t size = w * h; size_t ch2 = ch == 1 ? 1 : 4; auto convert = [&](auto *in, auto *out, auto alpha) diff --git a/rawimage.h b/rawimage.h index ca2f4ba..6625f7a 100644 --- a/rawimage.h +++ b/rawimage.h @@ -98,8 +98,8 @@ public: void scaleToUnit(); void downscaleTo(uint32_t size); - static RawImage* fromPlanar(const RawImage &img); - static RawImage* fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, DataType type); + static std::shared_ptr fromPlanar(const RawImage &img); + static std::shared_ptr fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, DataType type); static size_t typeSize(DataType type); std::vector split() const; };