WIP moving more drawing/dirty tracking into LBackend

This commit is contained in:
UnknownShadow200 2022-04-23 19:35:39 +10:00
parent 9dcc41f4f1
commit f0583c32ca
6 changed files with 101 additions and 77 deletions

View File

@ -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

View File

@ -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();
}

View File

@ -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);

View File

@ -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) {

View File

@ -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

View File

@ -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);