aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2019-06-03 15:00:49 +0200
committerArisotura <thetotalworm@gmail.com>2019-06-03 15:00:49 +0200
commit4a4415fc2ec067fb79881e17e14953b69ef80e0c (patch)
treee62443817e1d5ee7e652edcd57dfa8ec97895353
parent43e3e53afc4a8777592333717cfc4f4b304051eb (diff)
more work on OSD
-rw-r--r--src/libui_sdl/OSD.cpp132
-rw-r--r--src/libui_sdl/OSD.h9
-rw-r--r--src/libui_sdl/libui/ui.h2
-rw-r--r--src/libui_sdl/libui/unix/draw.c4
-rw-r--r--src/libui_sdl/libui/windows/draw.cpp5
-rw-r--r--src/libui_sdl/main.cpp39
6 files changed, 133 insertions, 58 deletions
diff --git a/src/libui_sdl/OSD.cpp b/src/libui_sdl/OSD.cpp
index bce14c1..a13ff44 100644
--- a/src/libui_sdl/OSD.cpp
+++ b/src/libui_sdl/OSD.cpp
@@ -18,14 +18,14 @@
#include <stdio.h>
#include <string.h>
-#include <queue>
+#include <deque>
#include <SDL2/SDL.h>
#include "../types.h"
-#include "OSD.h"
#include "libui/ui.h"
#include "../OpenGLSupport.h"
+#include "OSD.h"
#include "font.h"
extern int WindowWidth, WindowHeight;
@@ -38,6 +38,9 @@ const u32 kOSDMargin = 6;
typedef struct
{
Uint32 Timestamp;
+ char Text[256];
+ u32 Color;
+
u32 Width, Height;
u32* Bitmap;
@@ -49,15 +52,28 @@ typedef struct
} Item;
-std::queue<Item*> CurrentItems;
+std::deque<Item*> ItemQueue;
-bool Init()
+bool Init(bool opengl)
{
+ return true;
}
-void DeInit()
+void DeInit(bool opengl)
{
+ for (auto it = ItemQueue.begin(); it != ItemQueue.end(); )
+ {
+ Item* item = *it;
+
+ if (item->DrawBitmapLoaded && item->DrawBitmap) uiDrawFreeBitmap(item->DrawBitmap);
+ if (item->GLTextureLoaded && opengl) glDeleteTextures(1, &item->GLTexture);
+ if (item->Bitmap) delete[] item->Bitmap;
+
+ delete item;
+
+ ItemQueue.erase(it);
+ }
}
@@ -142,7 +158,7 @@ u32 RainbowColor(u32 inc)
{
// inspired from Acmlmboard
- if (inc < 100) return 0xFFFF9BFF + (inc << 8);
+ if (inc < 100) return 0xFFFF9B9B + (inc << 8);
else if (inc < 200) return 0xFFFFFF9B - ((inc-100) << 16);
else if (inc < 300) return 0xFF9BFF9B + (inc-200);
else if (inc < 400) return 0xFF9BFFFF - ((inc-300) << 8);
@@ -156,10 +172,10 @@ void RenderText(u32 color, const char* text, Item* item)
int breaks[64];
bool rainbow = (color == 0);
- u32 rainbowinc = rand() % 600;
+ u32 rainbowinc = (text[0] * 17) % 600;
color |= 0xFF000000;
- const u32 shadow = 0xC0000000;
+ const u32 shadow = 0xFE000000;
LayoutText(text, &w, &h, breaks);
@@ -257,49 +273,89 @@ void RenderText(u32 color, const char* text, Item* item)
}
}
-void test(u32* berp)
+
+void AddMessage(u32 color, const char* text)
{
- Item barp;
- RenderText(0x000000, "This is a test of OSD, it can display really long messages, like thiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis. Also, pancakes are the best thing ever.", &barp);
+ Item* item = new Item;
+
+ item->Timestamp = SDL_GetTicks();
+ strncpy(item->Text, text, 255); item->Text[255] = '\0';
+ item->Color = color;
+ item->Bitmap = NULL;
- for (int y = 0; y < barp.Height; y++)
+ item->DrawBitmapLoaded = false;
+ item->GLTextureLoaded = false;
+
+ ItemQueue.push_back(item);
+}
+
+void WindowResized(bool opengl)
+{
+ /*for (auto it = ItemQueue.begin(); it != ItemQueue.end(); )
{
- for (int x = 0; x < barp.Width; x++)
- {
- u32 src = barp.Bitmap[(y*barp.Width)+x];
- u32 dst = berp[((y+6)*256)+x+6];
+ Item* item = *it;
- u32 sR = (src >> 16) & 0xFF;
- u32 sG = (src >> 8) & 0xFF;
- u32 sB = (src ) & 0xFF;
- u32 sA = (src >> 24) & 0xFF;
+ if (item->DrawBitmapLoaded && item->DrawBitmap) uiDrawFreeBitmap(item->DrawBitmap);
+ //if (item->GLTextureLoaded && opengl) glDeleteTextures(1, &item->GLTexture);
- u32 dR = (dst >> 16) & 0xFF;
- u32 dG = (dst >> 8) & 0xFF;
- u32 dB = (dst ) & 0xFF;
+ item->DrawBitmapLoaded = false;
+ item->GLTextureLoaded = false;
- dR = ((sR * sA) + (dR * (255-sA))) >> 8;
- dG = ((sG * sA) + (dG * (255-sA))) >> 8;
- dB = ((sB * sA) + (dB * (255-sA))) >> 8;
+ if (item->Bitmap) delete[] item->Bitmap;
- dst = (dR << 16) | (dG << 8) | dB;
+ it++;
+ }*/
+}
+
+void Update(bool opengl, uiAreaDrawParams* params)
+{
+ Uint32 tick_now = SDL_GetTicks();
+ Uint32 tick_min = tick_now - 2500;
+ u32 y = kOSDMargin;
+
+ for (auto it = ItemQueue.begin(); it != ItemQueue.end(); )
+ {
+ Item* item = *it;
- berp[((y+6)*256)+x+6] = dst | 0xFF000000;
+ if (item->Timestamp < tick_min)
+ {
+ if (item->DrawBitmapLoaded && item->DrawBitmap) uiDrawFreeBitmap(item->DrawBitmap);
+ if (item->GLTextureLoaded && opengl) glDeleteTextures(1, &item->GLTexture);
+ if (item->Bitmap) delete[] item->Bitmap;
+
+ delete item;
+
+ ItemQueue.erase(it);
+ continue;
}
- }
- delete[] barp.Bitmap;
-}
+ if (!item->Bitmap)
+ {
+ RenderText(item->Color, item->Text, item);
+ }
+
+ if (opengl)
+ {
+ //
+ }
+ else
+ {
+ if (!item->DrawBitmapLoaded)
+ {
+ item->DrawBitmap = uiDrawNewBitmap(params->Context, item->Width, item->Height, 1);
+ uiDrawBitmapUpdate(item->DrawBitmap, item->Bitmap);
+ item->DrawBitmapLoaded = true;
+ }
+ uiRect rc_src = {0, 0, item->Width, item->Height};
+ uiRect rc_dst = {kOSDMargin, y, item->Width, item->Height};
-void AddMessage(u32 color, const char* text)
-{
- //
-}
+ uiDrawBitmapDraw(params->Context, item->DrawBitmap, &rc_src, &rc_dst, 0);
+ }
-void Update(bool opengl)
-{
- //
+ y += item->Height;
+ it++;
+ }
}
}
diff --git a/src/libui_sdl/OSD.h b/src/libui_sdl/OSD.h
index ed38490..afe403f 100644
--- a/src/libui_sdl/OSD.h
+++ b/src/libui_sdl/OSD.h
@@ -22,14 +22,13 @@
namespace OSD
{
-bool Init();
-void DeInit();
-
-void test(u32* berp);
+bool Init(bool opengl);
+void DeInit(bool opengl);
void AddMessage(u32 color, const char* text);
-void Update(bool opengl);
+void WindowResized(bool opengl);
+void Update(bool opengl, uiAreaDrawParams* params);
}
diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h
index 47da54b..e15c127 100644
--- a/src/libui_sdl/libui/ui.h
+++ b/src/libui_sdl/libui/ui.h
@@ -516,7 +516,7 @@ _UI_EXTERN void uiDrawSave(uiDrawContext *c);
_UI_EXTERN void uiDrawRestore(uiDrawContext *c);
// bitmap API
-_UI_EXTERN uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height);
+_UI_EXTERN uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height, int alpha);
_UI_EXTERN void uiDrawBitmapUpdate(uiDrawBitmap* bmp, const void* data);
_UI_EXTERN void uiDrawBitmapDraw(uiDrawContext* c, uiDrawBitmap* bmp, uiRect* srcrect, uiRect* dstrect, int filter);
_UI_EXTERN void uiDrawFreeBitmap(uiDrawBitmap* bmp);
diff --git a/src/libui_sdl/libui/unix/draw.c b/src/libui_sdl/libui/unix/draw.c
index e55397e..5befcd3 100644
--- a/src/libui_sdl/libui/unix/draw.c
+++ b/src/libui_sdl/libui/unix/draw.c
@@ -143,13 +143,13 @@ void uiDrawRestore(uiDrawContext *c)
// bitmap API
-uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height)
+uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height, int alpha)
{
uiDrawBitmap* bmp;
bmp = uiNew(uiDrawBitmap);
- bmp->bmp = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height);
+ bmp->bmp = cairo_image_surface_create(alpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, width, height);
if (cairo_surface_status(bmp->bmp) != CAIRO_STATUS_SUCCESS)
implbug("error creating bitmap: %s",
cairo_status_to_string(cairo_surface_status(bmp->bmp)));
diff --git a/src/libui_sdl/libui/windows/draw.cpp b/src/libui_sdl/libui/windows/draw.cpp
index 11a777d..9a815b9 100644
--- a/src/libui_sdl/libui/windows/draw.cpp
+++ b/src/libui_sdl/libui/windows/draw.cpp
@@ -522,7 +522,7 @@ void uiDrawRestore(uiDrawContext *c)
// bitmap API
-uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height)
+uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height, int alpha)
{
uiDrawBitmap* bmp;
HRESULT hr;
@@ -532,7 +532,8 @@ uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height)
D2D1_BITMAP_PROPERTIES bp2 = D2D1::BitmapProperties();
bp2.dpiX = 0;
bp2.dpiY = 0;
- bp2.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);
+ bp2.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
+ alpha ? D2D1_ALPHA_MODE_PREMULTIPLIED : D2D1_ALPHA_MODE_IGNORE);
//c->rt->BeginDraw();
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
index 73666cd..5407403 100644
--- a/src/libui_sdl/main.cpp
+++ b/src/libui_sdl/main.cpp
@@ -434,6 +434,8 @@ void GLScreen_DrawScreen()
glDrawArrays(GL_TRIANGLES, 0, 4*3);
}
+ OSD::Update(true, NULL);
+
glFlush();
uiGLSwapBuffers(GLContext);
}
@@ -948,7 +950,15 @@ int EmuThreadFunc(void* burp)
NDS::DeInit();
Platform::LAN_DeInit();
- if (Screen_UseGL) GLScreen_DeInit();
+ if (Screen_UseGL)
+ {
+ uiGLMakeContextCurrent(GLContext);
+ OSD::DeInit(true);
+ GLScreen_DeInit();
+ uiGLMakeContextCurrent(NULL);
+ }
+ else
+ OSD::DeInit(false);
return 44203;
}
@@ -962,8 +972,8 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
if (ScreenBitmap[1]) uiDrawFreeBitmap(ScreenBitmap[1]);
ScreenDrawInited = true;
- ScreenBitmap[0] = uiDrawNewBitmap(params->Context, 256, 192);
- ScreenBitmap[1] = uiDrawNewBitmap(params->Context, 256, 192);
+ ScreenBitmap[0] = uiDrawNewBitmap(params->Context, 256, 192, 0);
+ ScreenBitmap[1] = uiDrawNewBitmap(params->Context, 256, 192, 0);
}
int frontbuf = GPU::FrontBuffer;
@@ -973,8 +983,6 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
uiRect top = {0, 0, 256, 192};
uiRect bot = {0, 0, 256, 192};
- //OSD::test(GPU::Framebuffer[frontbuf][0]);
-
uiDrawBitmapUpdate(ScreenBitmap[0], GPU::Framebuffer[frontbuf][0]);
uiDrawBitmapUpdate(ScreenBitmap[1], GPU::Framebuffer[frontbuf][1]);
@@ -987,6 +995,8 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
uiDrawTransform(params->Context, &BottomScreenTrans);
uiDrawBitmapDraw(params->Context, ScreenBitmap[1], &bot, &BottomScreenRect, Config::ScreenFilter==1);
uiDrawRestore(params->Context);
+
+ OSD::Update(false, params);
}
void OnAreaMouseEvent(uiAreaHandler* handler, uiArea* area, uiAreaMouseEvent* evt)
@@ -1118,7 +1128,8 @@ int OnAreaKeyEvent(uiAreaHandler* handler, uiArea* area, uiAreaKeyEvent* evt)
MicCommand |= 1;
if (evt->Scancode == 0x57) // F11
- NDS::debug(0);
+ OSD::AddMessage(0, "OSD test");
+ //NDS::debug(0);
}
return 1;
@@ -1374,15 +1385,17 @@ void OnAreaResize(uiAreaHandler* handler, uiArea* area, int width, int height)
WindowWidth = width;
WindowHeight = height;
- int max = uiWindowMaximized(MainWindow);
- int min = uiWindowMinimized(MainWindow);
+ int ismax = uiWindowMaximized(MainWindow);
+ int ismin = uiWindowMinimized(MainWindow);
- Config::WindowMaximized = max;
- if (!max && !min)
+ Config::WindowMaximized = ismax;
+ if (!ismax && !ismin)
{
Config::WindowWidth = width;
Config::WindowHeight = height;
}
+
+ OSD::WindowResized(Screen_UseGL);
}
@@ -2061,6 +2074,10 @@ void ApplyNewSettings(int type)
if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
}
+ if (Screen_UseGL) uiGLMakeContextCurrent(GLContext);
+ OSD::DeInit(Screen_UseGL);
+ if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
+
Screen_UseGL = usegl;
RecreateMainWindow(usegl);
@@ -2294,6 +2311,8 @@ void CreateMainWindow(bool opengl)
RecreateMainWindow(false);
Screen_UseGL = false;
}
+
+ OSD::Init(opengl);
}
void DestroyMainWindow()