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:
parent
9deb63a312
commit
9303b57db1
|
@ -132,25 +132,6 @@ void Host_SysMessage(const char *fmt, ...)
|
|||
|
||||
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_HEIGHT 32
|
||||
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);
|
||||
// Install our callbacks
|
||||
OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0);
|
||||
OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2);
|
||||
OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init);
|
||||
OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown);
|
||||
|
||||
LogManager::Init();
|
||||
SConfig::Init();
|
||||
|
@ -337,7 +318,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
|
|||
ini.Get("Android", "ScreenControls", &onscreencontrols, true);
|
||||
|
||||
if (onscreencontrols)
|
||||
OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1);
|
||||
OSD::AddCallback(OSD::OSD_ONFRAME, ButtonManager::DrawButtons);
|
||||
|
||||
// No use running the loop when booting fails
|
||||
if ( BootManager::BootCore( g_filename.c_str() ) )
|
||||
|
|
|
@ -11,56 +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;
|
||||
Message() {}
|
||||
Message(const std::string& s, u32 ts) : str(s), timestamp(ts) {}
|
||||
|
||||
std::string str;
|
||||
u32 timestamp;
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
static std::multimap<CallbackType, Callback> s_callbacks;
|
||||
static std::list<Message> s_msgList;
|
||||
|
||||
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()
|
||||
|
@ -68,14 +39,12 @@ void DrawMessages()
|
|||
if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages)
|
||||
return;
|
||||
|
||||
if (s_listMsgs.size() > 0)
|
||||
{
|
||||
int left = 25, top = 15;
|
||||
std::list<MESSAGE>::iterator it = s_listMsgs.begin();
|
||||
while (it != s_listMsgs.end())
|
||||
auto it = s_msgList.begin();
|
||||
while (it != s_msgList.end())
|
||||
{
|
||||
int time_left = (int)(it->dwTimeStamp - Common::Timer::GetTimeMs());
|
||||
int alpha = 255;
|
||||
int time_left = (int)(it->timestamp - Common::Timer::GetTimeMs());
|
||||
u32 alpha = 255;
|
||||
|
||||
if (time_left < 1024)
|
||||
{
|
||||
|
@ -86,40 +55,34 @@ void DrawMessages()
|
|||
|
||||
alpha <<= 24;
|
||||
|
||||
g_renderer->RenderText(it->str, left+1, top+1, 0x000000|alpha);
|
||||
g_renderer->RenderText(it->str, left, top, 0xffff30|alpha);
|
||||
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_listMsgs.erase(it);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,13 +5,12 @@
|
|||
#ifndef _OSD_H_
|
||||
#define _OSD_H_
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
namespace OSD
|
||||
{
|
||||
|
||||
// On-screen message display
|
||||
void AddMessage(const char* 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 ClearMessages();
|
||||
|
@ -23,12 +22,10 @@ enum CallbackType
|
|||
OSD_ONFRAME,
|
||||
OSD_SHUTDOWN
|
||||
};
|
||||
typedef void(*CallbackPtr)(u32);
|
||||
typedef std::function<void()> Callback;
|
||||
|
||||
void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData);
|
||||
|
||||
void DoCallbacks(CallbackType OnType);
|
||||
} // namespace
|
||||
void AddCallback(CallbackType type, Callback cb);
|
||||
void DoCallbacks(CallbackType type);
|
||||
} // namespace OSD
|
||||
|
||||
#endif // _OSD_H_
|
||||
|
||||
|
|
Loading…
Reference in New Issue