diff options
| author | Matthew Parlane <parlane@gmail.com> | 2013-08-24 23:56:31 +1200 |
|---|---|---|
| committer | Matthew Parlane <parlane@gmail.com> | 2013-08-24 23:56:31 +1200 |
| commit | 5548e7743831079d850e618c4e6b7da4769241c7 (patch) | |
| tree | a2a9ca8e26f602b1eadc701e6de886f55a00854b /Source/Core/VideoCommon/Src/OnScreenDisplay.cpp | |
| parent | 6907a326530d2771f9a39d72cebe54d391172c1b (diff) | |
| parent | 66c50ebf191b1b8d3d4cb696203a1cc225085eb7 (diff) | |
Merge branch 'master' into wii-network
Diffstat (limited to 'Source/Core/VideoCommon/Src/OnScreenDisplay.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/OnScreenDisplay.cpp | 110 |
1 files changed, 39 insertions, 71 deletions
diff --git a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp index 29a3837a9a..b66c2019c9 100644 --- a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp +++ b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp @@ -11,51 +11,27 @@ #include "RenderBase.h" #include "Timer.h" -#include <vector> +#include <map> +#include <string> namespace OSD { -struct MESSAGE +struct Message { - MESSAGE() {} - MESSAGE(const char* p, u32 dw) - { - strncpy(str, p, 255); - str[255] = '\0'; - dwTimeStamp = dw; - } - char str[256]; - u32 dwTimeStamp; -}; - -class OSDCALLBACK -{ -private: - CallbackPtr m_functionptr; - CallbackType m_type; - u32 m_data; -public: - OSDCALLBACK(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) - { - m_type = OnType; - m_functionptr = FuncPtr; - m_data = UserData; - } - void Call() - { - m_functionptr(m_data); - } + Message() {} + Message(const std::string& s, u32 ts) : str(s), timestamp(ts) {} - CallbackType Type() { return m_type; } + std::string str; + u32 timestamp; }; -std::vector<OSDCALLBACK> m_callbacks; -static std::list<MESSAGE> s_listMsgs; +static std::multimap<CallbackType, Callback> s_callbacks; +static std::list<Message> s_msgList; -void AddMessage(const char* pstr, u32 ms) +void AddMessage(const std::string& str, u32 ms) { - s_listMsgs.push_back(MESSAGE(pstr, Common::Timer::GetTimeMs() + ms)); + s_msgList.push_back(Message(str, Common::Timer::GetTimeMs() + ms)); } void DrawMessages() @@ -63,58 +39,50 @@ void DrawMessages() if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages) return; - if (s_listMsgs.size() > 0) + int left = 25, top = 15; + auto it = s_msgList.begin(); + while (it != s_msgList.end()) { - int left = 25, top = 15; - std::list<MESSAGE>::iterator it = s_listMsgs.begin(); - while (it != s_listMsgs.end()) + int time_left = (int)(it->timestamp - Common::Timer::GetTimeMs()); + u32 alpha = 255; + + if (time_left < 1024) { - int time_left = (int)(it->dwTimeStamp - Common::Timer::GetTimeMs()); - int alpha = 255; - - if (time_left < 1024) - { - alpha = time_left >> 2; - if (time_left < 0) - alpha = 0; - } - - alpha <<= 24; - - g_renderer->RenderText(it->str, left+1, top+1, 0x000000|alpha); - g_renderer->RenderText(it->str, left, top, 0xffff30|alpha); - top += 15; - - if (time_left <= 0) - it = s_listMsgs.erase(it); - else - ++it; + alpha = time_left >> 2; + if (time_left < 0) + alpha = 0; } + + alpha <<= 24; + + g_renderer->RenderText(it->str.c_str(), left + 1, top + 1, 0x000000 | alpha); + g_renderer->RenderText(it->str.c_str(), left, top, 0xffff30 | alpha); + top += 15; + + if (time_left <= 0) + it = s_msgList.erase(it); + else + ++it; } } void ClearMessages() { - std::list<MESSAGE>::iterator it = s_listMsgs.begin(); - - while (it != s_listMsgs.end()) - { - it = s_listMsgs.erase(it); - } + s_msgList.clear(); } // On-Screen Display Callbacks -void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) +void AddCallback(CallbackType type, Callback cb) { - m_callbacks.push_back(OSDCALLBACK(OnType, FuncPtr, UserData)); + s_callbacks.insert(std::pair<CallbackType, Callback>(type, cb)); } -void DoCallbacks(CallbackType OnType) +void DoCallbacks(CallbackType type) { - for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) + auto it_bounds = s_callbacks.equal_range(type); + for (auto it = it_bounds.first; it != it_bounds.second; ++it) { - if (it->Type() == OnType) - it->Call(); + it->second(); } } |
