struct image_kernel::implementation : boost::noncopyable\r
{ \r
std::shared_ptr<shader> shader_;\r
- bool advanced_blend_modes_;\r
+ bool blend_modes_;\r
\r
void draw(ogl_device& ogl,\r
render_item&& item,\r
- const safe_ptr<device_buffer>& background,\r
+ device_buffer& background,\r
const std::shared_ptr<device_buffer>& local_key, \r
const std::shared_ptr<device_buffer>& layer_key)\r
{\r
// Setup shader\r
\r
if(!shader_)\r
- shader_ = get_image_shader(ogl, advanced_blend_modes_);\r
+ shader_ = get_image_shader(ogl, blend_modes_);\r
\r
ogl.use(*shader_);\r
\r
shader_->set("has_local_key", local_key);\r
shader_->set("has_layer_key", layer_key);\r
shader_->set("pixel_format", item.pix_desc.pix_fmt); \r
+ shader_->set("opacity", item.transform.get_is_key() ? 1.0 : item.transform.get_opacity()); \r
\r
// Setup blend_func\r
\r
- if(advanced_blend_modes_)\r
+ if(item.transform.get_is_key())\r
+ item.blend_mode = blend_mode::normal;\r
+\r
+ if(blend_modes_)\r
{\r
- background->bind(6);\r
+ background.bind(6);\r
\r
shader_->set("background", texture_id::background);\r
- shader_->set("blend_mode", item.transform.get_is_key() ? core::image_transform::blend_mode::normal : item.transform.get_blend_mode());\r
+ shader_->set("blend_mode", item.blend_mode);\r
}\r
else\r
{\r
- switch(item.transform.get_blend_mode())\r
+ switch(item.blend_mode)\r
{\r
- case image_transform::blend_mode::add: \r
- ogl.blend_func_separate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);\r
- break;\r
- case image_transform::blend_mode::replace: \r
+ case blend_mode::replace: \r
ogl.blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE);\r
break;\r
- case image_transform::blend_mode::screen:\r
- ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE);\r
+ case blend_mode::normal:\r
default:\r
- ogl.blend_func_separate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);\r
+ ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);\r
break;\r
}\r
}\r
\r
// Setup interlacing\r
\r
- if(item.mode == core::video_mode::progressive) \r
+ if(item.transform.get_field_mode() == core::field_mode::progressive) \r
ogl.disable(GL_POLYGON_STIPPLE); \r
else \r
{\r
ogl.enable(GL_POLYGON_STIPPLE);\r
\r
- if(item.mode == core::video_mode::upper)\r
+ if(item.transform.get_field_mode() == core::field_mode::upper)\r
ogl.stipple_pattern(upper_pattern);\r
- else if(item.mode == core::video_mode::lower)\r
+ else if(item.transform.get_field_mode() == core::field_mode::lower)\r
ogl.stipple_pattern(lower_pattern);\r
}\r
\r
// Setup drawing area\r
\r
- ogl.viewport(0, 0, background->width(), background->height());\r
-\r
- GL(glColor4d(item.transform.get_gain(), item.transform.get_gain(), item.transform.get_gain(), item.transform.get_is_key() ? 1.0 : item.transform.get_opacity()));\r
- \r
+ ogl.viewport(0, 0, background.width(), background.height());\r
+ \r
auto m_p = item.transform.get_clip_translation();\r
auto m_s = item.transform.get_clip_scale();\r
\r
\r
if(scissor)\r
{\r
- double w = static_cast<double>(background->width());\r
- double h = static_cast<double>(background->height());\r
+ double w = static_cast<double>(background.width());\r
+ double h = static_cast<double>(background.height());\r
\r
ogl.enable(GL_SCISSOR_TEST);\r
ogl.scissor(static_cast<size_t>(m_p[0]*w), static_cast<size_t>(m_p[1]*h), static_cast<size_t>(m_s[0]*w), static_cast<size_t>(m_s[1]*h));\r
\r
// Set render target\r
\r
- ogl.attach(*background);\r
+ ogl.attach(background);\r
\r
// Draw\r
\r
item.textures.clear();\r
ogl.yield(); // Return resources to pool as early as possible.\r
\r
- if(advanced_blend_modes_)\r
+ if(blend_modes_)\r
{\r
// http://www.opengl.org/registry/specs/NV/texture_barrier.txt\r
// This allows us to use framebuffer (background) both as source and target while blending.\r
};\r
\r
image_kernel::image_kernel() : impl_(new implementation()){}\r
-void image_kernel::draw(ogl_device& ogl, render_item&& item, const safe_ptr<device_buffer>& background, const std::shared_ptr<device_buffer>& local_key, const std::shared_ptr<device_buffer>& layer_key)\r
+void image_kernel::draw(ogl_device& ogl, \r
+ render_item&& item, \r
+ device_buffer& background,\r
+ const std::shared_ptr<device_buffer>& local_key, \r
+ const std::shared_ptr<device_buffer>& layer_key)\r
{\r
impl_->draw(ogl, std::move(item), background, local_key, layer_key);\r
}\r
\r
bool operator==(const render_item& lhs, const render_item& rhs)\r
{\r
- return lhs.textures == rhs.textures && lhs.transform == rhs.transform && lhs.tag == rhs.tag && lhs.mode == rhs.mode;\r
+ return lhs.textures == rhs.textures && lhs.transform == rhs.transform && lhs.tag == rhs.tag;\r
}\r
\r
}}
\ No newline at end of file