File indexing completed on 2024-12-08 12:46:04

0001 /*
0002  * SPDX-FileCopyrightText: 2009 Kare Sars <kare dot sars at iki dot fi>
0003  * SPDX-FileCopyrightText: 2014 Gregor Mitsch : port to KDE5 frameworks
0004  * SPDX-FileCopyrightText: 2021 Alexander Stippich <a.stippich@gmx.net>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #ifndef KSANE_SCAN_THREAD_H
0010 #define KSANE_SCAN_THREAD_H
0011 
0012 #include "imagebuilder.h"
0013 
0014 // Sane includes
0015 extern "C"
0016 {
0017 #include <sane/saneopts.h>
0018 #include <sane/sane.h>
0019 }
0020 
0021 #include <QThread>
0022 #include <QMutex>
0023 #include <QByteArray>
0024 #include <QImage>
0025 #include <QTimer>
0026 
0027 #define SCAN_READ_CHUNK_SIZE 100000
0028 
0029 namespace KSaneCore
0030 {
0031 
0032 class ScanThread: public QThread
0033 {
0034     Q_OBJECT
0035 public:
0036     enum ReadStatus {
0037         ReadOngoing,
0038         ReadError,
0039         ReadCancel,
0040         ReadReady
0041     };
0042 
0043     explicit ScanThread(SANE_Handle handle);
0044     void run() override;
0045     void setImageInverted(const QVariant &newValue);
0046     void setImageResolution(const QVariant &newValue);
0047     void cancelScan();
0048 
0049     ReadStatus frameStatus();
0050     SANE_Status saneStatus();
0051 
0052     void lockScanImage();
0053     QImage *scanImage();
0054     void unlockScanImage();
0055 
0056 Q_SIGNALS:
0057 
0058     void scanProgressUpdated(int progress);
0059 
0060 private:
0061     void readData();
0062     void updateScanProgress();
0063     void copyToScanData(int readBytes);
0064 
0065     SANE_Byte       m_readData[SCAN_READ_CHUNK_SIZE];
0066     SANE_Handle     m_saneHandle;
0067     int             m_frameSize = 0;
0068     int             m_frameRead = 0;
0069     int             m_frame_t_count = 0;
0070     int             m_dataSize = 0;
0071     int             m_dpi = 0;
0072     SANE_Parameters m_params;
0073     SANE_Status     m_saneStatus = SANE_STATUS_GOOD;
0074     ReadStatus      m_readStatus = ReadReady;
0075     bool            m_announceFirstRead = true;
0076     bool            m_invertColors = false;
0077     ImageBuilder    m_imageBuilder;
0078     QImage          m_image;
0079     QMutex          m_imageMutex;
0080 
0081     QTimer          m_emitProgressUpdateTimer;
0082 };
0083 
0084 } // namespace KSaneCore
0085 
0086 #endif // KSANE_SCAN_THREAD_H