]> git.sesse.net Git - casparcg/blobdiff - common/gl/pixel_buffer_object.cpp
2.0.0.2:
[casparcg] / common / gl / pixel_buffer_object.cpp
index e3e6b7aa3e209966091d99210e8ccb8dc8fad1fa..5ce272c9f96a0c98b0ce2cca93b840d65f5c96d5 100644 (file)
@@ -10,9 +10,34 @@ namespace caspar { namespace common { namespace gl {
                                                                                                                                                                                                                                                                                                                        \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
@@ -45,7 +70,7 @@ struct pixel_buffer_object::implementation : boost::noncopyable
                        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
@@ -58,7 +83,7 @@ struct pixel_buffer_object::implementation : boost::noncopyable
                        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
@@ -118,14 +143,17 @@ struct pixel_buffer_object::implementation : boost::noncopyable
        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
@@ -133,7 +161,7 @@ void pixel_buffer_object::begin_read() { impl_->begin_read();}
 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