File indexing completed on 2024-04-28 15:39:42

0001 /* SPDX-FileCopyrightText: 2014 Jesper K. Pedersen <blackie@kde.org>
0002 
0003    SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef REMOTECONTROL_SERIALIZER_H
0007 #define REMOTECONTROL_SERIALIZER_H
0008 
0009 #include <QObject>
0010 
0011 namespace RemoteControl
0012 {
0013 
0014 enum class BackgroundType { Transparent,
0015                             NonTransparent };
0016 
0017 static void fastStreamImage(QDataStream &stream, const QImage &image, BackgroundType type)
0018 {
0019     if (type == BackgroundType::Transparent) {
0020         QImage result(image.width(), image.height(), QImage::Format_RGB32);
0021         result.fill(Qt::black);
0022         QPainter p(&result);
0023         p.drawImage(0, 0, image);
0024         p.end();
0025         result.save(stream.device(), "JPEG");
0026     } else
0027         image.save(stream.device(), "JPEG");
0028 }
0029 
0030 class SerializerInterface
0031 {
0032 public:
0033     virtual ~SerializerInterface() { }
0034     virtual void encode(QDataStream &) = 0;
0035     virtual void decode(QDataStream &) = 0;
0036 };
0037 
0038 template <class T>
0039 class Serializer : public SerializerInterface
0040 {
0041 public:
0042     Serializer(T &value)
0043         : m_value(value)
0044     {
0045     }
0046     void encode(QDataStream &stream) override
0047     {
0048         stream << m_value;
0049     }
0050     void decode(QDataStream &stream) override
0051     {
0052         stream >> m_value;
0053     }
0054 
0055 private:
0056     T &m_value;
0057 };
0058 
0059 template <>
0060 class Serializer<QImage> : public SerializerInterface
0061 {
0062 public:
0063     Serializer(QImage &value, BackgroundType background = BackgroundType::NonTransparent)
0064         : m_image(value)
0065         , m_background(background)
0066     {
0067     }
0068     void encode(QDataStream &stream) override
0069     {
0070         fastStreamImage(stream, m_image, m_background);
0071     }
0072     void decode(QDataStream &stream) override
0073     {
0074         m_image.load(stream.device(), "JPEG");
0075     }
0076 
0077 private:
0078     QImage &m_image;
0079     BackgroundType m_background;
0080 };
0081 
0082 } // namespace RemoteControl
0083 
0084 #endif // REMOTECONTROL_SERIALIZER_H