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, &deg) * 60;
+    min = std::abs(std::modf(dec, &deg) * 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&apos;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&apos;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&apos;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&apos;images</translation>
+    </message>
+    <message>
+        <source>Image interpolation</source>
+        <translation>Interpolation d&apos;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&apos;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)
 

Reply via email to