\r
image_kernel::image_kernel() : impl_(new implementation()){}\r
\r
-void image_kernel::apply(const core::pixel_format_desc& pix_desc, const core::image_transform& transform, bool has_separate_key)\r
+void image_kernel::draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& transform, bool has_separate_key)\r
{\r
impl_->shaders()[pix_desc.pix_fmt].use();\r
\r
glPolygonStipple(lower_pattern);\r
else\r
glPolygonStipple(progressive_pattern);\r
+ \r
+ GL(glColor4d(1.0, 1.0, 1.0, transform.get_opacity()));\r
+ GL(glViewport(0, 0, width, height));\r
+ \r
+ auto m_p = transform.get_key_translation();\r
+ auto m_s = transform.get_key_scale();\r
+ double w = static_cast<double>(width);\r
+ double h = static_cast<double>(height);\r
+\r
+ GL(glEnable(GL_SCISSOR_TEST));\r
+ GL(glScissor(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
+ auto f_p = transform.get_fill_translation();\r
+ auto f_s = transform.get_fill_scale();\r
+ \r
+ glBegin(GL_QUADS);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 0.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , f_p[1] ); glVertex2d( f_p[0] *2.0-1.0, f_p[1] *2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 1.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), f_p[1] ); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, f_p[1] *2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 1.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), (f_p[1]+f_s[1])); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 0.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , (f_p[1]+f_s[1])); glVertex2d( f_p[0] *2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
+ glEnd();\r
+ GL(glDisable(GL_SCISSOR_TEST)); \r
}\r
\r
}}
\ No newline at end of file
{\r
public:\r
image_kernel();\r
- void apply(const core::pixel_format_desc& pix_desc, const core::image_transform& mode, bool has_seperate_key);\r
+ void draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& mode, bool has_seperate_key);\r
\r
private:\r
struct implementation;\r
\r
// Setup key and kernel\r
\r
+ bool has_separate_key = false;\r
+\r
if(transform.get_is_key())\r
{\r
- kernel_.apply(desc, transform, false);\r
if(!is_key_)\r
{\r
key_target_->attach();\r
} \r
else\r
{ \r
- kernel_.apply(desc, transform, is_key_); \r
if(is_key_)\r
{\r
+ has_separate_key = true;\r
is_key_ = false;\r
\r
render_targets_[0]->attach(); \r
GL(glActiveTexture(GL_TEXTURE0+3));\r
key_target_->bind();\r
} \r
- } \r
+ } \r
\r
- GL(glColor4d(1.0, 1.0, 1.0, transform.get_opacity()));\r
- GL(glViewport(0, 0, format_desc_.width, format_desc_.height));\r
- \r
- auto m_p = transform.get_key_translation();\r
- auto m_s = transform.get_key_scale();\r
- double w = static_cast<double>(format_desc_.width);\r
- double h = static_cast<double>(format_desc_.height);\r
+ // Draw\r
\r
- GL(glEnable(GL_SCISSOR_TEST));\r
- GL(glScissor(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
- auto f_p = transform.get_fill_translation();\r
- auto f_s = transform.get_fill_scale();\r
- \r
- glBegin(GL_QUADS);\r
- glMultiTexCoord2d(GL_TEXTURE0, 0.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , f_p[1] ); glVertex2d( f_p[0] *2.0-1.0, f_p[1] *2.0-1.0);\r
- glMultiTexCoord2d(GL_TEXTURE0, 1.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), f_p[1] ); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, f_p[1] *2.0-1.0);\r
- glMultiTexCoord2d(GL_TEXTURE0, 1.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), (f_p[1]+f_s[1])); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
- glMultiTexCoord2d(GL_TEXTURE0, 0.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , (f_p[1]+f_s[1])); glVertex2d( f_p[0] *2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
- glEnd();\r
- GL(glDisable(GL_SCISSOR_TEST)); \r
+ kernel_.draw(format_desc_.width, format_desc_.height, desc, transform, has_separate_key); \r
}\r
\r
std::vector<safe_ptr<host_buffer>> create_buffers(const core::pixel_format_desc& format)\r
void* bytes = nullptr;\r
if(FAILED(result->GetBytes(&bytes)))\r
BOOST_THROW_EXCEPTION(caspar_exception());\r
-\r
- fast_memsfhl(reinterpret_cast<unsigned char*>(bytes), frame->image_data().begin(), frame->image_data().size(), 0x03030303, 0x07070707, 0x0B0B0B0B, 0x0F0F0F0F);\r
+ \r
+ fast_memsfhl(reinterpret_cast<unsigned char*>(bytes), frame->image_data().begin(), frame->image_data().size(), 0x0F0F0F0F, 0x0B0B0B0B, 0x07070707, 0x03030303);\r
\r
return std::shared_ptr<IDeckLinkVideoFrame>(result, [](IDeckLinkMutableVideoFrame* p) {p->Release();});\r
}\r
else if(wcmd.substr(0, 1) == L"6")\r
wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
else if(wcmd.substr(0, 1) == L"7")\r
- wcmd = L"LOAD 1-1 720p2500";\r
+ wcmd = L"CG 1-2 ADD 1 " + wcmd.substr(1, wcmd.length()-1) + L" 1";\r
else if(wcmd.substr(0, 1) == L"8")\r
wcmd = L"LOAD 1-1 #FFFFFFFF AUTOPLAY";\r
else if(wcmd.substr(0, 1) == L"9")\r