changeset 31212:55415fa6a20f

svgconvert: Use Lossless encoding of images when available (bug #52193) * acinclude.m4: Check that QPainter::LosslessImageRendering flag is available. * octave-svgconvert.cc (draw): Use new flag if available. * print.m (doc): Update word of caution about svgconvert and images.
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Mon, 29 Aug 2022 16:36:34 +0200
parents 8340137bb190
children bc385e42e09a
files m4/acinclude.m4 scripts/plot/util/print.m src/octave-svgconvert.cc
diffstat 3 files changed, 35 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/m4/acinclude.m4	Mon Aug 29 13:58:00 2022 +0200
+++ b/m4/acinclude.m4	Mon Aug 29 16:36:34 2022 +0200
@@ -804,6 +804,35 @@
   fi
 ])
 dnl
+dnl Check whether the Qt method QPainter::setRenderHint accepts the
+dnl QPainter::LosslessImageRendering flag.  This flag was introduced in Qt 5.13.
+dnl
+AC_DEFUN([OCTAVE_CHECK_FUNC_QPAINTER_SETRENDERHINT_LOSSLESS], [
+  AC_CACHE_CHECK([for QPainter::LosslessImageRendering flag],
+    [octave_cv_func_qpainter_setrenderhint_lossless],
+    [AC_LANG_PUSH(C++)
+    ac_octave_save_CPPFLAGS="$CPPFLAGS"
+    ac_octave_save_CXXFLAGS="$CXXFLAGS"
+    CPPFLAGS="$QT_CPPFLAGS $CXXPICFLAG $CPPFLAGS"
+    CXXFLAGS="$CXXPICFLAG $CXXFLAGS"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+        #include <QPainter>
+        ]], [[
+        QPainter painter;
+        painter.setRenderHint (QPainter::LosslessImageRendering);
+        ]])],
+      octave_cv_func_qpainter_setrenderhint_lossless=yes,
+      octave_cv_func_qpainter_setrenderhint_lossless=no)
+    CPPFLAGS="$ac_octave_save_CPPFLAGS"
+    CXXFLAGS="$ac_octave_save_CXXFLAGS"
+    AC_LANG_POP(C++)
+  ])
+  if test $octave_cv_func_qpainter_setrenderhint_lossless = yes; then
+    AC_DEFINE(HAVE_QPAINTER_RENDERHINT_LOSSLESS, 1,
+      [Define to 1 if you have the `QPainter::LosslessImageRendering' flag.])
+  fi
+])
+dnl
 dnl Check whether HDF5 library has version 1.6 API functions.
 dnl
 AC_DEFUN([OCTAVE_CHECK_HDF5_HAS_VER_16_API], [
@@ -2279,6 +2308,7 @@
     OCTAVE_CHECK_FUNC_QHELPENGINE_DOCUMENTSFORIDENTIFIER
     OCTAVE_CHECK_FUNC_QWHEELEVENT_ANGLEDELTA
     OCTAVE_CHECK_FUNC_QWHEELEVENT_POSITION
+    OCTAVE_CHECK_FUNC_QPAINTER_SETRENDERHINT_LOSSLESS
 
     OCTAVE_CHECK_QOVERLOAD_TEMPLATE
     OCTAVE_CHECK_QREGION_ITERATORS
--- a/scripts/plot/util/print.m	Mon Aug 29 13:58:00 2022 +0200
+++ b/scripts/plot/util/print.m	Mon Aug 29 16:36:34 2022 +0200
@@ -152,8 +152,8 @@
 ## output to be rasterized.
 ## @end table
 ##
-## Caution: @option{-svgconvert} may lead to inaccurate rendering of image
-## objects.
+## Caution: If Octave was built against Qt version earlier than 5.13,
+## @option{-svgconvert} may lead to inaccurate rendering of image objects.
 ##
 ## @item  -portrait
 ## @itemx -landscape
--- a/src/octave-svgconvert.cc	Mon Aug 29 13:58:00 2022 +0200
+++ b/src/octave-svgconvert.cc	Mon Aug 29 16:36:34 2022 +0200
@@ -653,6 +653,9 @@
                 }
 
               painter.setRenderHint (QPainter::Antialiasing, false);
+#if defined (HAVE_QPAINTER_RENDERHINT_LOSSLESS)
+              painter.setRenderHint (QPainter::LosslessImageRendering);
+#endif
               painter.drawImage (pos, img);
               painter.setRenderHint (QPainter::Antialiasing, true);
               painter.restore  ();