/*
 * Copyright (C) 2010, Pino Toscano <pino@kde.org>
 * Copyright (C) 2018, Zsombor Hollay-Horvath <hollay.horvath@gmail.com>
 *
 * This program 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 2, or (at your option)
 * any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef POPPLER_IMAGE_H
#define POPPLER_IMAGE_H

#include "poppler-global.h"
#include "poppler-rectangle.h"

namespace poppler {

class image_private;

class POPPLER_CPP_EXPORT image
{
public:
    enum format_enum
    {
        format_invalid,
        format_mono,
        format_rgb24,
        format_argb32,
        format_gray8,
        format_bgr24
    };

    image();
    image(int iwidth, int iheight, format_enum iformat);
    image(char *idata, int iwidth, int iheight, format_enum iformat);
    image(const image &img);
    ~image();

    bool is_valid() const;
    format_enum format() const;
    int width() const;
    int height() const;
    char *data();
    const char *const_data() const;
    int bytes_per_row() const;

    image copy(const rect &r = rect()) const;

    bool save(const std::string &file_name, const std::string &out_format, int dpi = -1) const;

    static std::vector<std::string> supported_image_formats();

    image &operator=(const image &img);

private:
    void detach();

    image_private *d;
    friend class image_private;
};

}

#endif
