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
// 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_opacity()); \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
\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_MINUS_SRC_ALPHA);\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_MINUS_SRC_ALPHA);\r
- case image_transform::blend_mode::normal:\r
+ case blend_mode::normal:\r
default:\r
ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);\r
break;\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
+ const safe_ptr<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