/***
   This file is part of fly-ocr.

   Copyright (C) 2016-2020 Sandro Mani <manisandro@gmail.com>
   Copyright (C) 2021 LLC "RusBITech-Astra" (https://astralinux.ru)

    Based on gImageReader source code by Sandro Mani under the GNU
    General Public License (GPL) version 3 or later

   Foobar is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   Foobar is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with fly-ocr. If not, see <https://www.gnu.org/licenses/>.
***/

#ifndef DISPLAYRENDERER_H
#define DISPLAYRENDERER_H

#include <QByteArray>
#include <QString>
#include <QMutex>

class DjVuDocument;

class QImage;
namespace Poppler
{
class Document;
}

class DisplayRenderer
{
public:
    DisplayRenderer(const QString& filename) : m_filename(filename) {}
    virtual ~DisplayRenderer() {}
    virtual QImage render(int page, double resolution) const = 0;
    virtual QImage renderThumbnail(int page) const = 0;
    virtual int pageCount() const = 0;

    void adjustImage(QImage& image, int brightness, int contrast, bool invert) const;
    bool isEmpty() const;

protected:
    QString m_filename;
};

class ImageRenderer : public DisplayRenderer
{
public:
    ImageRenderer(const QString& filename) ;
    QImage render(int page, double resolution) const override;
    QImage renderThumbnail(int page) const override;
    int pageCount() const override;
private:
    int m_pageCount;
    QList<QImage> m_cache;
};

class PDFRenderer : public DisplayRenderer
{
public:
    PDFRenderer(const QString& filename, const QByteArray& password);
    ~PDFRenderer();
    QImage render(int page, double resolution) const override;
    QImage renderThumbnail(int page) const override;
    int pageCount() const override;

private:
    Poppler::Document* m_document;
    mutable QMutex m_mutex;
};

class DJVURenderer : public DisplayRenderer
{
public:
    DJVURenderer(const QString& filename);
    ~DJVURenderer();
    QImage render(int page, double resolution) const override;
    QImage renderThumbnail(int page) const override;
    int pageCount() const override;

private:
    DjVuDocument* m_djvu;
};

#endif // IMAGERENDERER_H
