// // Lol Engine // // Copyright: (c) 2010-2014 Sam Hocevar // This program is free software; you can redistribute it and/or // modify it under the terms of the Do What The Fuck You Want To // Public License, Version 2, as published by Sam Hocevar. See // http://www.wtfpl.net/ for more details. // #pragma once // // The ImageCodecData class // ------------------------ // namespace lol { class PixelDataBase { public: virtual void *data() = 0; virtual void const *data() const = 0; virtual void *data2d() = 0; virtual void const *data2d() const = 0; inline virtual ~PixelDataBase() {} }; template class PixelData : public PixelDataBase { public: inline PixelData(ivec2 size) { m_array2d.resize(size); } virtual void *data() { return m_array2d.data(); } virtual void const *data() const { return m_array2d.data(); } virtual void *data2d() { return &m_array2d; } virtual void const *data2d() const { return &m_array2d; } array2d::type> m_array2d; }; class ImageData { friend class Image; public: ImageData() : m_size(0, 0), m_wrap_x(WrapMode::Clamp), m_wrap_y(WrapMode::Clamp), m_format(PixelFormat::Unknown) {} ivec2 m_size; /* The wrap modes for pixel access */ WrapMode m_wrap_x, m_wrap_y; /* A map of the various available bitplanes */ map m_pixels; /* The last bitplane being accessed for writing */ PixelFormat m_format; }; class ImageCodec { public: virtual char const *GetName() { return ""; } virtual bool Load(Image *image, char const *path) = 0; virtual bool Save(Image *image, char const *path) = 0; /* TODO: this should become more fine-grained */ int m_priority; }; #define REGISTER_IMAGE_CODEC(name) \ extern ImageCodec *Register##name(); \ { \ /* Insert image codecs in a sorted list */ \ ImageCodec *codec = Register##name(); \ int i = 0, prio = codec->m_priority; \ for ( ; i < codeclist.count(); ++i) \ { \ if (codeclist[i]->m_priority <= prio) \ break; \ } \ codeclist.insert(codec, i); \ } #define DECLARE_IMAGE_CODEC(name, priority) \ ImageCodec *Register##name() \ { \ ImageCodec *ret = new name(); \ ret->m_priority = priority; \ return ret; \ } } /* namespace lol */