Refactor VideoCommon/OnScreenDisplay.

Use strings internally, use a multimap and std::function for callbacks (instead
of a flat vector + loop over the vector to find the right callback type), fix
coding style issues. Simplify MainAndroid code a bit.
This commit is contained in:
Pierre Bourdon 2013-08-24 02:13:54 +02:00
parent 9deb63a312
commit 9303b57db1
3 changed files with 47 additions and 106 deletions

View File

@ -132,25 +132,6 @@ void Host_SysMessage(const char *fmt, ...)
void Host_SetWiiMoteConnectionState(int _State) {} void Host_SetWiiMoteConnectionState(int _State) {}
void OSDCallbacks(u32 UserData)
{
switch(UserData)
{
case 0: // Init
ButtonManager::Init();
break;
case 1: // Draw
ButtonManager::DrawButtons();
break;
case 2: // Shutdown
ButtonManager::Shutdown();
break;
default:
WARN_LOG(COMMON, "Error, wrong OSD type");
break;
}
}
#define DVD_BANNER_WIDTH 96 #define DVD_BANNER_WIDTH 96
#define DVD_BANNER_HEIGHT 32 #define DVD_BANNER_HEIGHT 32
std::vector<std::string> m_volume_names; std::vector<std::string> m_volume_names;
@ -321,8 +302,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
{ {
surf = ANativeWindow_fromSurface(env, _surf); surf = ANativeWindow_fromSurface(env, _surf);
// Install our callbacks // Install our callbacks
OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0); OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init);
OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2); OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown);
LogManager::Init(); LogManager::Init();
SConfig::Init(); SConfig::Init();
@ -337,7 +318,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
ini.Get("Android", "ScreenControls", &onscreencontrols, true); ini.Get("Android", "ScreenControls", &onscreencontrols, true);
if (onscreencontrols) if (onscreencontrols)
OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1); OSD::AddCallback(OSD::OSD_ONFRAME, ButtonManager::DrawButtons);
// No use running the loop when booting fails // No use running the loop when booting fails
if ( BootManager::BootCore( g_filename.c_str() ) ) if ( BootManager::BootCore( g_filename.c_str() ) )

View File

@ -11,56 +11,27 @@
#include "RenderBase.h" #include "RenderBase.h"
#include "Timer.h" #include "Timer.h"
#include <vector> #include <map>
#include <string>
namespace OSD namespace OSD
{ {
struct MESSAGE struct Message
{ {
MESSAGE() {} Message() {}
MESSAGE(const char* p, u32 dw) Message(const std::string& s, u32 ts) : str(s), timestamp(ts) {}
{
strncpy(str, p, 255); std::string str;
str[255] = '\0'; u32 timestamp;
dwTimeStamp = dw;
}
char str[256];
u32 dwTimeStamp;
}; };
class OSDCALLBACK static std::multimap<CallbackType, Callback> s_callbacks;
{ static std::list<Message> s_msgList;
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);
}
CallbackType Type() { return m_type; }
};
std::vector<OSDCALLBACK> m_callbacks;
static std::list<MESSAGE> s_listMsgs;
void AddMessage(const char* pstr, u32 ms)
{
s_listMsgs.push_back(MESSAGE(pstr, Common::Timer::GetTimeMs() + ms));
}
void AddMessage(const std::string& str, u32 ms) void AddMessage(const std::string& str, u32 ms)
{ {
AddMessage(str.c_str(), ms); s_msgList.push_back(Message(str, Common::Timer::GetTimeMs() + ms));
} }
void DrawMessages() void DrawMessages()
@ -68,58 +39,50 @@ void DrawMessages()
if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages) if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages)
return; 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; int time_left = (int)(it->timestamp - Common::Timer::GetTimeMs());
std::list<MESSAGE>::iterator it = s_listMsgs.begin(); u32 alpha = 255;
while (it != s_listMsgs.end())
if (time_left < 1024)
{ {
int time_left = (int)(it->dwTimeStamp - Common::Timer::GetTimeMs()); alpha = time_left >> 2;
int alpha = 255; if (time_left < 0)
alpha = 0;
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 <<= 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() void ClearMessages()
{ {
std::list<MESSAGE>::iterator it = s_listMsgs.begin(); s_msgList.clear();
while (it != s_listMsgs.end())
{
it = s_listMsgs.erase(it);
}
} }
// On-Screen Display Callbacks // 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->second();
it->Call();
} }
} }

View File

@ -5,13 +5,12 @@
#ifndef _OSD_H_ #ifndef _OSD_H_
#define _OSD_H_ #define _OSD_H_
#include <functional>
#include <string> #include <string>
namespace OSD namespace OSD
{ {
// On-screen message display // On-screen message display
void AddMessage(const char* str, u32 ms = 2000);
void AddMessage(const std::string& str, u32 ms = 2000); void AddMessage(const std::string& str, u32 ms = 2000);
void DrawMessages(); // draw the current messages on the screen. Only call once per frame. void DrawMessages(); // draw the current messages on the screen. Only call once per frame.
void ClearMessages(); void ClearMessages();
@ -23,12 +22,10 @@ enum CallbackType
OSD_ONFRAME, OSD_ONFRAME,
OSD_SHUTDOWN OSD_SHUTDOWN
}; };
typedef void(*CallbackPtr)(u32); typedef std::function<void()> Callback;
void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData); void AddCallback(CallbackType type, Callback cb);
void DoCallbacks(CallbackType type);
void DoCallbacks(CallbackType OnType); } // namespace OSD
} // namespace
#endif // _OSD_H_ #endif // _OSD_H_