From 3b98cbf4a375588c1133f8692ba79fafaa599c54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bodn=C3=A1r=20Zsombor?= <bodzsoaa@sch.bme.hu>
Date: Fri, 19 Feb 2021 20:05:14 +0100
Subject: [PATCH] Use latest Qt 5 version

Latest Qt 5 is more feature complete than Qt 6
---
 CMakeLists.txt          |  2 +-
 conanfile.py            |  2 +-
 src/CMakeLists.txt      |  8 ++++----
 src/muebreceiver.cc     |  6 +++---
 src/muebtransmitter.cc  | 22 ++++++++++++++++------
 src/muebtransmitter_p.h | 27 +++++++++++++++++++++++++++
 6 files changed, 52 insertions(+), 15 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0aee6e5..ed55411 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,7 +25,7 @@ conan_basic_setup()
 endif()
 
 find_package(
-  Qt6
+  Qt5
   COMPONENTS Core Gui Network Concurrent
   REQUIRED)
 
diff --git a/conanfile.py b/conanfile.py
index 2a430de..9d04c69 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -12,7 +12,7 @@ class LibmuebConan(ConanFile):
     settings = "os", "compiler", "build_type", "arch"
     options = {"shared": [True], "fPIC": [True]}
     default_options = {"shared": True, "fPIC": True}
-    requires = "qt/[^6.0.0]@bincrafters/stable"
+    requires = "qt/[^5.15.2]"
     build_requires = "cmake/[^3.17.0]", "ninja/1.10.2"
     generators = "cmake"
     exports_sources = "CMakeLists.txt", "!CMakeLists.txt.user", "include/*", "src/*"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 978fc1a..e6ea989 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -6,8 +6,8 @@ add_library(
 target_include_directories(muebtransmitter PUBLIC ../include/${PROJECT_NAME})
 target_link_libraries(
   muebtransmitter
-  PUBLIC Qt6::Core Qt6::Gui
-  PRIVATE Qt6::Network Qt6::Concurrent)
+  PUBLIC Qt5::Core Qt5::Gui
+  PRIVATE Qt5::Network Qt5::Concurrent)
 target_compile_definitions(muebtransmitter PRIVATE LIBMUEB_LIBRARY)
 
 add_library(
@@ -18,6 +18,6 @@ add_library(
 target_include_directories(muebreceiver PUBLIC ../include/${PROJECT_NAME})
 target_link_libraries(
   muebreceiver
-  PUBLIC Qt6::Core Qt6::Gui
-  PRIVATE Qt6::Network)
+  PUBLIC Qt5::Core Qt5::Gui
+  PRIVATE Qt5::Network)
 target_compile_definitions(muebreceiver PRIVATE LIBMUEB_LIBRARY)
diff --git a/src/muebreceiver.cc b/src/muebreceiver.cc
index 1794589..79fff6c 100644
--- a/src/muebreceiver.cc
+++ b/src/muebreceiver.cc
@@ -31,18 +31,18 @@ void MuebReceiver::ReadPendingDatagrams() {
 
   while (d->socket.hasPendingDatagrams()) {
     if (d->socket.pendingDatagramSize() == d->configuration.packet_size()) {
-      QNetworkDatagram datagram = d->socket.receiveDatagram();
+      const QNetworkDatagram &datagram = d->socket.receiveDatagram();
       QByteArray data = datagram.data();
 
       // Process datagram
       // Packet header check
       // Check protocol
-      if (data[0] != d->configuration.protocol_type()) {
+      if (data.at(0) != d->configuration.protocol_type()) {
         datagram_uncompress_error();
         return;
       }
 
-      auto packet_number = data[1];
+      auto packet_number = data.at(1);
       if (packet_number >= d->configuration.max_packet_number() ||
           packet_number < 0) {
         datagram_uncompress_error();
diff --git a/src/muebtransmitter.cc b/src/muebtransmitter.cc
index b08bf25..bc98b87 100644
--- a/src/muebtransmitter.cc
+++ b/src/muebtransmitter.cc
@@ -22,12 +22,18 @@ void MuebTransmitter::SendFrame(libmueb::Frame frame) {
   QByteArray reduced_compressed_frame;
   // Frame color reduction and compression
   if (d->configuration_.color_depth() < 5) {
+    // FIXME Remove in Qt 6
     reduced_compressed_frame = QtConcurrent::blockingMappedReduced<QByteArray>(
         frame.constBits(), frame.constBits() + frame.sizeInBytes(),
-        /* Reference:
-         * http://threadlocalmutex.com/?p=48
-         * http://threadlocalmutex.com/?page_id=60
-         */
+        d->reduceColor, d->compressColor,
+        QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
+
+    /* FIXME Add in Qt 6
+    reduced_compressed_frame = QtConcurrent::blockingMappedReduced<QByteArray>(
+        frame.constBits(), frame.constBits() + frame.sizeInBytes(),
+        // Reference:
+        // http://threadlocalmutex.com/?p=48
+        // http://threadlocalmutex.com/?page_id=60
         [d](const uchar& color) -> uchar {
           if (d->configuration_.color_depth() == 3) {
             return (color * 225 + 4096) >> 13;
@@ -49,7 +55,7 @@ void MuebTransmitter::SendFrame(libmueb::Frame frame) {
 
           msb = !msb;
         },
-        QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
+        QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);*/
   }
   // No compression
   else {
@@ -68,9 +74,13 @@ void MuebTransmitter::SendFrame(libmueb::Frame frame) {
       QByteArray data;
       data.append(d->configuration_.protocol_type())
           .append(i /*packet number*/)
-          .append(reduced_compressed_frame.sliced(
+          .append(reduced_compressed_frame.mid(
               i * d->configuration_.packet_payload_size(),
               d->configuration_.packet_payload_size()));
+      /* FIXME in Qt6
+      .append(reduced_compressed_frame.sliced(
+          i * d->configuration_.packet_payload_size(),
+          d->configuration_.packet_payload_size()));*/
 
       d->datagram_.setData(data);
       d->socket_.writeDatagram(d->datagram_);
diff --git a/src/muebtransmitter_p.h b/src/muebtransmitter_p.h
index 19e4a95..963c54c 100644
--- a/src/muebtransmitter_p.h
+++ b/src/muebtransmitter_p.h
@@ -29,6 +29,33 @@ class MuebTransmitterPrivate {
   QUdpSocket socket_;
   QNetworkDatagram datagram_;
   MuebTransmitter* q_ptr;
+
+  // FIXME Remove in Qt 6
+  std::function<uchar(const uchar&)> reduceColor =
+      [this](const uchar& color) -> uchar {
+    if (configuration_.color_depth() == 3) {
+      return (color * 225 + 4096) >> 13;
+    } else if (configuration_.color_depth() == 4) {
+      return (color * 15 + 135) >> 8;
+    }
+
+    return color;
+  };
+
+  // FIXME Remove in Qt 6
+  std::function<void(QByteArray&, const uchar&)> compressColor =
+      [this](QByteArray& compressed_colors, const uchar& color) {
+        static bool msb{true};
+
+        // Compress 2 color components into 1 byte
+        if (msb) {
+          compressed_colors.append(color << configuration_.factor());
+        } else {
+          compressed_colors.back() = compressed_colors.back() | color;
+        }
+
+        msb = !msb;
+      };
 };
 
 #endif  // LIBMUEB_MUEBTRANSMITTER_P_H_
-- 
GitLab