- switch(ctype)
- {
- case PNG_COLOR_TYPE_GRAY: fmt=LUMINANCE8; planes=1; break;
- case PNG_COLOR_TYPE_GRAY_ALPHA: fmt=LUMINANCE8_ALPHA8; planes=2; break;
- case PNG_COLOR_TYPE_RGB: fmt=RGB8; planes=3; break;
- case PNG_COLOR_TYPE_RGB_ALPHA: fmt=RGBA8; planes=4; break;
- default: throw Exception("Invalid color type");
- }
+void Texture2D::image(const Graphics::Image &img, bool srgb, bool from_buffer)
+{
+ unsigned w = img.get_width();
+ unsigned h = img.get_height();
+ PixelFormat fmt = pixelformat_from_graphics(img.get_format());
+ if(width==0)
+ storage(storage_pixelformat_from_graphics(img.get_format(), srgb), w, h);
+ else if(w!=width || h!=height)
+ throw incompatible_data("Texture2D::image");
+
+ PixelStore pstore = PixelStore::from_image(img);
+ BindRestore _bind_ps(pstore);
+
+ image(0, fmt, UNSIGNED_BYTE, from_buffer ? 0 : img.get_data());
+}
+
+unsigned Texture2D::get_n_levels() const
+{
+ unsigned n = 0;
+ for(unsigned s=max(width, height); s; s>>=1, ++n) ;
+ return n;
+}
+
+void Texture2D::get_level_size(unsigned level, unsigned &w, unsigned &h) const
+{
+ w >>= level;
+ h >>= level;
+
+ if(!w && h)
+ w = 1;
+ else if(!h && w)
+ h = 1;
+}
+
+Resource::AsyncLoader *Texture2D::load(IO::Seekable &io, const Resources *res)
+{
+ AsyncLoader *ldr = new AsyncLoader(*this, io);
+ if(res)
+ ldr->set_srgb_conversion(res->get_srgb_conversion());
+ return ldr;
+}
+
+UInt64 Texture2D::get_data_size() const
+{
+ return id ? width*height*get_component_count(ifmt) : 0;
+}
+
+void Texture2D::unload()
+{
+ glDeleteTextures(1, &id);
+ id = 0;
+ // TODO check which params actually need refreshing
+ dirty_params = -1;
+}