\r
struct pixel_buffer_object::implementation : boost::noncopyable\r
{\r
- implementation(size_t width, size_t height) \r
- : width_(width), height_(height), size_(width*height*4), pbo_(0),\r
- texture_(0), writing_(false), reading_(false), mapped_(false){}\r
+ implementation(size_t width, size_t height, GLenum format) \r
+ : width_(width), height_(height), pbo_(0), format_(format),\r
+ texture_(0), writing_(false), reading_(false), mapped_(false)\r
+ {\r
+ switch(format)\r
+ {\r
+ case GL_RGBA:\r
+ case GL_BGRA:\r
+ internal_ = GL_RGBA8;\r
+ size_ = width*height*4;\r
+ break;\r
+ case GL_BGR:\r
+ internal_ = GL_RGB8;\r
+ size_ = width*height*3;\r
+ break;\r
+ case GL_LUMINANCE_ALPHA:\r
+ internal_ = GL_LUMINANCE_ALPHA;\r
+ size_ = width*height*2;\r
+ break;\r
+ case GL_LUMINANCE:\r
+ case GL_ALPHA:\r
+ internal_ = GL_LUMINANCE;\r
+ size_ = width*height*1;\r
+ break;\r
+ default:\r
+ BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("format"));\r
+ }\r
+ }\r
\r
~implementation()\r
{\r
GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));\r
GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));\r
\r
- GL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width_, height_, 0, GL_BGRA, \r
+ GL(glTexImage2D(GL_TEXTURE_2D, 0, internal_, width_, height_, 0, format_, \r
GL_UNSIGNED_BYTE, NULL));\r
}\r
GL(glBindTexture(GL_TEXTURE_2D, texture_));\r
GL(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));\r
mapped_ = false;\r
bind_texture();\r
- GL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, GL_BGRA, \r
+ GL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, format_, \r
GL_UNSIGNED_BYTE, NULL));\r
unbind_pbo(GL_PIXEL_UNPACK_BUFFER);\r
writing_ = true;\r
bool mapped_;\r
bool writing_;\r
bool reading_;\r
+\r
+ GLint internal_;\r
+ GLenum format_;\r
};\r
\r
pixel_buffer_object::pixel_buffer_object(){}\r
-pixel_buffer_object::pixel_buffer_object(size_t width, size_t height) \r
- : impl_(new implementation(width, height)){}\r
-void pixel_buffer_object::create(size_t width, size_t height)\r
+pixel_buffer_object::pixel_buffer_object(size_t width, size_t height, GLenum format) \r
+ : impl_(new implementation(width, height, format)){}\r
+void pixel_buffer_object::create(size_t width, size_t height, GLenum format)\r
{\r
- impl_.reset(new implementation(width, height));\r
+ impl_.reset(new implementation(width, height, format));\r
}\r
void pixel_buffer_object::begin_write() { impl_->begin_write();}\r
void* pixel_buffer_object::end_write() {return impl_->end_write();} \r
void* pixel_buffer_object::end_read(){return impl_->end_read();}\r
void pixel_buffer_object::bind_texture() {impl_->bind_texture();}\r
size_t pixel_buffer_object::width() const {return impl_->width_;}\r
-size_t pixel_buffer_object::heigth() const {return impl_->height_;}\r
+size_t pixel_buffer_object::height() const {return impl_->height_;}\r
size_t pixel_buffer_object::size() const {return impl_->size_;}\r
bool pixel_buffer_object::is_reading() const { return impl_->reading_;}\r
bool pixel_buffer_object::is_writing() const { return impl_->writing_;}\r