From: ronag Date: Mon, 15 Aug 2011 11:08:52 +0000 (+0000) Subject: 2.0. color_producer: Misc improvements. X-Git-Tag: 2.0.1~159 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=22ea91cc0ab8cbcee5a728ad00e02ca73e2bad3e;p=casparcg 2.0. color_producer: Misc improvements. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1181 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/core/producer/color/color_producer.cpp b/core/producer/color/color_producer.cpp index aa6e3a631..7c14aaf28 100644 --- a/core/producer/color/color_producer.cpp +++ b/core/producer/color/color_producer.cpp @@ -27,6 +27,8 @@ #include +#include + #include namespace caspar { namespace core { @@ -49,24 +51,69 @@ public: virtual std::wstring print() const { return L"color[" + color_str_ + L"]"; } }; -safe_ptr create_color_producer(const safe_ptr& frame_factory, const std::vector& params) +std::wstring get_hex_color(const std::wstring& str) { - if(params.empty() || params[0].at(0) != '#') - return frame_producer::empty(); - return make_safe(frame_factory, params[0]); + if(str.at(0) == '#') + return str.length() == 7 ? L"#FF" + str.substr(1) : str; + + if(boost::iequals(str, L"BLACK")) + return L"#000000FF"; + + if(boost::iequals(str, L"WHITE")) + return L"#FFFFFFFF"; + + if(boost::iequals(str, L"RED")) + return L"#FFFF0000"; + + if(boost::iequals(str, L"GREEN")) + return L"#FF00FF00"; + + if(boost::iequals(str, L"BLUE")) + return L"#FF0000FF"; + + if(boost::iequals(str, L"ORANGE")) + return L"#FFFFA500"; + + if(boost::iequals(str, L"YELLOW")) + return L"#FFFFFF00"; + + if(boost::iequals(str, L"BROWN")) + return L"#FFA52A2A"; + + if(boost::iequals(str, L"GRAY")) + return L"#FF808080"; + + if(boost::iequals(str, L"TEAL")) + return L"#FF008080"; + + return str; } +safe_ptr create_color_producer(const safe_ptr& frame_factory, const std::vector& params) +{ + if(params.size() < 0) + return core::frame_producer::empty(); + + auto color2 = get_hex_color(params[0]); + if(color2.length() != 9 || color2[0] != '#') + return core::frame_producer::empty(); + + return make_safe(frame_factory, color2); +} safe_ptr create_color_frame(void* tag, const safe_ptr& frame_factory, const std::wstring& color) { - if(color.length() != 9 || color[0] != '#') - BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color)) << msg_info("Invalid color code")); + auto color2 = get_hex_color(color); + if(color2.length() != 9 || color2[0] != '#') + BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color2)) << msg_info("Invalid color.")); auto frame = frame_factory->create_frame(tag, 1, 1, pixel_format::bgra); // Read color from hex-string and write to frame pixel. + auto& value = *reinterpret_cast(frame->image_data().begin()); - std::wstringstream str(color.substr(1)); - str >> std::hex >> value; + std::wstringstream str(color2.substr(1)); + if(!(str >> std::hex >> value) || !str.eof()) + BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color2)) << msg_info("Invalid color.")); frame->commit(); diff --git a/core/producer/frame_producer.cpp b/core/producer/frame_producer.cpp index 548d8314a..04400539c 100644 --- a/core/producer/frame_producer.cpp +++ b/core/producer/frame_producer.cpp @@ -85,7 +85,7 @@ safe_ptr do_create_producer(const safe_ptr& } catch(...) { - CASPAR_LOG_CURRENT_EXCEPTION(); + //CASPAR_LOG_CURRENT_EXCEPTION(); } return producer != frame_producer::empty(); });