-/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+/*] Copyright (c) 2009-2011, Charles McGarvey [*****************************
**] All rights reserved.
*
-* vi:ts=4 sw=4 tw=75
-*
* Distributable under the terms and conditions of the 2-clause BSD license;
* see the file COPYING for a complete text of the license.
*
-**************************************************************************/
+*****************************************************************************/
#ifndef _MOOF_IMAGE_HH_
#define _MOOF_IMAGE_HH_
+#include <boost/noncopyable.hpp>
+
+#include <moof/dispatcher.hh>
+#include <moof/math.hh>
+#include <moof/resource.hh>
+
+
/**
* \file image.hh
* Defines classes for loading and manipulating images.
*/
-#include <boost/shared_ptr.hpp>
+namespace moof {
-#include <moof/opengl.hh>
-#include <moof/resource.hh>
+class image : public boost::noncopyable
+{
+public:
-namespace moof {
+ static const int no_tile = -1;
+ explicit image(const std::string& path);
+ ~image();
-class image;
-typedef boost::shared_ptr<image> image_ptr;
+ int width() const
+ {
+ return width_;
+ }
-class image : public resource
-{
-public:
+ int height() const
+ {
+ return height_;
+ }
- static image_ptr alloc(const std::string& name)
+ int depth() const
{
- return image_ptr(new image(name));
+ return depth_;
}
- explicit image(const std::string& name);
+ int pitch() const
+ {
+ return pitch_;
+ }
- bool is_valid() const;
+ int channels() const
+ {
+ return channels_;
+ }
- int width() const;
- int height() const;
+ const char* pixels() const
+ {
+ return pixels_;
+ }
- unsigned depth() const;
- unsigned pitch() const;
- GLuint mode() const;
+ void set_as_icon() const;
- std::string comment() const;
+ /**
+ * Calculate texture coordinates for a tile at a certain index. Tiles
+ * are indexed start with zero as the top-left tile and moving across,
+ * then down.
+ * \param index The tile index.
+ * \param coords An array of scalars where the texture coordinates
+ * will be stored after this call. The first coordinate (u,v) will be
+ * in the first two places and so on until all four coordinates are
+ * stored, therefore requiring enough room for an array of eight
+ * scalars. The winding of the coordinates is always
+ * counter-clockwise (the GL default).
+ * \return True if index is valid, false otherwise.
+ */
+ bool tile_coordinates(int index, scalar coords[8]) const;
+
+ void fix_uv(std::vector<vector2>& p) const;
+
+ void bind() const;
+ static void reset_binding();
- const char* pixels() const;
- char* pixels();
+private:
- void flip();
+ void postprocess();
+ void upload_to_gl() const;
+ void unload_from_gl() const;
+ void context_recreated();
+ void set_properties() const;
- void set_as_icon() const;
+ char* pixels_;
+ mutable unsigned object_;
+ static unsigned global_object_;
-private:
+ int width_;
+ int height_;
+ int depth_;
+ int pitch_;
+ int channels_;
- static FILE* open_file(std::string& name);
+ unsigned min_filter_;
+ unsigned mag_filter_;
+ int tile_s_;
+ int tile_t_;
+ unsigned wrap_s_;
+ unsigned wrap_t_;
- class impl;
- boost::shared_ptr<impl> impl_;
+ //mutable dispatcher::handle new_context_;
};
+typedef resource_handle<image> image_handle;
+
} // namespace moof