\r
namespace caspar {\r
\r
+class bitmap\r
+{\r
+public:\r
+ bitmap(size_t width, size_t height)\r
+ : bmp_data_(nullptr)\r
+ , hdc_(CreateCompatibleDC(0), DeleteDC)\r
+ { \r
+ BITMAPINFO info;\r
+ memset(&info, 0, sizeof(BITMAPINFO));\r
+ info.bmiHeader.biBitCount = 32;\r
+ info.bmiHeader.biCompression = BI_RGB;\r
+ info.bmiHeader.biHeight = -height;\r
+ info.bmiHeader.biPlanes = 1;\r
+ info.bmiHeader.biSize = sizeof(BITMAPINFO);\r
+ info.bmiHeader.biWidth = width;\r
+\r
+ bmp_.reset(CreateDIBSection(static_cast<HDC>(hdc_.get()), &info, DIB_RGB_COLORS, reinterpret_cast<void**>(&bmp_data_), 0, 0), DeleteObject);\r
+ SelectObject(static_cast<HDC>(hdc_.get()), bmp_.get()); \r
+ }\r
+\r
+ operator HDC() {return static_cast<HDC>(hdc_.get());}\r
+\r
+ BYTE* data() { return bmp_data_;}\r
+ const BYTE* data() const { return bmp_data_;}\r
+\r
+private:\r
+ BYTE* bmp_data_; \r
+ std::shared_ptr<void> hdc_;\r
+ std::shared_ptr<void> bmp_;\r
+};\r
+\r
class flash_renderer\r
{ \r
const std::wstring filename_;\r
\r
const std::shared_ptr<core::frame_factory> frame_factory_;\r
\r
- BYTE* bmp_data_; \r
- std::shared_ptr<void> hdc_;\r
- std::shared_ptr<void> bmp_;\r
-\r
CComObject<caspar::flash::FlashAxContainer>* ax_;\r
safe_ptr<core::basic_frame> head_;\r
+ bitmap bmp_;\r
\r
safe_ptr<diagnostics::graph> graph_;\r
boost::timer frame_timer_;\r
, filename_(filename)\r
, format_desc_(frame_factory->get_video_format_desc())\r
, frame_factory_(frame_factory)\r
- , bmp_data_(nullptr)\r
- , hdc_(CreateCompatibleDC(0), DeleteDC)\r
, ax_(nullptr)\r
, head_(core::basic_frame::empty())\r
+ , bmp_(format_desc_.width, format_desc_.height)\r
{\r
graph_->add_guide("frame-time", 0.5f);\r
graph_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f)); \r
if(FAILED(spFlash->put_ScaleMode(2))) //Exact fit. Scale without respect to the aspect ratio.\r
BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Failed to Set Scale Mode"));\r
\r
- ax_->SetFormat(format_desc_);\r
- \r
- BITMAPINFO info;\r
- memset(&info, 0, sizeof(BITMAPINFO));\r
- info.bmiHeader.biBitCount = 32;\r
- info.bmiHeader.biCompression = BI_RGB;\r
- info.bmiHeader.biHeight = -format_desc_.height;\r
- info.bmiHeader.biPlanes = 1;\r
- info.bmiHeader.biSize = sizeof(BITMAPINFO);\r
- info.bmiHeader.biWidth = format_desc_.width;\r
-\r
- bmp_.reset(CreateDIBSection(static_cast<HDC>(hdc_.get()), &info, DIB_RGB_COLORS, reinterpret_cast<void**>(&bmp_data_), 0, 0), DeleteObject);\r
- SelectObject(static_cast<HDC>(hdc_.get()), bmp_.get()); \r
+ ax_->SetFormat(format_desc_); \r
+ \r
CASPAR_LOG(info) << print() << L" Thread started.";\r
}\r
\r
ax_->Tick();\r
if(ax_->InvalidRect())\r
{ \r
- fast_memclr(bmp_data_, format_desc_.size);\r
- ax_->DrawControl(static_cast<HDC>(hdc_.get()));\r
+ fast_memclr(bmp_.data(), format_desc_.size);\r
+ ax_->DrawControl(bmp_);\r
\r
auto frame = frame_factory_->create_frame(this);\r
- fast_memcpy(frame->image_data().begin(), bmp_data_, format_desc_.size);\r
+ fast_memcpy(frame->image_data().begin(), bmp_.data(), format_desc_.size);\r
head_ = frame;\r
} \r
\r