CGII/framework/include/cgv/media/image/image_writer.h
2018-05-17 15:50:03 +02:00

88 lines
3.7 KiB
C++

#pragma once
#include <cgv/base/base.h>
#include <cgv/data/data_view.h>
#include "lib_begin.h"
using namespace cgv::data;
namespace cgv {
namespace media {
namespace image {
class CGV_API image_writer;
/// abstract interface for image readers
class CGV_API abst_image_writer : public cgv::base::base
{
public:
friend class image_writer;
/// construct a copy of the reader
virtual abst_image_writer* clone() const = 0;
/// return a string containing a colon separated list of extensions that can be read with this reader
virtual const char* get_supported_extensions() const = 0;
/// check if the chosen writer supports the given component format
virtual bool is_format_supported(const component_format& cf, const std::vector<component_format>* palette_formats) const = 0;
/// return a reference to the last error message
virtual const std::string& get_last_error() const = 0;
/// return whether multiple images are supported, default implementation returns false
virtual bool supports_multiple_images() const;
/// open image file to write
virtual bool open(const std::string& file_name) = 0;
/// write one image
virtual bool write_image(const const_data_view& dv, const std::vector<const_data_view>* palettes, double duration) = 0;
/// close image [stream]
virtual bool close() = 0;
};
/// the image writer chooses a specific writer automatically based on the extension of the given file name
class CGV_API image_writer : public cgv::base::base
{
protected:
/// store a pointer to the chosen reader
abst_image_writer* wr;
/// whether file has been opened
bool is_opened;
/// store the file name
std::string file_name;
/// store the last error not resulting from writer implementations
std::string last_error;
/// abstract interface for the setter, by default it simply returns false
bool set_void(const std::string& property, const std::string& type, const void* value);
/// abstract interface for the getter, by default it simply returns false
bool get_void(const std::string& property, const std::string& type, void* value);
public:
/// construct an image writer from a file name and choose a writer from the extension
image_writer(const std::string& file_name);
/// close file on destruction
~image_writer();
/// overload to return the type name of this object
std::string get_type_name() const;
/// return a string with a list of supported extensions, where the list entries are separated with the passed character that defaults to a semicolon
static const std::string& get_supported_extensions(char sep = ';');
/// use this to generate a file_open_dialog or file_save_dialog
static std::string construct_filter_string();
/// return a semicolon separated list of property declarations of the form "name:type", by default an empty list is returned
std::string get_property_declarations();
/// check if the chosen writer supports the given component format
bool is_format_supported(const component_format& cf, const std::vector<component_format>* palette_formats = 0) const;
/// return a colon separated list of supported options
std::string get_options() const;
/// return a reference to the last error message
const std::string& get_last_error() const;
/** write the data stored in the data view to a file with the file name given in the constructor.
In case a vector of data views for palettes is given, write the image in paletted format. */
bool write_image(const const_data_view& dv, const std::vector<const_data_view>* palettes = 0, double duration = 0);
/// close image file;
bool close();
/// return whether multiple images are supported, default implementation returns false
bool supports_multiple_images() const;
};
}
}
}
#include <cgv/config/lib_end.h>