From a68cb73c4e071ed24b18a95e11fbbbc8d59840b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9ven=20Car?= Date: Sun, 21 Mar 2021 05:22:57 +0100 Subject: [PATCH] PreviewJob: Initialize cachesSize with 0, only pass size > 0 to shmget, improve createThumbnail BUG: 430862 --- src/widgets/previewjob.cpp | 48 +++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/widgets/previewjob.cpp b/src/widgets/previewjob.cpp index 988da16b0..9b6e661e8 100644 --- a/src/widgets/previewjob.cpp +++ b/src/widgets/previewjob.cpp @@ -70,7 +70,7 @@ public: : initialItems(items) , width(size.width()) , height(size.height()) - , cacheSize(-1) + , cacheSize(0) , bScale(true) , bSave(true) , ignoreMaximumSize(false) @@ -114,8 +114,8 @@ public: // Size of thumbnail int width; int height; - // Unscaled size of thumbnail (128 or 256 if cache is enabled) - int cacheSize; + // Unscaled size of thumbnail (128, 256 or 512 if cache is enabled) + ushort cacheSize; // Whether the thumbnail should be scaled bool bScale; // Whether we should save the thumbnail @@ -712,39 +712,49 @@ void PreviewJobPrivate::createThumbnail(const QString &pixPath) }); bool save = bSave && currentItem.plugin->property(QStringLiteral("CacheThumbnail")).toBool() && !sequenceIndex; + int thumb_width = width; + int thumb_height = height; + int thumb_iconSize = iconSize; + if (save) { + thumb_width = thumb_height = cacheSize; + thumb_iconSize = 64; + } + job->addMetaData(QStringLiteral("mimeType"), currentItem.item.mimetype()); - job->addMetaData(QStringLiteral("width"), QString().setNum(save ? cacheSize : width)); - job->addMetaData(QStringLiteral("height"), QString().setNum(save ? cacheSize : height)); - job->addMetaData(QStringLiteral("iconSize"), QString().setNum(save ? 64 : iconSize)); - job->addMetaData(QStringLiteral("iconAlpha"), QString().setNum(iconAlpha)); + job->addMetaData(QStringLiteral("width"), QString::number(thumb_width)); + job->addMetaData(QStringLiteral("height"), QString::number(thumb_height)); + job->addMetaData(QStringLiteral("iconSize"), QString::number(thumb_iconSize)); + job->addMetaData(QStringLiteral("iconAlpha"), QString::number(iconAlpha)); job->addMetaData(QStringLiteral("plugin"), currentItem.plugin->library()); job->addMetaData(QStringLiteral("enabledPlugins"), enabledPlugins.join(QLatin1Char(','))); job->addMetaData(QStringLiteral("devicePixelRatio"), QString::number(devicePixelRatio)); if (sequenceIndex) { - job->addMetaData(QStringLiteral("sequence-index"), QString().setNum(sequenceIndex)); + job->addMetaData(QStringLiteral("sequence-index"), QString::number(sequenceIndex)); } #if WITH_SHM if (shmid == -1) { if (shmaddr) { + // clean previous shared memory segment shmdt((char *)shmaddr); shmctl(shmid, IPC_RMID, nullptr); + shmaddr = nullptr; } - auto size = std::max(cacheSize * cacheSize, width * height); - shmid = shmget(IPC_PRIVATE, size * 4 * devicePixelRatio * devicePixelRatio, IPC_CREAT | 0600); - if (shmid != -1) { - shmaddr = (uchar *)(shmat(shmid, nullptr, SHM_RDONLY)); - if (shmaddr == (uchar *)-1) { - shmctl(shmid, IPC_RMID, nullptr); - shmaddr = nullptr; - shmid = -1; + auto size = thumb_width * thumb_height; + if (size > 0) { + shmid = shmget(IPC_PRIVATE, size * 4 * devicePixelRatio * devicePixelRatio, IPC_CREAT | 0600); + if (shmid != -1) { + shmaddr = (uchar *)(shmat(shmid, nullptr, SHM_RDONLY)); + if (shmaddr == (uchar *)-1) { + shmctl(shmid, IPC_RMID, nullptr); + shmaddr = nullptr; + shmid = -1; + } } - } else { - shmaddr = nullptr; } } if (shmid != -1) { - job->addMetaData(QStringLiteral("shmid"), QString().setNum(shmid)); + job->addMetaData(QStringLiteral("shmid"), QString::number(shmid)); } #endif } -- GitLab