Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package tenmon for openSUSE:Factory checked in at 2024-02-14 23:19:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/tenmon (Old) and /work/SRC/openSUSE:Factory/.tenmon.new.1815 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "tenmon" Wed Feb 14 23:19:21 2024 rev:4 rq:1146532 version:20240201 Changes: -------- --- /work/SRC/openSUSE:Factory/tenmon/tenmon.changes 2024-01-11 21:05:47.103904037 +0100 +++ /work/SRC/openSUSE:Factory/.tenmon.new.1815/tenmon.changes 2024-02-14 23:19:25.249728331 +0100 @@ -1,0 +2,13 @@ +Wed Feb 14 09:37:48 UTC 2024 - Paolo Stivanin <i...@paolostivanin.com> + +- Update to 20240201: + * Fix metainfo + * Add thumbnail quality to settings + * Only degress should show negative sign + * Limit image info to 1024 characters + * Flip image according to ROWORDER + * Fix some edge cases when stretch + * Small optimization in resample + * Add box resize algorithm + +------------------------------------------------------------------- Old: ---- tenmon-20240108.tar.gz New: ---- tenmon-20240201.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ tenmon.spec ++++++ --- /var/tmp/diff_new_pack.3lHBjv/_old 2024-02-14 23:19:26.017756019 +0100 +++ /var/tmp/diff_new_pack.3lHBjv/_new 2024-02-14 23:19:26.021756163 +0100 @@ -21,7 +21,7 @@ %endif Name: tenmon -Version: 20240108 +Version: 20240201 Release: 0 Summary: FITS and XISF image viewer, converter and indexer License: GPL-3.0-or-later @@ -41,7 +41,6 @@ BuildRequires: pkgconfig(gsl) BuildRequires: pkgconfig(libexif) BuildRequires: pkgconfig(libraw) -BuildRequires: pkgconfig(opencv) BuildRequires: pkgconfig(wcslib) %description ++++++ tenmon-20240108.tar.gz -> tenmon-20240201.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/CMakeLists.txt new/tenmon/CMakeLists.txt --- old/tenmon/CMakeLists.txt 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/CMakeLists.txt 2024-02-02 00:09:42.000000000 +0100 @@ -66,6 +66,7 @@ set(tenmon_ICON "") elseif(APPLE) set(tenmon_ICON ${CMAKE_CURRENT_SOURCE_DIR}/resources/tenmon.icns) + find_package(Qt6 COMPONENTS DBus REQUIRED) set_source_files_properties(${tenmon_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") else() set(tenmon_ICON "") @@ -85,7 +86,7 @@ target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} XISF) if(APPLE) - target_link_libraries(tenmon PRIVATE "-framework CoreFoundation") + target_link_libraries(tenmon PRIVATE Qt6::DBus "-framework CoreFoundation") elseif(UNIX) target_link_libraries(tenmon PRIVATE Qt6::DBus ${GIO_LDFLAGS}) endif(APPLE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/imageinfo.cpp new/tenmon/imageinfo.cpp --- old/tenmon/imageinfo.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/imageinfo.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -81,7 +81,7 @@ QTreeWidgetItem *fitsHeader = new QTreeWidgetItem({tr("FITS Header")}); for(const FITSRecord &record : info.fitsHeader) { - new QTreeWidgetItem(fitsHeader, {record.key, record.value.toString(), record.comment}); + new QTreeWidgetItem(fitsHeader, {record.key, record.value.toString().left(1024), record.comment}); } addTopLevelItem(fitsHeader); } @@ -279,7 +279,7 @@ t = t.addSecs(ra * 240); double deg, min, sec; - min = std::modf(dec, °) * 60; + min = std::abs(std::modf(dec, °) * 60); sec = std::modf(min, &min) * 60; return QString("RA: %1 DEC: %2° %3' %4\"").arg(t.toString("HH'h' mm'm' ss's'")).arg(deg, 2, 'f', 0, '0').arg(min, 2, 'f', 0, '0').arg(sec, 2, 'f', 0, '0'); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/imagescrollareagl.cpp new/tenmon/imagescrollareagl.cpp --- old/tenmon/imagescrollareagl.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/imagescrollareagl.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -90,14 +90,27 @@ void ImageWidget::setImage(std::shared_ptr<RawImage> image, int index) { - if(image == nullptr)return; + m_currentImg = index; + + if(!image || !image->valid()) + { + m_imgWidth = 0; + m_imgHeight = 0; + m_error = tr("Failed to load image"); + m_rawImage.reset(); + update(); + return; + } + + m_error.clear(); makeCurrent(); m_rawImage = image; - m_rawImage->downscaleTo(m_maxTextureSize); + if((int)image->width() > m_maxTextureSize || (int)image->height() > m_maxTextureSize) + m_rawImage->resize(std::min(m_maxTextureSize, (int)image->width()), std::min(m_maxTextureSize, (int)image->height())); m_imgWidth = image->width(); m_imgHeight = image->height(); - m_currentImg = index; + if(!m_image)return; @@ -290,7 +303,7 @@ { makeCurrent(); const RawImage *raw = image->thumbnail(); - if(!raw)return; + if(!raw || !raw->valid())return; m_thumbnailTexture->setData(0, image->number(), QOpenGLTexture::RGBA, QOpenGLTexture::UInt16, raw->data(), m_transferOptions.get()); float a = raw->thumbAspect(); int sizes[3] = { std::max(1, a > 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE * a)), std::max(1, a < 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE / a)), image->number() }; @@ -375,6 +388,13 @@ } } } + else if(!m_error.isEmpty()) + { + QPainter painter(this); + painter.setPen(Qt::red); + painter.setFont(QFont("Sans", 24, QFont::Bold)); + painter.drawText(0, 0, width(), height(), Qt::AlignCenter | Qt::AlignHCenter, m_error); + } else { debayer(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/imagescrollareagl.h new/tenmon/imagescrollareagl.h --- old/tenmon/imagescrollareagl.h 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/imagescrollareagl.h 2024-02-02 00:09:42.000000000 +0100 @@ -69,6 +69,7 @@ QVector<ImageThumb> m_thumnails; Database *m_database = nullptr; QPointF m_lastPos; + QString m_error; public: explicit ImageWidget(Database *database, QWidget *parent = nullptr); ~ImageWidget() override; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/loadrunable.cpp new/tenmon/loadrunable.cpp --- old/tenmon/loadrunable.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/loadrunable.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -274,6 +274,15 @@ if(file) loadFITSHeader(file, info); + if(image) + { + for(auto fits : info.fitsHeader) + { + if(fits.key == "ROWORDER" && fits.value == "BOTTOM-UP") + image->flip(); + } + } + fits_close_file(file, &status); if(status) { @@ -478,14 +487,19 @@ if(m_thumbnail) { - if(rawImage) + if(rawImage && rawImage->valid()) { + if(QUALITY_RESIZE) + rawImage->resize(THUMB_SIZE, THUMB_SIZE); + rawImage->convertToThumbnail(); - QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(std::shared_ptr<RawImage>, rawImage)); } + QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(std::shared_ptr<RawImage>, rawImage)); } else + { QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(std::shared_ptr<RawImage>, rawImage), Q_ARG(ImageInfoData, info)); + } } catch(std::exception e) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/mainwindow.cpp new/tenmon/mainwindow.cpp --- old/tenmon/mainwindow.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/mainwindow.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -62,6 +62,7 @@ _openFilter.append("*.fit *.fits *.xisf *.cr2 *.cr3 *.nef *.dng)"); _openFilter.append(tr(";;All files (*)")); nameFilter.append({"fit", "fits", "xisf", "cr2", "cr3", "nef", "dng"}); + QImageReader::setAllocationLimit(0); m_info = new ImageInfo(this); QDockWidget *infoDock = new QDockWidget(tr("Image info"), this); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/rawimage.cpp new/tenmon/rawimage.cpp --- old/tenmon/rawimage.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/rawimage.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -7,9 +7,12 @@ int THUMB_SIZE_BORDER = 138; int THUMB_SIZE_BORDER_Y = 158; double SATURATION = 0.95; +bool QUALITY_RESIZE = true; +#ifdef __SSE2__ template<typename T, int ch> void fromPlanarSSE(const void *in, void *out, size_t count); +#endif size_t RawImage::typeSize(RawImage::DataType type) { @@ -386,7 +389,11 @@ void RawImage::convertToThumbnail() { - m_thumbAspect = (float)width() / height(); + if(!valid()) + return; + + if(m_thumbAspect == 0.0f) + m_thumbAspect = (float)width() / height(); std::unique_ptr<PixelType[]> outptr = std::make_unique<PixelType[]>(THUMB_SIZE * THUMB_SIZE * 4 * sizeof(uint16_t)); uint16_t *out = reinterpret_cast<uint16_t*>(outptr.get()); @@ -398,6 +405,7 @@ { int idx = (i*THUMB_SIZE + o)*4; int idx2 = ((i * m_height / THUMB_SIZE * m_width) + (o * m_width / THUMB_SIZE)) * m_ch; + if(m_channels == 1) { out[idx] = out[idx + 1] = out[idx + 2] = in[idx2] * scale; @@ -557,14 +565,81 @@ return true; } -void RawImage::downscaleTo(uint32_t size) +template<typename T> +void boxResample(uint32_t w, uint32_t h, uint32_t ch, uint32_t oldw, uint32_t oldh, const uint8_t *in_, uint8_t *out_) +{ + if(oldw == 0 || oldh == 0)return; + + const T *in = reinterpret_cast<const T*>(in_); + T *out = reinterpret_cast<T*>(out_); + float max = 255.0f; + if constexpr(std::is_same<T, uint16_t>::value) + max = UINT16_MAX; + + float sx = (float)w / oldw; + float sy = (float)h / oldh; + for(uint32_t y = 0; y < h; y++)//iterate over destination Y + { + for(uint32_t x = 0; x < w; x++)//iterate over destination X + { + float p[4] = {0.0f}; + uint32_t xx = x * oldw / w;//calculate source rect + uint32_t yy = y * oldh / h; + uint32_t xe = std::min((x + 1) * oldw / w, oldw - 1); + uint32_t ye = std::min((y + 1) * oldh / h, oldh - 1); + for(uint32_t o = yy; o <= ye; o++)//iterate over source Y + { + float cy = o * sy - y; + if(cy < 0.0f)cy = sy + cy; + else if(sy + cy > 1.0f)cy = 1.0f - cy; + else cy = sy; + if(yy==ye)cy = 1.0f; + for(uint32_t i = xx; i <= xe; i++)//iterate over source X + { + float cx = i * sx - x; + if(cx < 0.0f)cx = sx + cx; + else if(sx + cx > 1.0f)cx = 1.0f - cx; + else cx = sx; + if(xx==xe)cx = 1.0f; + for(uint32_t z = 0; z < ch; z++) + p[z] += in[(o * oldw + i) * ch + z] * cy * cx; + } + } + for(uint32_t z = 0; z < ch; z++) + if constexpr(std::is_floating_point<T>::value) + out[(y * w + x) * ch + z] = p[z]; + else + out[(y * w + x) * ch + z] = std::clamp(std::round(p[z]), 0.0f, max); + } + } +} + +void RawImage::resize(uint32_t w, uint32_t h) { - /*if(size < width() || size < height()) + if(!valid())return; + + std::unique_ptr<PixelType[]> old_pixels = std::move(m_pixels); + uint32_t oldw = m_width; + uint32_t oldh = m_height; + m_thumbAspect = (float)m_width / m_height; + + allocate(w, h, m_channels, m_type); + + switch(m_type) { - double s = (double)size / std::max(width(), height()); - cv::Size dsize(std::floor(width() * s), std::floor(height() * s)); - cv::resize(m_img, m_img, dsize, 0, 0, cv::INTER_AREA); - }*/ + case RawImage::UINT8: + boxResample<uint8_t>(w, h, m_ch, oldw, oldh, old_pixels.get(), m_pixels.get()); + break; + case RawImage::UINT16: + boxResample<uint16_t>(w, h, m_ch, oldw, oldh, old_pixels.get(), m_pixels.get()); + break; + case RawImage::FLOAT32: + boxResample<float>(w, h, m_ch, oldw, oldh, old_pixels.get(), m_pixels.get()); + break; + default: + qWarning() << "Resizing format not supported"; + break; + } } std::pair<float, float> RawImage::unitScale() const @@ -584,6 +659,15 @@ return {1.0f, 0.0f}; } +void RawImage::flip() +{ + std::unique_ptr<PixelType[]> tmp = std::move(m_pixels); + allocate(m_width, m_height, m_channels, m_type); + uint32_t rowSize = m_width * m_ch * typeSize(m_type); + for(uint32_t i=0; i<m_height; i++) + std::memcpy(m_pixels.get() + rowSize * (m_height - i - 1), tmp.get() + rowSize * i, rowSize); +} + std::shared_ptr<RawImage> RawImage::fromPlanar(const RawImage &img) { return RawImage::fromPlanar(img.data(), img.width(), img.height(), img.channels(), img.type()); @@ -690,3 +774,8 @@ return planes; } + +bool RawImage::valid() const +{ + return m_width > 0 && m_height > 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/rawimage.h new/tenmon/rawimage.h --- old/tenmon/rawimage.h 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/rawimage.h 2024-02-02 00:09:42.000000000 +0100 @@ -12,6 +12,7 @@ extern int THUMB_SIZE; extern int THUMB_SIZE_BORDER; extern int THUMB_SIZE_BORDER_Y; +extern bool QUALITY_RESIZE; class Peak { @@ -97,13 +98,15 @@ void convertToGLFormat(); float thumbAspect() const; bool pixel(int x, int y, double &r, double &g, double &b) const; - void downscaleTo(uint32_t size); + void resize(uint32_t w, uint32_t h); std::pair<float, float> unitScale() const; + void flip(); static std::shared_ptr<RawImage> fromPlanar(const RawImage &img); 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); std::vector<RawImage> split() const; + bool valid() const; }; //Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/rawimage_sse.cpp new/tenmon/rawimage_sse.cpp --- old/tenmon/rawimage_sse.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/rawimage_sse.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -1,4 +1,6 @@ #include "rawimage.h" + +#ifdef __SSE2__ #include <x86intrin.h> template<typename T, int ch> @@ -109,3 +111,5 @@ template void fromPlanarSSE<uint32_t, 4>(const void *in, void *out, size_t count); template void fromPlanarSSE<float, 3>(const void *in, void *out, size_t count); template void fromPlanarSSE<float, 4>(const void *in, void *out, size_t count); + +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/settingsdialog.cpp new/tenmon/settingsdialog.cpp --- old/tenmon/settingsdialog.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/settingsdialog.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -71,11 +71,16 @@ m_filtering->addItems({tr("Nearest"), tr("Linear"), tr("Cubic")}); m_filtering->setCurrentIndex(FILTERING); + m_qualityThumbnail = new QCheckBox(tr("Smooth thumbnails"), this); + m_qualityThumbnail->setChecked(QUALITY_RESIZE); + m_qualityThumbnail->setToolTip(tr("Use box filter when downsampling thumbnails instead of nearest. Slightly slower.")); + layout->addRow(tr("Image preload count"), m_preloadImages); layout->addRow(tr("Thumbnails size"), m_thumSize); layout->addRow(tr("Saturation"), m_saturation); layout->addRow(tr("Slideshow interval"), m_slideShowTime); - layout->addRow(tr("Image filtering"), m_filtering); + layout->addRow(tr("Image interpolation"), m_filtering); + layout->addRow(m_qualityThumbnail); layout->addRow(m_useNativeDialog); //layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart."))); @@ -97,6 +102,7 @@ DEFAULT_WIDTH = settings.value("settings/preloadimagecount", DEFAULT_WIDTH).toInt(); SATURATION = settings.value("settings/saturation", 95.0).toDouble() / 100.0; FILTERING = settings.value("settings/filtering", FILTERING).toInt(); + QUALITY_RESIZE = settings.value("settings/qualitythumbnail", QUALITY_RESIZE).toBool(); QApplication::setAttribute(Qt::AA_DontUseNativeDialogs, settings.value("settings/dontusenativedialogs", false).toBool()); } @@ -118,6 +124,8 @@ settings.setValue("settings/dontusenativedialogs", m_useNativeDialog->isChecked()); settings.setValue("settings/saturation", m_saturation->value()); settings.setValue("settings/slideshowtime", m_slideShowTime->value()); + settings.setValue("settings/qualitythumbnail", m_qualityThumbnail->isChecked()); + QUALITY_RESIZE = m_qualityThumbnail->isChecked(); FILTERING = m_filtering->currentIndex(); settings.setValue("settings/filtering", FILTERING); SATURATION = m_saturation->value() / 100.0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/settingsdialog.h new/tenmon/settingsdialog.h --- old/tenmon/settingsdialog.h 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/settingsdialog.h 2024-02-02 00:09:42.000000000 +0100 @@ -23,6 +23,7 @@ QDoubleSpinBox *m_slideShowTime; QDoubleSpinBox *m_saturation; QCheckBox *m_useNativeDialog; + QCheckBox *m_qualityThumbnail; QComboBox *m_filtering; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/space.nouspiro.tenmon.metainfo.xml new/tenmon/space.nouspiro.tenmon.metainfo.xml --- old/tenmon/space.nouspiro.tenmon.metainfo.xml 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/space.nouspiro.tenmon.metainfo.xml 2024-02-02 00:09:42.000000000 +0100 @@ -4,6 +4,10 @@ <launchable type="desktop-id">space.nouspiro.tenmon.desktop</launchable> <name>Tenmon</name> <summary>FITS/XISF image viewer, converter, index and search</summary> + <developer id="nouspiro.space"> + <name>DuÅ¡an Poizl</name> + </developer> + <developer_name>DuÅ¡an Poizl</developer_name> <metadata_license>CC0-1.0</metadata_license> <project_license>GPL-3.0</project_license> <description> @@ -11,7 +15,7 @@ <ul> <li>FITS 8, 16, 32 bit integer and 32, 64 bit float</li> <li>XISF 8, 16, 32 bit integer and 32, 64 bit float</li> - <li>RAW CR2, DNG, NEF</li> + <li>RAW CR2/CR3, DNG, NEF</li> <li>JPEG, PNG, BMP, GIF, PBM, PGM, PPM and SVG images</li> </ul> <p>Features of application:</p> @@ -43,13 +47,26 @@ <url type="bugtracker">https://github.com/flathub/space.nouspiro.tenmon/issues</url> <screenshots> <screenshot type="default"> + <caption>Main window with image</caption> <image>https://nouspiro.space/wp-content/uploads/2022/04/tenmon-1024x579.png</image> + </screenshot> + <screenshot type="default"> + <caption>Thumnail view</caption> <image>https://nouspiro.space/wp-content/uploads/2022/12/tenmon2-1024x645.png</image> </screenshot> </screenshots> <content_rating type="oars-1.1"/> <releases> - <release version="20240108" date="2023-01-08"> + <release version="20240201" date="2024-02-01"> + <description> + <ul> + <li>Smooth thumbnails</li> + <li>Respect ROWORDER</li> + <li>Bugfixes</li> + </ul> + </description> + </release> + <release version="20240108" date="2024-01-08"> <description> <ul> <li>Update to Qt6</li> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/stretchtoolbar.cpp new/tenmon/stretchtoolbar.cpp --- old/tenmon/stretchtoolbar.cpp 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/stretchtoolbar.cpp 2024-02-02 00:09:42.000000000 +0100 @@ -120,12 +120,15 @@ mad = stats.m_mad[i]; max = stats.m_max[i]; median /= img->rawImage()->norm(); + bool a = median > 0.5 ? true : false; mad /= img->rawImage()->norm(); - max /= img->rawImage()->norm(); - float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA; - float mid = MTF(median - bp, TARGET_BACKGROUND); + max = 1.0f;// /= img->rawImage()->norm(); + float bp = a || mad == 0.0f ? 0.0f : std::clamp(median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA, 0.0, 1.0); + if(a && mad != 0.0f) + max = std::clamp(median - mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA, 0.0, 1.0); + float mid = !a ? MTF(median - bp, TARGET_BACKGROUND) : MTF(TARGET_BACKGROUND, max - median); m_mtfParam.blackPoint[i-o] = bp; - m_mtfParam.midPoint[i-o] = mid / max; + m_mtfParam.midPoint[i-o] = mid;// / max; m_mtfParam.whitePoint[i-o] = max; bp2 += bp; mid2 += mid; Binary files old/tenmon/translations/tenmon_en.qm and new/tenmon/translations/tenmon_en.qm differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/translations/tenmon_en.ts new/tenmon/translations/tenmon_en.ts --- old/tenmon/translations/tenmon_en.ts 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/translations/tenmon_en.ts 2024-02-02 00:09:42.000000000 +0100 @@ -9,6 +9,89 @@ </message> </context> <context> + <name>BatchProcessing</name> + <message> + <source>Batch Processing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Input files and directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Log</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interrupt running script?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory path doesn't exist or is not writable</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>DataBaseView</name> <message> <source>Select columns</source> @@ -165,6 +248,10 @@ <source>R:%1 G:%2 B:%3</source> <translation>R:%1 G:%2 B:%3</translation> </message> + <message> + <source>Failed to load image</source> + <translation>Failed to load image</translation> + </message> </context> <context> <name>MainWindow</name> @@ -408,6 +495,30 @@ <source>Histogram</source> <translation>Histogram</translation> </message> + <message> + <source>Bayer mask</source> + <translation>Bayer mask</translation> + </message> + <message> + <source>RGGB</source> + <translation>RGGB</translation> + </message> + <message> + <source>GRBG</source> + <translation>GRBG</translation> + </message> + <message> + <source>GBRG</source> + <translation>GBRG</translation> + </message> + <message> + <source>BGGR</source> + <translation>BGGR</translation> + </message> + <message> + <source>Slideshow</source> + <translation>Slideshow</translation> + </message> </context> <context> <name>MarkedFiles</name> @@ -537,6 +648,38 @@ <source>Saturation</source> <translation>Saturated</translation> </message> + <message> + <source>Nearest</source> + <translation>Nearest</translation> + </message> + <message> + <source>Linear</source> + <translation>Linear</translation> + </message> + <message> + <source>Cubic</source> + <translation>Cubic</translation> + </message> + <message> + <source>Smooth thumbnails</source> + <translation>Smooth thumbnails</translation> + </message> + <message> + <source>Use box filter when downsampling thumbnails instead of nearest. Slightly slower.</source> + <translation>Use box filter when downsampling thumbnails instead of nearest. Slightly slower.</translation> + </message> + <message> + <source>Slideshow interval</source> + <translation>Slideshow interval</translation> + </message> + <message> + <source>Image filtering</source> + <translation type="obsolete">Image sampling</translation> + </message> + <message> + <source>Image interpolation</source> + <translation>Image interpolation</translation> + </message> </context> <context> <name>StretchToolbar</name> Binary files old/tenmon/translations/tenmon_fr.qm and new/tenmon/translations/tenmon_fr.qm differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/translations/tenmon_fr.ts new/tenmon/translations/tenmon_fr.ts --- old/tenmon/translations/tenmon_fr.ts 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/translations/tenmon_fr.ts 2024-02-02 00:09:42.000000000 +0100 @@ -9,6 +9,89 @@ </message> </context> <context> + <name>BatchProcessing</name> + <message> + <source>Batch Processing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Input files and directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Log</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interrupt running script?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory path doesn't exist or is not writable</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>DataBaseView</name> <message> <source>Select columns</source> @@ -165,6 +248,10 @@ <source>R:%1 G:%2 B:%3</source> <translation>R:%1 G:%2 B:%3</translation> </message> + <message> + <source>Failed to load image</source> + <translation>Ãchec du chargement de l'image</translation> + </message> </context> <context> <name>MainWindow</name> @@ -408,6 +495,30 @@ <source>Histogram</source> <translation>Histogramme</translation> </message> + <message> + <source>Bayer mask</source> + <translation>Masque Bayer</translation> + </message> + <message> + <source>RGGB</source> + <translation>RGGB</translation> + </message> + <message> + <source>GRBG</source> + <translation>GRBG</translation> + </message> + <message> + <source>GBRG</source> + <translation>GBRG</translation> + </message> + <message> + <source>BGGR</source> + <translation>BGGR</translation> + </message> + <message> + <source>Slideshow</source> + <translation>Diaporama</translation> + </message> </context> <context> <name>MarkedFiles</name> @@ -537,6 +648,38 @@ <source>Saturation</source> <translation>Saturé</translation> </message> + <message> + <source>Nearest</source> + <translation>Voisin le plus proche</translation> + </message> + <message> + <source>Linear</source> + <translation>Linéaire</translation> + </message> + <message> + <source>Cubic</source> + <translation>Cubique</translation> + </message> + <message> + <source>Smooth thumbnails</source> + <translation>Miniatures fluides</translation> + </message> + <message> + <source>Use box filter when downsampling thumbnails instead of nearest. Slightly slower.</source> + <translation>Utilisez un filtre encadré lors du sous-échantillonnage des vignettes au lieu des plus proches. Un peu plus lent.</translation> + </message> + <message> + <source>Slideshow interval</source> + <translation>Intervalle du diaporama</translation> + </message> + <message> + <source>Image filtering</source> + <translation type="obsolete">Ãchantillonnage d'images</translation> + </message> + <message> + <source>Image interpolation</source> + <translation>Interpolation d'images</translation> + </message> </context> <context> <name>StretchToolbar</name> Binary files old/tenmon/translations/tenmon_sk.qm and new/tenmon/translations/tenmon_sk.qm differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenmon/translations/tenmon_sk.ts new/tenmon/translations/tenmon_sk.ts --- old/tenmon/translations/tenmon_sk.ts 2024-01-08 16:52:46.000000000 +0100 +++ new/tenmon/translations/tenmon_sk.ts 2024-02-02 00:09:42.000000000 +0100 @@ -9,6 +9,89 @@ </message> </context> <context> + <name>BatchProcessing</name> + <message> + <source>Batch Processing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Input files and directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove all</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open scripts</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Log</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Stop script</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Interrupt running script?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid output directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Output directory path doesn't exist or is not writable</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>DataBaseView</name> <message> <source>Select columns</source> @@ -166,6 +249,10 @@ <source>R:%1 G:%2 B:%3</source> <translation>R:%1 G:%2 B:%3</translation> </message> + <message> + <source>Failed to load image</source> + <translation>Zlyhalo naÄÃtanie obrázka</translation> + </message> </context> <context> <name>MainWindow</name> @@ -409,6 +496,30 @@ <source>Histogram</source> <translation>Histogram</translation> </message> + <message> + <source>Bayer mask</source> + <translation>Bayerova maska</translation> + </message> + <message> + <source>RGGB</source> + <translation>RGGB</translation> + </message> + <message> + <source>GRBG</source> + <translation>GRBG</translation> + </message> + <message> + <source>GBRG</source> + <translation>GBRG</translation> + </message> + <message> + <source>BGGR</source> + <translation>BGGR</translation> + </message> + <message> + <source>Slideshow</source> + <translation>Prezentácia</translation> + </message> </context> <context> <name>MarkedFiles</name> @@ -538,6 +649,34 @@ <source>Saturation</source> <translation>Saturované</translation> </message> + <message> + <source>Nearest</source> + <translation>Žiadna</translation> + </message> + <message> + <source>Linear</source> + <translation>Lineárna</translation> + </message> + <message> + <source>Cubic</source> + <translation>Kubická</translation> + </message> + <message> + <source>Smooth thumbnails</source> + <translation>Hladké náhľady</translation> + </message> + <message> + <source>Use box filter when downsampling thumbnails instead of nearest. Slightly slower.</source> + <translation>Pri zemnÅ¡ovanà obrázkov na náhľady sa pixely spriemerujú namiesto najblžšej hodnoty. Trocha pomalÅ¡ie.</translation> + </message> + <message> + <source>Slideshow interval</source> + <translation>Interval medzi obrázkami</translation> + </message> + <message> + <source>Image interpolation</source> + <translation>Interpolácia obrázku</translation> + </message> </context> <context> <name>StretchToolbar</name> ++++++ use_system_libxisf.patch ++++++ --- /var/tmp/diff_new_pack.3lHBjv/_old 2024-02-14 23:19:26.185762076 +0100 +++ /var/tmp/diff_new_pack.3lHBjv/_new 2024-02-14 23:19:26.185762076 +0100 @@ -12,7 +12,7 @@ set(TENMON_SRC about.cpp about.h -@@ -77,13 +76,13 @@ endif() +@@ -78,13 +77,13 @@ endif() qt_add_executable(tenmon WIN32 MACOSX_BUNDLE ${tenmon_ICON} ${TENMON_SRC}) find_path(FITS_INCLUDE fitsio2.h PATH_SUFFIXES cfitsio REQUIRED) @@ -26,6 +26,6 @@ -target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} XISF) +target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LibXISF_LIBRARY}) if(APPLE) - target_link_libraries(tenmon PRIVATE "-framework CoreFoundation") + target_link_libraries(tenmon PRIVATE Qt6::DBus "-framework CoreFoundation") elseif(UNIX)