From f0583c32ca79f8900596f139fdc7f2a7b48266e2 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 23 Apr 2022 19:35:39 +1000 Subject: [PATCH] WIP moving more drawing/dirty tracking into LBackend --- misc/buildbot.sh | 5 +++ src/LBackend.c | 92 +++++++++++++++++++++++++++++++++++++++++------- src/LBackend.h | 7 ++-- src/LScreens.c | 6 ++-- src/Launcher.c | 63 +++++---------------------------- src/Launcher.h | 5 --- 6 files changed, 101 insertions(+), 77 deletions(-) diff --git a/misc/buildbot.sh b/misc/buildbot.sh index 42fbcdb5c..3a9263974 100644 --- a/misc/buildbot.sh +++ b/misc/buildbot.sh @@ -201,6 +201,11 @@ IOS_FLAGS="-s -O1 -fvisibility=hidden -rdynamic -funwind-tables" build_ios() { echo "Building ios.." $IOS_CC *.c interop_ios.m $IOS_FLAGS $IOS_LIBS -o cc-ios + mkdir -p Payload/ClassiCube.app + cp cc-ios Payload/ClassiCube.app/ClassiCube + # https://askubuntu.com/questions/681949/plutil-equivalent-in-ubuntu + plistutil -i $ROOT_DIR/ios/Info.plist -o Payload/ClassiCube.app/Info.plist -f bin + zip -r cc.ipa Payload } # ----------------------------- driver diff --git a/src/LBackend.c b/src/LBackend.c index bc9c1fca6..9ad32f35b 100644 --- a/src/LBackend.c +++ b/src/LBackend.c @@ -23,7 +23,15 @@ #include "LScreens.h" #include "Input.h" #include "Utils.h" +#include "Event.h" + struct FontDesc titleFont, textFont, hintFont; +static struct LScreen* activeScreen; +static cc_uint8 pendingRedraw; +extern Rect2D dirty_rect; + +#define REDRAW_ALL 0x02 +#define REDRAW_SOME 0x01 static int xBorder, xBorder2, xBorder3, xBorder4; static int yBorder, yBorder2, yBorder3, yBorder4; @@ -34,6 +42,7 @@ static int hdrYOffset, hdrYPadding, rowYOffset, rowYPadding; static int cellXOffset, cellXPadding, cellMinWidth; static int flagXOffset, flagYOffset; +static void HookEvents(void); void LBackend_Init(void) { xBorder = Display_ScaleX(1); xBorder2 = xBorder * 2; xBorder3 = xBorder * 3; xBorder4 = xBorder * 4; yBorder = Display_ScaleY(1); yBorder2 = yBorder * 2; yBorder3 = yBorder * 3; yBorder4 = yBorder * 4; @@ -65,6 +74,7 @@ void LBackend_Init(void) { Drawer2D_MakeFont(&titleFont, 16, FONT_FLAGS_BOLD); Drawer2D_MakeFont(&textFont, 14, FONT_FLAGS_NONE); Drawer2D_MakeFont(&hintFont, 12, FONT_FLAGS_NONE); + HookEvents(); } void LBackend_Free(void) { @@ -73,33 +83,91 @@ void LBackend_Free(void) { Font_Free(&hintFont); } -static void DrawBoxBounds(BitmapCol col, int x, int y, int width, int height) { - Drawer2D_Clear(&Launcher_Framebuffer, col, +void LBackend_SetScreen(struct LScreen* s) { activeScreen = s; } +void LBackend_CloseScreen(struct LScreen* s) { activeScreen = NULL; } + +void LBackend_WidgetRepositioned(struct LWidget* w) { +} + +/* Marks the entire window as needing to be redrawn. */ +static CC_NOINLINE void MarkAllDirty(void) { + dirty_rect.X = 0; dirty_rect.Width = Launcher_Framebuffer.width; + dirty_rect.Y = 0; dirty_rect.Height = Launcher_Framebuffer.height; +} + + +/*########################################################################################################################* +*------------------------------------------------------Base drawing-------------------------------------------------------* +*#########################################################################################################################*/ +static void DrawBoxBounds(BitmapCol color, int x, int y, int width, int height) { + Drawer2D_Clear(&Launcher_Framebuffer, color, x, y, width, yBorder); - Drawer2D_Clear(&Launcher_Framebuffer, col, + Drawer2D_Clear(&Launcher_Framebuffer, color, x, y + height - yBorder, width, yBorder); - Drawer2D_Clear(&Launcher_Framebuffer, col, + Drawer2D_Clear(&Launcher_Framebuffer, color, x, y, xBorder, height); - Drawer2D_Clear(&Launcher_Framebuffer, col, + Drawer2D_Clear(&Launcher_Framebuffer, color, x + width - xBorder, y, xBorder, height); } -void LBackend_WidgetRepositioned(struct LWidget* w) { } -void LBackend_SetScreen(struct LScreen* s) { } -void LBackend_CloseScreen(struct LScreen* s) { } - -void LBackend_RedrawScreen(struct LScreen* s) { +static CC_NOINLINE void RedrawAll(void) { + struct LScreen* s = activeScreen; int i; s->DrawBackground(s, &Launcher_Framebuffer); for (i = 0; i < s->numWidgets; i++) { LWidget_Draw(s->widgets[i]); } - Launcher_MarkAllDirty(); + MarkAllDirty(); +} + +void LBackend_Redraw(void) { + pendingRedraw = REDRAW_ALL; + MarkAllDirty(); +} + +void LBackend_Tick(void) { + activeScreen->Tick(activeScreen); + if (!dirty_rect.Width) return; + + if (pendingRedraw & REDRAW_ALL) { + RedrawAll(); + pendingRedraw = 0; + } + + Window_DrawFramebuffer(dirty_rect); + dirty_rect.X = 0; dirty_rect.Width = 0; + dirty_rect.Y = 0; dirty_rect.Height = 0; +} + + +/*########################################################################################################################* +*-----------------------------------------------------Event handling------------------------------------------------------* +*#########################################################################################################################*/ +static void ReqeustRedraw(void* obj) { LBackend_Redraw(); } + +static void OnPointerDown(void* obj, int idx) { + activeScreen->MouseDown(activeScreen, idx); +} + +static void OnPointerUp(void* obj, int idx) { + activeScreen->MouseUp(activeScreen, idx); +} + +static void OnPointerMove(void* obj, int idx) { + if (!activeScreen) return; + activeScreen->MouseMove(activeScreen, idx); +} + +static void HookEvents(void) { + Event_Register_(&WindowEvents.Redraw, NULL, ReqeustRedraw); + Event_Register_(&PointerEvents.Down, NULL, OnPointerDown); + Event_Register_(&PointerEvents.Up, NULL, OnPointerUp); + Event_Register_(&PointerEvents.Moved, NULL, OnPointerMove); } @@ -753,7 +821,7 @@ void LBackend_TableDraw(struct LTable* w) { LTable_DrawHeaders(w); LTable_DrawRows(w); LTable_DrawScrollbar(w); - Launcher_MarkAllDirty(); + MarkAllDirty(); } diff --git a/src/LBackend.h b/src/LBackend.h index 41e396249..9c446d533 100644 --- a/src/LBackend.h +++ b/src/LBackend.h @@ -17,10 +17,13 @@ struct LTable; void LBackend_Init(void); void LBackend_Free(void); -void LBackend_WidgetRepositioned(struct LWidget* w); void LBackend_SetScreen(struct LScreen* s); void LBackend_CloseScreen(struct LScreen* s); -void LBackend_RedrawScreen(struct LScreen* s); + +/* Resets pixels to default, then draws widgets of current screen over it */ +void LBackend_Redraw(void); +void LBackend_Tick(void); +void LBackend_WidgetRepositioned(struct LWidget* w); void LBackend_ButtonInit(struct LButton* w, int width, int height); void LBackend_ButtonUpdate(struct LButton* w); diff --git a/src/LScreens.c b/src/LScreens.c index 22641e020..31c3ffda8 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -395,7 +395,7 @@ static void ColoursScreen_TextChanged(struct LInput* w) { *color = BitmapCol_Make(r, g, b, 255); Launcher_SaveTheme(); - Launcher_Redraw(); + LBackend_Redraw(); } static void ColoursScreen_AdjustSelected(struct LScreen* s, int delta) { @@ -439,7 +439,7 @@ static void ColoursScreen_KeyDown(struct LScreen* s, int key, cc_bool was) { static void ColoursScreen_ToggleBG(struct LCheckbox* w) { Launcher_Theme.ClassicBackground = w->value; Launcher_SaveTheme(); - Launcher_Redraw(); + LBackend_Redraw(); } static void ColoursScreen_Init(struct LScreen* s_) { @@ -1604,7 +1604,7 @@ static struct LWidget* themes_widgets[] = { static void ThemesScreen_Set(const struct LauncherTheme* theme) { Launcher_Theme = *theme; Launcher_SaveTheme(); - Launcher_Redraw(); + LBackend_Redraw(); } static void ThemesScreen_Modern(void* w) { diff --git a/src/Launcher.c b/src/Launcher.c index 279fd8aa1..e00401cbc 100644 --- a/src/Launcher.c +++ b/src/Launcher.c @@ -23,12 +23,11 @@ /* The area/region of the window that needs to be redrawn and presented to the screen. */ /* If width is 0, means no area needs to be redrawn. */ -static Rect2D dirty_rect; +Rect2D dirty_rect; static struct LScreen* activeScreen; struct Bitmap Launcher_Framebuffer; struct FontDesc Launcher_LogoFont; -static cc_bool pendingRedraw; cc_bool Launcher_ShouldExit, Launcher_ShouldUpdate; static char hashBuffer[STRING_SIZE], userBuffer[STRING_SIZE]; @@ -62,7 +61,7 @@ void Launcher_SetScreen(struct LScreen* screen) { } LBackend_SetScreen(screen); - Launcher_Redraw(); + LBackend_Redraw(); } void Launcher_DisplayHttpError(cc_result res, int status, const char* action, cc_string* dst) { @@ -176,19 +175,12 @@ cc_bool Launcher_ConnectToServer(const cc_string* hash) { /*########################################################################################################################* *---------------------------------------------------------Event handler---------------------------------------------------* *#########################################################################################################################*/ -static void ReqeustRedraw(void* obj) { - /* We may get multiple Redraw events in short timespan */ - /* So we just request a redraw at next launcher tick */ - pendingRedraw = true; - Launcher_MarkAllDirty(); -} - static void OnResize(void* obj) { Window_FreeFramebuffer(&Launcher_Framebuffer); InitFramebuffer(); if (activeScreen) activeScreen->Layout(activeScreen); - Launcher_Redraw(); + LBackend_Redraw(); } static cc_bool IsShutdown(int key) { @@ -219,47 +211,18 @@ static void OnMouseWheel(void* obj, float delta) { activeScreen->MouseWheel(activeScreen, delta); } -static void OnPointerDown(void* obj, int idx) { - activeScreen->MouseDown(activeScreen, idx); -} - -static void OnPointerUp(void* obj, int idx) { - activeScreen->MouseUp(activeScreen, idx); -} - -static void OnPointerMove(void* obj, int idx) { - if (!activeScreen) return; - activeScreen->MouseMove(activeScreen, idx); -} - /*########################################################################################################################* *-----------------------------------------------------------Main body-----------------------------------------------------* *#########################################################################################################################*/ -static void Launcher_Display(void) { - if (pendingRedraw) { - Launcher_Redraw(); - pendingRedraw = false; - } - - Window_DrawFramebuffer(dirty_rect); - dirty_rect.X = 0; dirty_rect.Width = 0; - dirty_rect.Y = 0; dirty_rect.Height = 0; -} - static void Launcher_Init(void) { Event_Register_(&WindowEvents.Resized, NULL, OnResize); Event_Register_(&WindowEvents.StateChanged, NULL, OnResize); - Event_Register_(&WindowEvents.Redraw, NULL, ReqeustRedraw); - Event_Register_(&InputEvents.Down, NULL, OnInputDown); - Event_Register_(&InputEvents.Press, NULL, OnKeyPress); - Event_Register_(&InputEvents.Wheel, NULL, OnMouseWheel); - Event_Register_(&InputEvents.TextChanged, NULL, OnTextChanged); - - Event_Register_(&PointerEvents.Down, NULL, OnPointerDown); - Event_Register_(&PointerEvents.Up, NULL, OnPointerUp); - Event_Register_(&PointerEvents.Moved, NULL, OnPointerMove); + Event_Register_(&InputEvents.Down, NULL, OnInputDown); + Event_Register_(&InputEvents.Press, NULL, OnKeyPress); + Event_Register_(&InputEvents.Wheel, NULL, OnMouseWheel); + Event_Register_(&InputEvents.TextChanged, NULL, OnTextChanged); Utils_EnsureDirectory("texpacks"); Utils_EnsureDirectory("audio"); @@ -323,8 +286,7 @@ void Launcher_Run(void) { Window_ProcessEvents(); if (!WindowInfo.Exists || Launcher_ShouldExit) break; - activeScreen->Tick(activeScreen); - if (dirty_rect.Width) Launcher_Display(); + LBackend_Tick(); Thread_Sleep(10); } @@ -561,10 +523,6 @@ void Launcher_ResetArea(int x, int y, int width, int height) { Launcher_MarkDirty(x, y, width, height); } -void Launcher_Redraw(void) { - LBackend_RedrawScreen(activeScreen); -} - void Launcher_MarkDirty(int x, int y, int width, int height) { int x1, y1, x2, y2; if (!Drawer2D_Clamp(&Launcher_Framebuffer, &x, &y, &width, &height)) return; @@ -584,9 +542,4 @@ void Launcher_MarkDirty(int x, int y, int width, int height) { dirty_rect.X = x; dirty_rect.Width = width; dirty_rect.Y = y; dirty_rect.Height = height; } - -void Launcher_MarkAllDirty(void) { - dirty_rect.X = 0; dirty_rect.Width = Launcher_Framebuffer.width; - dirty_rect.Y = 0; dirty_rect.Height = Launcher_Framebuffer.height; -} #endif diff --git a/src/Launcher.h b/src/Launcher.h index 10342b1d3..7564e7cfb 100644 --- a/src/Launcher.h +++ b/src/Launcher.h @@ -65,13 +65,8 @@ void Launcher_DrawBackgroundAll(struct Bitmap* bmp); /* Redraws the specified region with the background pixels. */ /* Also marks that area as neeing to be redrawn. */ void Launcher_ResetArea(int x, int y, int width, int height); -/* Resets pixels to default, then draws widgets of current screen over it. */ -/* Marks the entire window as needing to be redrawn. */ -void Launcher_Redraw(void); /* Marks the given area/region as needing to be redrawn. */ CC_NOINLINE void Launcher_MarkDirty(int x, int y, int width, int height); -/* Marks the entire window as needing to be redrawn. */ -CC_NOINLINE void Launcher_MarkAllDirty(void); /* Sets currently active screen/menu, freeing old one. */ void Launcher_SetScreen(struct LScreen* screen);