| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-01 13:23:34 -05:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | #include <list>
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/Timer.h"
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Core/ConfigManager.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "VideoCommon/OnScreenDisplay.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/RenderBase.h"
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace OSD | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | static std::multimap<CallbackType, Callback> s_callbacks; | 
					
						
							|  |  |  | static std::multimap<MessageType, Message> s_messages; | 
					
						
							|  |  |  | static std::mutex s_messages_mutex; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AddTypedMessage(MessageType type, const std::string& message, u32 ms, u32 rgba) | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  |   std::lock_guard<std::mutex> lock(s_messages_mutex); | 
					
						
							|  |  |  |   s_messages.erase(type); | 
					
						
							| 
									
										
										
										
											2016-10-15 12:36:11 +02:00
										 |  |  |   s_messages.emplace(type, Message(message, Common::Timer::GetTimeMs() + ms, rgba)); | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | void AddMessage(const std::string& message, u32 ms, u32 rgba) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   std::lock_guard<std::mutex> lock(s_messages_mutex); | 
					
						
							|  |  |  |   s_messages.emplace(MessageType::Typeless, | 
					
						
							| 
									
										
										
										
											2016-10-15 12:36:11 +02:00
										 |  |  |                      Message(message, Common::Timer::GetTimeMs() + ms, rgba)); | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | void DrawMessage(const Message& msg, int top, int left, int time_left) | 
					
						
							| 
									
										
										
										
											2013-08-24 01:41:17 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  |   float alpha = std::min(1.0f, std::max(0.0f, time_left / 1024.0f)); | 
					
						
							|  |  |  |   u32 color = (msg.m_rgba & 0xFFFFFF) | ((u32)((msg.m_rgba >> 24) * alpha) << 24); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_renderer->RenderText(msg.m_str, left, top, color); | 
					
						
							| 
									
										
										
										
											2013-08-24 01:41:17 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | void DrawMessages() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   if (!SConfig::GetInstance().bOnScreenDisplayMessages) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  |     std::lock_guard<std::mutex> lock(s_messages_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     u32 now = Common::Timer::GetTimeMs(); | 
					
						
							| 
									
										
										
										
											2016-10-15 12:36:11 +02:00
										 |  |  |     int left = 20, top = 35; | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     auto it = s_messages.begin(); | 
					
						
							|  |  |  |     while (it != s_messages.end()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       const Message& msg = it->second; | 
					
						
							|  |  |  |       int time_left = (int)(msg.m_timestamp - now); | 
					
						
							|  |  |  |       DrawMessage(msg, top, left, time_left); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (time_left <= 0) | 
					
						
							|  |  |  |         it = s_messages.erase(it); | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         ++it; | 
					
						
							|  |  |  |       top += 15; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-02 04:40:27 +00:00
										 |  |  | void ClearMessages() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-02 16:35:27 +01:00
										 |  |  |   std::lock_guard<std::mutex> lock(s_messages_mutex); | 
					
						
							|  |  |  |   s_messages.clear(); | 
					
						
							| 
									
										
										
										
											2011-02-02 04:40:27 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05:00
										 |  |  | // On-Screen Display Callbacks
 | 
					
						
							| 
									
										
										
										
											2013-08-24 02:13:54 +02:00
										 |  |  | void AddCallback(CallbackType type, Callback cb) | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   s_callbacks.emplace(type, cb); | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-24 02:13:54 +02:00
										 |  |  | void DoCallbacks(CallbackType type) | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   auto it_bounds = s_callbacks.equal_range(type); | 
					
						
							|  |  |  |   for (auto it = it_bounds.first; it != it_bounds.second; ++it) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     it->second(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Wipe all callbacks on shutdown
 | 
					
						
							|  |  |  |   if (type == CallbackType::Shutdown) | 
					
						
							|  |  |  |     s_callbacks.clear(); | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-23 06:15:48 +00:00
										 |  |  | }  // namespace
 |