diff options
| -rw-r--r-- | image.cpp | 50 | ||||
| -rw-r--r-- | image.h | 27 | ||||
| -rw-r--r-- | texture.cpp | 26 | ||||
| -rw-r--r-- | texture.h | 8 | 
4 files changed, 90 insertions, 21 deletions
| diff --git a/image.cpp b/image.cpp new file mode 100644 index 0000000..db385db --- /dev/null +++ b/image.cpp @@ -0,0 +1,50 @@ +#include "image.h" + +#include "gl.h" + +#include "stb_image.h" + +Image::Image() { +	data = 0; +} + +Image::Image(const std::string& filename) { +	load(filename); +} + +Image::~Image() { +	if(data) { +		stbi_image_free(data); +	} +} + +void Image::load(const std::string& filename) { +	int w, h, ch; +	data = stbi_load(filename.c_str(), &w, &h, &ch, 4); +	 +	width = w; +	height = h; +	 +	unsigned int format; +	if(ch == 4) { +		format = GL_RGBA; +	} else { +		format = GL_RGB; +	} +} + +unsigned int Image::w() const { +	return width; +} + +unsigned int Image::h() const { +	return height; +} + +unsigned int Image::f() const { +	return format; +} + +const void* Image::d() const { +	return data; +} @@ -0,0 +1,27 @@ +#ifndef IMAGE_H +#define IMAGE_H + +#include <stdint.h> +#include <string> + +class Image { +	public: +		Image(); +		Image(const std::string& filename); +		~Image(); +		 +		void load(const std::string& filename); +		 +		unsigned int w() const; +		unsigned int h() const; +		unsigned int f() const; +		const void* d() const; +		 +	protected: +		unsigned int width; +		unsigned int height; +		unsigned int format; +		void* data; +}; + +#endif diff --git a/texture.cpp b/texture.cpp index ba7d9c7..df84961 100644 --- a/texture.cpp +++ b/texture.cpp @@ -1,31 +1,23 @@  #include <stdexcept>  #include "texture.h" -#include "stb_image.h"  #include "gl.h"  Texture::Texture() {  	glGenTextures(1, &texture);  } +Texture::Texture(const Image& image) { +	glGenTextures(1, &texture); +	load(image); +} +  Texture::Texture(const std::string& filename) {  	glGenTextures(1, &texture); -	load(filename); +	load(Image(filename));  } -void Texture::load(const std::string& filename) { -	int w, h, ch; -	uint8_t* data = stbi_load(filename.c_str(), &w, &h, &ch, 4); -	 -	unsigned int format; -	if(ch == 4) { -		format = GL_RGBA; -	} else { -		format = GL_RGB; -	} -	 -	build(data, format, w, h); -	 -	stbi_image_free(data); +void Texture::load(const Image& image) { +	build(image.d(), image.f(), image.w(), image.h());  }  void Texture::bind() const { @@ -44,7 +36,7 @@ unsigned int Texture::h() const {  	return height;  } -void Texture::build(void* data, unsigned int format, unsigned int w, unsigned int h) { +void Texture::build(const void* data, unsigned int format, unsigned int w, unsigned int h) {  	if(!data) {  		throw(std::runtime_error("No texture data"));  	} @@ -1,22 +1,22 @@  #ifndef _TEXTURE_H_  #define _TEXTURE_H_ -#include <stdint.h> -#include <string> +#include "image.h"  class Texture {  	public:  		Texture(); +		Texture(const Image& image);  		Texture(const std::string& filename); -		void load(const std::string& filename); +		void load(const Image& image);  		void bind() const;  		unsigned int tex() const;  		unsigned int w() const;  		unsigned int h() const;  	protected: -		void build(void* data, unsigned int format, unsigned int w, unsigned int h); +		void build(const void* data, unsigned int format, unsigned int w, unsigned int h);  		unsigned int width;  		unsigned int height;  		unsigned int texture; | 
