From 9749e824a53afd1490a85ea42dddeda696a4f90e Mon Sep 17 00:00:00 2001
From: Eirik Aavitsland <eirik.aavitsland@qt.io>
Date: Mon, 28 May 2018 15:05:13 +0200
Subject: [PATCH] webp handler: improve quality-level handling

In lossless mode, libwebp interpretes the quality setting as a
compression-effort setting instead. The code used to set it to 100
(maximum), which could lead to unreasonable compression times (several
seconds for a small image). Instead set it to libweb's own default value.

Also, since the alpha channel compression has its own quality setting,
make sure it follows the main quality/effort setting.

Change-Id: I595d42c61f61c9932b27b185745bde6e7cfb3526
Reviewed-by: Liang Qi <liang.qi@qt.io>
---
 src/plugins/imageformats/webp/qwebphandler.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index 12c4001f..578a7010 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -248,8 +248,15 @@ bool QWebpHandler::write(const QImage &image)
         return false;
     }
 
-    config.quality = m_quality < 0 ? 75 : qMin(m_quality, 100);
-    config.lossless = (config.quality >= 100);
+    int reqQuality = m_quality < 0 ? 75 : qMin(m_quality, 100);
+    if (reqQuality < 100) {
+        config.lossless = 0;
+        config.quality = reqQuality;
+    } else {
+        config.lossless = 1;
+        config.quality = 70;  // For lossless, specifies compression effort; 70 is libwebp default
+    }
+    config.alpha_quality = config.quality;
     picture.writer = pictureWriter;
     picture.custom_ptr = device();
 
-- 
GitLab