Get rid of raw pointers

This commit is contained in:
2023-06-17 21:47:06 +02:00
parent d9b1c253db
commit 9ffbdcee30
6 changed files with 38 additions and 48 deletions
+4 -8
View File
@@ -81,24 +81,20 @@ void Image::clearThumbnail()
m_thumbnail.reset(); m_thumbnail.reset();
} }
void Image::imageLoaded(void *rawImage, ImageInfoData info) void Image::imageLoaded(std::shared_ptr<RawImage> rawImage, ImageInfoData info)
{ {
m_loading = false; m_loading = false;
if(!m_released) if(!m_released)
{ {
m_rawImage.reset(static_cast<RawImage*>(rawImage)); m_rawImage = rawImage;
m_info = info; m_info = info;
emit pixmapLoaded(this); emit pixmapLoaded(this);
} }
else
{
delete static_cast<RawImage*>(rawImage);
}
} }
void Image::thumbnailLoadFinish(void *rawImage) void Image::thumbnailLoadFinish(std::shared_ptr<RawImage> rawImage)
{ {
m_thumbnail.reset(static_cast<RawImage*>(rawImage)); m_thumbnail = rawImage;
if(m_thumbnail) if(m_thumbnail)
emit thumbnailLoaded(this); emit thumbnailLoaded(this);
} }
+3 -3
View File
@@ -21,7 +21,7 @@ class Image : public QObject
bool m_current; bool m_current;
int m_number; int m_number;
std::shared_ptr<RawImage> m_rawImage; std::shared_ptr<RawImage> m_rawImage;
std::unique_ptr<RawImage> m_thumbnail; std::shared_ptr<RawImage> m_thumbnail;
QString m_name; QString m_name;
ImageInfoData m_info; ImageInfoData m_info;
ImageRingList *m_ringList; ImageRingList *m_ringList;
@@ -41,8 +41,8 @@ signals:
void pixmapLoaded(Image *ptr); void pixmapLoaded(Image *ptr);
void thumbnailLoaded(Image *ptr); void thumbnailLoaded(Image *ptr);
protected slots: protected slots:
void imageLoaded(void *rawImage, ImageInfoData info); void imageLoaded(std::shared_ptr<RawImage> rawImage, ImageInfoData info);
void thumbnailLoadFinish(void *rawImage); void thumbnailLoadFinish(std::shared_ptr<RawImage> rawImage);
}; };
typedef std::shared_ptr<Image> ImagePtr; typedef std::shared_ptr<Image> ImagePtr;
+25 -31
View File
@@ -82,7 +82,7 @@ void printStarModel(int radius, const std::vector<double> &data, const Star &sta
std::cout << m.toStdString() << std::endl << std::endl; 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<RawImage> &image)
{ {
if(!image) if(!image)
return false; return false;
@@ -115,8 +115,8 @@ bool loadRAW(const QString path, ImageInfoData &info, RawImage **image)
out[d++] = p; out[d++] = p;
} }
} }
*image = new RawImage(rawdata.sizes.width, rawdata.sizes.height, 1, RawImage::UINT16); image = std::make_shared<RawImage>(rawdata.sizes.width, rawdata.sizes.height, 1, RawImage::UINT16);
memcpy((*image)->data(), &out[0], sizeof(uint16_t)*d); memcpy(image->data(), &out[0], sizeof(uint16_t)*d);
} }
QString shutterSpeed = QString::number(raw->imgdata.other.shutter); QString shutterSpeed = QString::number(raw->imgdata.other.shutter);
@@ -191,11 +191,8 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info)
return status; return status;
} }
bool loadFITS(const QString path, ImageInfoData &info, RawImage **image) bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage> &image)
{ {
if(!image)
return false;
fitsfile *file; fitsfile *file;
int status = 0; int status = 0;
int type; int type;
@@ -270,12 +267,12 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image)
} }
if(img.channels() == 1) if(img.channels() == 1)
*image = new RawImage(std::move(img)); image = std::make_shared<RawImage>(std::move(img));
else else
*image = RawImage::fromPlanar(img); image = RawImage::fromPlanar(img);
if(*image) if(image)
(*image)->convertToGLFormat(); image->convertToGLFormat();
} }
} }
noload: noload:
@@ -294,7 +291,7 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image)
return true; return true;
} }
bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image) bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage> &image)
{ {
try try
{ {
@@ -332,18 +329,18 @@ bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image)
if(xisfImage.channelCount() == 1) if(xisfImage.channelCount() == 1)
{ {
*image = new RawImage(xisfImage.width(), xisfImage.height(), 1, type); image = std::make_shared<RawImage>(xisfImage.width(), xisfImage.height(), 1, type);
std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize()); std::memcpy(image->data(), xisfImage.imageData(), xisfImage.imageDataSize());
} }
else if(xisfImage.channelCount() == 3 || xisfImage.channelCount() == 4) else if(xisfImage.channelCount() == 3 || xisfImage.channelCount() == 4)
{ {
LibXISF::Image tmpImage = xisfImage; LibXISF::Image tmpImage = xisfImage;
tmpImage.convertPixelStorageTo(LibXISF::Image::Planar); 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; return true;
} }
} }
@@ -361,7 +358,6 @@ void LoadRunable::run()
{ {
try try
{ {
if(!m_thumbnail && !m_receiver->isCurrent()) if(!m_thumbnail && !m_receiver->isCurrent())
{ {
return; return;
@@ -371,23 +367,23 @@ void LoadRunable::run()
QFileInfo finfo(m_file); QFileInfo finfo(m_file);
info.info.append({QObject::tr("Filename"), finfo.fileName()}); info.info.append({QObject::tr("Filename"), finfo.fileName()});
RawImage *rawImage = nullptr; std::shared_ptr<RawImage> rawImage;
bool raw = false; bool raw = false;
timer.start(); timer.start();
if(m_file.endsWith(".CR2", Qt::CaseInsensitive) || m_file.endsWith(".NEF", Qt::CaseInsensitive) || m_file.endsWith(".DNG", Qt::CaseInsensitive)) 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; raw = true;
qDebug() << "LoadRAW" << timer.elapsed(); qDebug() << "LoadRAW" << timer.elapsed();
} }
else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive)) 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(); qDebug() << "LoadFITS" << timer.elapsed();
} }
else if(m_file.endsWith(".XISF", Qt::CaseInsensitive)) else if(m_file.endsWith(".XISF", Qt::CaseInsensitive))
{ {
loadXISF(m_file, info, &rawImage); loadXISF(m_file, info, rawImage);
qDebug() << "LoadXISF" << timer.elapsed(); qDebug() << "LoadXISF" << timer.elapsed();
} }
else else
@@ -407,7 +403,7 @@ void LoadRunable::run()
loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE);
exif_data_free(exif); exif_data_free(exif);
} }
rawImage = new RawImage(img); rawImage = std::make_shared<RawImage>(img);
qDebug() << "LoadQImage" << timer.elapsed(); qDebug() << "LoadQImage" << timer.elapsed();
} }
@@ -479,11 +475,11 @@ void LoadRunable::run()
if(rawImage) if(rawImage)
{ {
rawImage->convertToThumbnail(); 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>, rawImage));
} }
} }
else 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>, rawImage), Q_ARG(ImageInfoData, info));
} }
catch(std::exception e) 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> rawimage, ImageInfoData &imageinfo)
{ {
static QStringList skipKeys = {"SIMPLE", "BITPIX", "NAXIS", "NAXIS1", "NAXIS2", "NAXIS3", "BZERO", "BSCALE", "EXTEND"}; 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() void ConvertRunable::run()
{ {
ImageInfoData imageinfo; ImageInfoData imageinfo;
RawImage *rawimage = nullptr; std::shared_ptr<RawImage> rawimage;
if(m_infile.endsWith(".FITS", Qt::CaseInsensitive) || m_infile.endsWith(".FIT", Qt::CaseInsensitive)) 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)) if(m_infile.endsWith(".XISF", Qt::CaseInsensitive))
loadXISF(m_infile, imageinfo, &rawimage); loadXISF(m_infile, imageinfo, rawimage);
if(rawimage) if(rawimage)
{ {
@@ -654,7 +650,6 @@ void ConvertRunable::run()
catch(LibXISF::Error &err) catch(LibXISF::Error &err)
{ {
qDebug() << "Failed to save XISF image" << err.what(); qDebug() << "Failed to save XISF image" << err.what();
delete rawimage;
} }
} }
@@ -667,6 +662,5 @@ void ConvertRunable::run()
writeFITSImage(fw, rawimage, imageinfo); writeFITSImage(fw, rawimage, imageinfo);
fits_close_file(fw, &status); fits_close_file(fw, &status);
} }
delete rawimage;
} }
} }
+1 -1
View File
@@ -37,7 +37,7 @@ int MainWindow::socketPair[2] = {0, 0};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{ {
qRegisterMetaType<ImageInfoData>("ImageInfoData"); qRegisterMetaType<ImageInfoData>("ImageInfoData");
qRegisterMetaType<RawImage*>("RawImage"); qRegisterMetaType<std::shared_ptr<RawImage>>("std::shared_ptr<RawImage>");
SettingsDialog::loadSettings(); SettingsDialog::loadSettings();
+3 -3
View File
@@ -496,14 +496,14 @@ void RawImage::downscaleTo(uint32_t size)
}*/ }*/
} }
RawImage *RawImage::fromPlanar(const RawImage &img) std::shared_ptr<RawImage> RawImage::fromPlanar(const RawImage &img)
{ {
return RawImage::fromPlanar(img.data(), img.width(), img.height(), img.channels(), img.type()); 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> 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<RawImage> image = std::make_shared<RawImage>(w, h, ch, type);
size_t size = w * h; size_t size = w * h;
size_t ch2 = ch == 1 ? 1 : 4; size_t ch2 = ch == 1 ? 1 : 4;
auto convert = [&](auto *in, auto *out, auto alpha) auto convert = [&](auto *in, auto *out, auto alpha)
+2 -2
View File
@@ -98,8 +98,8 @@ public:
void scaleToUnit(); void scaleToUnit();
void downscaleTo(uint32_t size); void downscaleTo(uint32_t size);
static RawImage* fromPlanar(const RawImage &img); static std::shared_ptr<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<RawImage> fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, DataType type);
static size_t typeSize(DataType type); static size_t typeSize(DataType type);
std::vector<RawImage> split() const; std::vector<RawImage> split() const;
}; };