diff --git a/src/LScreens.c b/src/LScreens.c index d65634f0e..7f566bd2f 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -129,7 +129,7 @@ static void LScreen_DrawBackground(struct LScreen* s, struct Context2D* ctx) { CC_NOINLINE static void LScreen_Reset(struct LScreen* s) { int i; - s->Init = NULL; /* screens should always override this */ + s->Init = LScreen_NullFunc; s->Show = LScreen_NullFunc; s->Free = LScreen_NullFunc; s->Layout = LScreen_DoLayout; @@ -150,6 +150,17 @@ CC_NOINLINE static void LScreen_Reset(struct LScreen* s) { s->selectedWidget = NULL; } + +void LScreen_AddWidget(void* screen, void* widget) { + struct LScreen* s = (struct LScreen*)screen; + struct LWidget* w = (struct LWidget*)widget; + + if (s->numWidgets >= s->maxWidgets) + Logger_Abort("Can't add anymore widgets to this LScreen"); + s->widgets[s->numWidgets++] = w; +} + + static void SwitchToChooseMode(void* w) { ChooseModeScreen_SetActive(false); } static void SwitchToColours(void* w) { ColoursScreen_SetActive(); } static void SwitchToDirectConnect(void* w) { DirectConnectScreen_SetActive(); } @@ -170,13 +181,8 @@ static struct ChooseModeScreen { cc_bool firstTime; } ChooseModeScreen; -static struct LWidget* chooseMode_widgets[] = { - (struct LWidget*)&ChooseModeScreen.seps[0], (struct LWidget*)&ChooseModeScreen.seps[1], - (struct LWidget*)&ChooseModeScreen.btnEnhanced, (struct LWidget*)&ChooseModeScreen.lblEnhanced[0], (struct LWidget*)&ChooseModeScreen.lblEnhanced[1], - (struct LWidget*)&ChooseModeScreen.btnClassicHax,(struct LWidget*)&ChooseModeScreen.lblClassicHax[0],(struct LWidget*)&ChooseModeScreen.lblClassicHax[1], - (struct LWidget*)&ChooseModeScreen.btnClassic, (struct LWidget*)&ChooseModeScreen.lblClassic[0], (struct LWidget*)&ChooseModeScreen.lblClassic[1], - NULL -}; +#define CHOOSEMODE_SCREEN_MAX_WIDGETS 12 +static struct LWidget* chooseMode_widgets[CHOOSEMODE_SCREEN_MAX_WIDGETS]; LAYOUTS mode_seps0[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -85 } }; LAYOUTS mode_seps1[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -15 } }; @@ -215,28 +221,36 @@ static void UseModeEnhanced(void* w) { ChooseMode_Click(false, false); } static void UseModeClassicHax(void* w) { ChooseMode_Click(true, true); } static void UseModeClassic(void* w) { ChooseMode_Click(true, false); } -static void ChooseModeScreen_Init(struct LScreen* s_) { +static void ChooseModeScreen_AddWidgets(struct ChooseModeScreen* s) { + LLine_Init(s, &s->seps[0], 490, mode_seps0); + LLine_Init(s, &s->seps[1], 490, mode_seps1); + + LButton_Init(s, &s->btnEnhanced, 145, 35, "Enhanced", mode_btnEnhanced); + LLabel_Init(s, &s->lblEnhanced[0], "&eEnables custom blocks, changing env", mode_lblEnhanced0); + LLabel_Init(s, &s->lblEnhanced[1], "&esettings, longer messages, and more", mode_lblEnhanced1); + + LButton_Init(s, &s->btnClassicHax, 145, 35, "Classic +hax", mode_btnClassicHax); + LLabel_Init(s, &s->lblClassicHax[0], "&eSame as Classic mode, except that", mode_lblClassicHax0); + LLabel_Init(s, &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", mode_lblClassicHax1); + + LButton_Init(s, &s->btnClassic, 145, 35, "Classic", mode_btnClassic); + LLabel_Init(s, &s->lblClassic[0], "&eOnly uses blocks and features from", mode_lblClassic0); + LLabel_Init(s, &s->lblClassic[1], "ðe original minecraft classic", mode_lblClassic1); + + if (s->firstTime) { + LLabel_Init(s, &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", mode_lblHelp); + } else { + LButton_Init(s, &s->btnBack, 80, 35, "Back", mode_btnBack); + } +} + +static void ChooseModeScreen_Show(struct LScreen* s_) { struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; - s->widgets = chooseMode_widgets; - s->numWidgets = Array_Elems(chooseMode_widgets); - LLine_Init( &s->seps[0], 490, mode_seps0); - LLine_Init( &s->seps[1], 490, mode_seps1); - - LButton_Init(&s->btnEnhanced, 145, 35, "Enhanced", mode_btnEnhanced); - LLabel_Init( &s->lblEnhanced[0], "&eEnables custom blocks, changing env", mode_lblEnhanced0); - LLabel_Init( &s->lblEnhanced[1], "&esettings, longer messages, and more", mode_lblEnhanced1); - - LButton_Init(&s->btnClassicHax, 145, 35, "Classic +hax", mode_btnClassicHax); - LLabel_Init( &s->lblClassicHax[0], "&eSame as Classic mode, except that", mode_lblClassicHax0); - LLabel_Init( &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", mode_lblClassicHax1); - - LButton_Init(&s->btnClassic, 145, 35, "Classic", mode_btnClassic); - LLabel_Init( &s->lblClassic[0], "&eOnly uses blocks and features from", mode_lblClassic0); - LLabel_Init( &s->lblClassic[1], "ðe original minecraft classic", mode_lblClassic1); - - LLabel_Init( &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", mode_lblHelp); - LButton_Init(&s->btnBack, 80, 35, "Back", mode_btnBack); + s->widgets = chooseMode_widgets; + s->maxWidgets = Array_Elems(chooseMode_widgets); + s->numWidgets = 0; + ChooseModeScreen_AddWidgets(s); s->btnEnhanced.OnClick = UseModeEnhanced; s->btnClassicHax.OnClick = UseModeClassicHax; @@ -244,18 +258,9 @@ static void ChooseModeScreen_Init(struct LScreen* s_) { s->btnBack.OnClick = SwitchToSettings; } -static void ChooseModeScreen_Show(struct LScreen* s_) { - struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; - - s->widgets[11] = s->firstTime ? - (struct LWidget*)&ChooseModeScreen.lblHelp : - (struct LWidget*)&ChooseModeScreen.btnBack; -} - void ChooseModeScreen_SetActive(cc_bool firstTime) { struct ChooseModeScreen* s = &ChooseModeScreen; LScreen_Reset((struct LScreen*)s); - s->Init = ChooseModeScreen_Init; s->Show = ChooseModeScreen_Show; s->firstTime = firstTime; @@ -278,18 +283,8 @@ static struct ColoursScreen { float colourAcc; } ColoursScreen; -static struct LWidget* colours_widgets[] = { - (struct LWidget*)&ColoursScreen.iptColours[ 0], (struct LWidget*)&ColoursScreen.iptColours[ 1], (struct LWidget*)&ColoursScreen.iptColours[ 2], - (struct LWidget*)&ColoursScreen.iptColours[ 3], (struct LWidget*)&ColoursScreen.iptColours[ 4], (struct LWidget*)&ColoursScreen.iptColours[ 5], - (struct LWidget*)&ColoursScreen.iptColours[ 6], (struct LWidget*)&ColoursScreen.iptColours[ 7], (struct LWidget*)&ColoursScreen.iptColours[ 8], - (struct LWidget*)&ColoursScreen.iptColours[ 9], (struct LWidget*)&ColoursScreen.iptColours[10], (struct LWidget*)&ColoursScreen.iptColours[11], - (struct LWidget*)&ColoursScreen.iptColours[12], (struct LWidget*)&ColoursScreen.iptColours[13], (struct LWidget*)&ColoursScreen.iptColours[14], - (struct LWidget*)&ColoursScreen.lblNames[0], (struct LWidget*)&ColoursScreen.lblNames[1], - (struct LWidget*)&ColoursScreen.lblNames[2], (struct LWidget*)&ColoursScreen.lblNames[3], - (struct LWidget*)&ColoursScreen.lblNames[4], - (struct LWidget*)&ColoursScreen.lblRGB[0], (struct LWidget*)&ColoursScreen.lblRGB[1], (struct LWidget*)&ColoursScreen.lblRGB[2], - (struct LWidget*)&ColoursScreen.btnBack, (struct LWidget*)&ColoursScreen.cbClassic -}; +#define COLOURSSCREEN_MAX_WIDGETS 25 +static struct LWidget* colours_widgets[COLOURSSCREEN_MAX_WIDGETS]; #define IptColor_Layout(xx, yy) { { ANCHOR_CENTRE, xx }, { ANCHOR_CENTRE, yy } } LAYOUTS clr_iptColours[15][2] = { @@ -405,26 +400,26 @@ static void ColoursScreen_Init(struct LScreen* s_) { struct ColoursScreen* s = (struct ColoursScreen*)s_; int i; s->widgets = colours_widgets; - s->numWidgets = Array_Elems(colours_widgets); + s->maxWidgets = Array_Elems(colours_widgets); for (i = 0; i < 5 * 3; i++) { s->iptColours[i].inputType = KEYBOARD_TYPE_INTEGER; s->iptColours[i].TextChanged = ColoursScreen_TextChanged; - LInput_Init(&s->iptColours[i], 55, NULL, clr_iptColours[i]); + LInput_Init(s, &s->iptColours[i], 55, NULL, clr_iptColours[i]); } - LLabel_Init( &s->lblNames[0], "Background", clr_lblNames0); - LLabel_Init( &s->lblNames[1], "Button border", clr_lblNames1); - LLabel_Init( &s->lblNames[2], "Button highlight", clr_lblNames2); - LLabel_Init( &s->lblNames[3], "Button", clr_lblNames3); - LLabel_Init( &s->lblNames[4], "Active button", clr_lblNames4); + LLabel_Init(s, &s->lblNames[0], "Background", clr_lblNames0); + LLabel_Init(s, &s->lblNames[1], "Button border", clr_lblNames1); + LLabel_Init(s, &s->lblNames[2], "Button highlight", clr_lblNames2); + LLabel_Init(s, &s->lblNames[3], "Button", clr_lblNames3); + LLabel_Init(s, &s->lblNames[4], "Active button", clr_lblNames4); - LLabel_Init( &s->lblRGB[0], "Red", clr_lblRGB0); - LLabel_Init( &s->lblRGB[1], "Green", clr_lblRGB1); - LLabel_Init( &s->lblRGB[2], "Blue", clr_lblRGB2); - LButton_Init(&s->btnBack, 80, 35, "Back", clr_btnBack); + LLabel_Init(s, &s->lblRGB[0], "Red", clr_lblRGB0); + LLabel_Init(s, &s->lblRGB[1], "Green", clr_lblRGB1); + LLabel_Init(s, &s->lblRGB[2], "Blue", clr_lblRGB2); + LButton_Init(s, &s->btnBack, 80, 35, "Back", clr_btnBack); - LCheckbox_Init(&s->cbClassic, "Classic style", clr_cbClassic); + LCheckbox_Init(s, &s->cbClassic, "Classic style", clr_cbClassic); s->cbClassic.ValueChanged = ColoursScreen_ToggleBG; s->btnBack.OnClick = SwitchToThemes; } @@ -461,11 +456,8 @@ static struct DirectConnectScreen { struct LLabel lblStatus; } DirectConnectScreen; -static struct LWidget* directConnect_widgets[] = { - (struct LWidget*)&DirectConnectScreen.iptUsername, (struct LWidget*)&DirectConnectScreen.iptAddress, - (struct LWidget*)&DirectConnectScreen.iptMppass, (struct LWidget*)&DirectConnectScreen.btnConnect, - (struct LWidget*)&DirectConnectScreen.btnBack, (struct LWidget*)&DirectConnectScreen.lblStatus -}; +#define DIRECTCONNECT_SCREEN_MAXWIDGETS 6 +static struct LWidget* directConnect_widgets[DIRECTCONNECT_SCREEN_MAXWIDGETS]; LAYOUTS dc_iptUsername[] = { { ANCHOR_CENTRE_MIN, -165 }, { ANCHOR_CENTRE, -120 } }; LAYOUTS dc_iptAddress[] = { { ANCHOR_CENTRE_MIN, -165 }, { ANCHOR_CENTRE, -75 } }; @@ -561,15 +553,15 @@ static void DirectConnectScreen_StartClient(void* w) { static void DirectConnectScreen_Init(struct LScreen* s_) { struct DirectConnectScreen* s = (struct DirectConnectScreen*)s_; s->widgets = directConnect_widgets; - s->numWidgets = Array_Elems(directConnect_widgets); + s->maxWidgets = Array_Elems(directConnect_widgets); - LInput_Init(&s->iptUsername, 330, "Username..", dc_iptUsername); - LInput_Init(&s->iptAddress, 330, "IP address:Port number..", dc_iptAddress); - LInput_Init(&s->iptMppass, 330, "Mppass..", dc_iptMppass); + LInput_Init(s, &s->iptUsername, 330, "Username..", dc_iptUsername); + LInput_Init(s, &s->iptAddress, 330, "IP address:Port number..", dc_iptAddress); + LInput_Init(s, &s->iptMppass, 330, "Mppass..", dc_iptMppass); - LButton_Init(&s->btnConnect, 110, 35, "Connect", dc_btnConnect); - LButton_Init(&s->btnBack, 80, 35, "Back", dc_btnBack); - LLabel_Init( &s->lblStatus, "", dc_lblStatus); + LButton_Init(s, &s->btnConnect, 110, 35, "Connect", dc_btnConnect); + LButton_Init(s, &s->btnBack, 80, 35, "Back", dc_btnBack); + LLabel_Init(s, &s->lblStatus, "", dc_lblStatus); s->iptUsername.ClipboardFilter = DirectConnectScreen_UrlFilter; s->iptAddress.ClipboardFilter = DirectConnectScreen_UrlFilter; @@ -603,10 +595,8 @@ static struct MFAScreen { struct LLabel lblTitle; } MFAScreen; -static struct LWidget* mfa_widgets[] = { - (struct LWidget*)&MFAScreen.lblTitle, (struct LWidget*)&MFAScreen.iptCode, - (struct LWidget*)&MFAScreen.btnSignIn, (struct LWidget*)&MFAScreen.btnCancel -}; +#define MFA_SCREEN_MAX_WIDGETS 4 +static struct LWidget* mfa_widgets[MFA_SCREEN_MAX_WIDGETS]; LAYOUTS mfa_lblTitle[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -115 } }; LAYOUTS mfa_iptCode[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -75 } }; @@ -627,12 +617,12 @@ static void MFAScreen_Cancel(void* w) { static void MFAScreen_Init(struct LScreen* s_) { struct MFAScreen* s = (struct MFAScreen*)s_; s->widgets = mfa_widgets; - s->numWidgets = Array_Elems(mfa_widgets); + s->maxWidgets = Array_Elems(mfa_widgets); - LLabel_Init( &s->lblTitle, "", mfa_lblTitle); - LInput_Init( &s->iptCode, 280, "Login code..", mfa_iptCode); - LButton_Init(&s->btnSignIn, 100, 35, "Sign in", mfa_btnSignIn); - LButton_Init(&s->btnCancel, 100, 35, "Cancel", mfa_btnCancel); + LLabel_Init(s, &s->lblTitle, "", mfa_lblTitle); + LInput_Init(s, &s->iptCode, 280, "Login code..", mfa_iptCode); + LButton_Init(s, &s->btnSignIn, 100, 35, "Sign in", mfa_btnSignIn); + LButton_Init(s, &s->btnCancel, 100, 35, "Cancel", mfa_btnCancel); s->btnSignIn.OnClick = MFAScreen_SignIn; s->btnCancel.OnClick = MFAScreen_Cancel; @@ -669,14 +659,8 @@ static struct MainScreen { cc_bool signingIn; } MainScreen; -static struct LWidget* main_widgets[] = { - (struct LWidget*)&MainScreen.iptUsername, (struct LWidget*)&MainScreen.iptPassword, - (struct LWidget*)&MainScreen.btnLogin, (struct LWidget*)&MainScreen.btnResume, - (struct LWidget*)&MainScreen.lblStatus, (struct LWidget*)&MainScreen.btnDirect, - (struct LWidget*)&MainScreen.btnSPlayer, (struct LWidget*)&MainScreen.btnRegister, - (struct LWidget*)&MainScreen.btnOptions, (struct LWidget*)&MainScreen.lblUpdate, - (struct LWidget*)&MainScreen.btnUpdates -}; +#define MAINSCREEN_MAX_WIDGETS 11 +static struct LWidget* main_widgets[MAINSCREEN_MAX_WIDGETS]; LAYOUTS main_iptUsername[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -120 } }; LAYOUTS main_iptPassword[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -75 } }; @@ -808,7 +792,7 @@ static void MainScreen_Init(struct LScreen* s_) { cc_string user, pass; char passBuffer[STRING_SIZE]; struct MainScreen* s = (struct MainScreen*)s_; s->widgets = main_widgets; - s->numWidgets = Array_Elems(main_widgets); + s->maxWidgets = Array_Elems(main_widgets); s->iptPassword.inputType = KEYBOARD_TYPE_PASSWORD; s->lblUpdate.small = true; @@ -817,22 +801,24 @@ static void MainScreen_Init(struct LScreen* s_) { #ifdef CC_BUILD_FLATPAK Updater_Supported = false; #endif - if (!Updater_Supported) s->numWidgets--; - LInput_Init( &s->iptUsername, 280, "Username..", main_iptUsername); - LInput_Init( &s->iptPassword, 280, "Password..", main_iptPassword); - LButton_Init(&s->btnLogin, 100, 35, "Sign in", main_btnLogin); - LButton_Init(&s->btnResume, 100, 35, "Resume", main_btnResume); + LInput_Init(s, &s->iptUsername, 280, "Username..", main_iptUsername); + LInput_Init(s, &s->iptPassword, 280, "Password..", main_iptPassword); + LButton_Init(s, &s->btnLogin, 100, 35, "Sign in", main_btnLogin); + LButton_Init(s, &s->btnResume, 100, 35, "Resume", main_btnResume); - LLabel_Init( &s->lblStatus, "", main_lblStatus); - LButton_Init(&s->btnDirect, 200, 35, "Direct connect", main_btnDirect); - LButton_Init(&s->btnSPlayer, 200, 35, "Singleplayer", main_btnSPlayer); + LLabel_Init(s, &s->lblStatus, "", main_lblStatus); + LButton_Init(s, &s->btnDirect, 200, 35, "Direct connect", main_btnDirect); + LButton_Init(s, &s->btnSPlayer, 200, 35, "Singleplayer", main_btnSPlayer); - LLabel_Init( &s->lblUpdate, "&eChecking..", + LLabel_Init(s, &s->lblUpdate, "&eChecking..", Updater_Supported ? main_lblUpdate_N : main_lblUpdate_H); - LButton_Init(&s->btnRegister, 100, 35, "Register", main_btnRegister); - LButton_Init(&s->btnOptions, 100, 35, "Options", main_btnOptions); - LButton_Init(&s->btnUpdates, 100, 35, "Updates", main_btnUpdates); + LButton_Init(s, &s->btnRegister, 100, 35, "Register", main_btnRegister); + LButton_Init(s, &s->btnOptions, 100, 35, "Options", main_btnOptions); + + if (Updater_Supported) { + LButton_Init(s, &s->btnUpdates, 100, 35, "Updates", main_btnUpdates); + } s->btnLogin.OnClick = MainScreen_Login; s->btnResume.OnClick = MainScreen_Resume; @@ -996,11 +982,8 @@ static struct CheckResourcesScreen { struct LButton btnYes, btnNo; } CheckResourcesScreen; -static struct LWidget* checkResources_widgets[] = { - (struct LWidget*)&CheckResourcesScreen.lblLine1, (struct LWidget*)&CheckResourcesScreen.lblLine2, - (struct LWidget*)&CheckResourcesScreen.lblStatus, (struct LWidget*)&CheckResourcesScreen.btnYes, - (struct LWidget*)&CheckResourcesScreen.btnNo -}; +#define CHECKRESOURCES_SCREEN_MAX_WIDGET 5 +static struct LWidget* checkResources_widgets[CHECKRESOURCES_SCREEN_MAX_WIDGET]; LAYOUTS cres_lblLine1[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -50 } }; LAYOUTS cres_lblLine2[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -30 } }; @@ -1023,15 +1006,15 @@ static void CheckResourcesScreen_Next(void* w) { static void CheckResourcesScreen_Init(struct LScreen* s_) { struct CheckResourcesScreen* s = (struct CheckResourcesScreen*)s_; s->widgets = checkResources_widgets; - s->numWidgets = Array_Elems(checkResources_widgets); + s->maxWidgets = Array_Elems(checkResources_widgets); s->lblStatus.small = true; - LLabel_Init( &s->lblLine1, "Some required resources weren't found", cres_lblLine1); - LLabel_Init( &s->lblLine2, "Okay to download?", cres_lblLine2); - LLabel_Init( &s->lblStatus, "", cres_lblStatus); + LLabel_Init(s, &s->lblLine1, "Some required resources weren't found", cres_lblLine1); + LLabel_Init(s, &s->lblLine2, "Okay to download?", cres_lblLine2); + LLabel_Init(s, &s->lblStatus, "", cres_lblStatus); - LButton_Init(&s->btnYes, 70, 35, "Yes", cres_btnYes); - LButton_Init(&s->btnNo, 70, 35, "No", cres_btnNo); + LButton_Init(s, &s->btnYes, 70, 35, "Yes", cres_btnYes); + LButton_Init(s, &s->btnNo, 70, 35, "No", cres_btnNo); s->btnYes.OnClick = CheckResourcesScreen_Yes; s->btnNo.OnClick = CheckResourcesScreen_Next; } @@ -1086,10 +1069,8 @@ static struct FetchResourcesScreen { struct LSlider sdrProgress; } FetchResourcesScreen; -static struct LWidget* fetchResources_widgets[] = { - (struct LWidget*)&FetchResourcesScreen.lblStatus, (struct LWidget*)&FetchResourcesScreen.btnCancel, - (struct LWidget*)&FetchResourcesScreen.sdrProgress -}; +#define FETCHRESOURCES_SCREEN_MAX_WIDGETS 3 +static struct LWidget* fetchResources_widgets[FETCHRESOURCES_SCREEN_MAX_WIDGETS]; LAYOUTS fres_lblStatus[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -10 } }; LAYOUTS fres_btnCancel[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 45 } }; @@ -1099,12 +1080,12 @@ LAYOUTS fres_sdrProgress[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 15 } }; static void FetchResourcesScreen_Init(struct LScreen* s_) { struct FetchResourcesScreen* s = (struct FetchResourcesScreen*)s_; s->widgets = fetchResources_widgets; - s->numWidgets = Array_Elems(fetchResources_widgets); + s->maxWidgets = Array_Elems(fetchResources_widgets); s->lblStatus.small = true; - LLabel_Init( &s->lblStatus, "", fres_lblStatus); - LButton_Init(&s->btnCancel, 120, 35, "Cancel", fres_btnCancel); - LSlider_Init(&s->sdrProgress, 200, 12, BitmapColor_RGB(0, 220, 0), fres_sdrProgress); + LLabel_Init(s, &s->lblStatus, "", fres_lblStatus); + LButton_Init(s, &s->btnCancel, 120, 35, "Cancel", fres_btnCancel); + LSlider_Init(s, &s->sdrProgress, 200, 12, BitmapColor_RGB(0, 220, 0), fres_sdrProgress); s->btnCancel.OnClick = CheckResourcesScreen_Next; } @@ -1188,11 +1169,7 @@ static struct ServersScreen { float tableAcc; } ServersScreen; -static struct LWidget* servers_widgets[] = { - (struct LWidget*)&ServersScreen.iptSearch, (struct LWidget*)&ServersScreen.iptHash, - (struct LWidget*)&ServersScreen.btnBack, (struct LWidget*)&ServersScreen.btnConnect, - (struct LWidget*)&ServersScreen.btnRefresh, (struct LWidget*)&ServersScreen.table -}; +static struct LWidget* servers_widgets[6]; LAYOUTS srv_iptSearch[] = { { ANCHOR_MIN, 10 }, { ANCHOR_MIN, 10 } }; LAYOUTS srv_iptHash[] = { { ANCHOR_MIN, 10 }, { ANCHOR_MAX, 10 } }; @@ -1266,14 +1243,14 @@ static void ServersScreen_ReloadServers(struct ServersScreen* s) { static void ServersScreen_Init(struct LScreen* s_) { struct ServersScreen* s = (struct ServersScreen*)s_; s->widgets = servers_widgets; - s->numWidgets = Array_Elems(servers_widgets); + s->maxWidgets = Array_Elems(servers_widgets); - LInput_Init( &s->iptSearch, 370, "Search servers..", srv_iptSearch); - LInput_Init( &s->iptHash, 475, "classicube.net/server/play/...", srv_iptHash); + LInput_Init(s, &s->iptSearch, 370, "Search servers..", srv_iptSearch); + LInput_Init(s, &s->iptHash, 475, "classicube.net/server/play/...", srv_iptHash); - LButton_Init(&s->btnBack, 110, 30, "Back", srv_btnBack); - LButton_Init(&s->btnConnect, 130, 30, "Connect", srv_btnConnect); - LButton_Init(&s->btnRefresh, 110, 30, "Refresh", srv_btnRefresh); + LButton_Init(s, &s->btnBack, 110, 30, "Back", srv_btnBack); + LButton_Init(s, &s->btnConnect, 130, 30, "Connect", srv_btnConnect); + LButton_Init(s, &s->btnRefresh, 110, 30, "Refresh", srv_btnRefresh); s->btnBack.OnClick = SwitchToMain; s->btnConnect.OnClick = ServersScreen_Connect; @@ -1284,7 +1261,7 @@ static void ServersScreen_Init(struct LScreen* s_) { s->iptHash.TextChanged = ServersScreen_HashChanged; s->iptHash.ClipboardFilter = ServersScreen_HashFilter; - LTable_Init(&s->table, srv_table); + LTable_Init(s, &s->table, srv_table); s->table.filter = &s->iptSearch.text; s->table.selectedHash = &s->iptHash.text; s->table.OnSelectedChanged = ServersScreen_OnSelectedChanged; @@ -1373,19 +1350,8 @@ static struct SettingsScreen { struct LLine sep; } SettingsScreen; -static struct LWidget* settings_widgets[] = { - (struct LWidget*)&SettingsScreen.sep, - (struct LWidget*)&SettingsScreen.btnMode, (struct LWidget*)&SettingsScreen.lblMode, - (struct LWidget*)&SettingsScreen.btnColours, (struct LWidget*)&SettingsScreen.lblColours, - (struct LWidget*)&SettingsScreen.cbExtra, (struct LWidget*)&SettingsScreen.cbEmpty, - (struct LWidget*)&SettingsScreen.cbScale, (struct LWidget*)&SettingsScreen.btnBack -}; -static struct LWidget* settings_classic[] = { - (struct LWidget*)&SettingsScreen.sep, - (struct LWidget*)&SettingsScreen.btnMode, (struct LWidget*)&SettingsScreen.lblMode, - (struct LWidget*)&SettingsScreen.cbExtra, (struct LWidget*)&SettingsScreen.cbEmpty, - (struct LWidget*)&SettingsScreen.cbScale, (struct LWidget*)&SettingsScreen.btnBack -}; +#define SETTINGS_SCREEN_MAX_WIDGETS 9 +static struct LWidget* settings_widgets[SETTINGS_SCREEN_MAX_WIDGETS]; LAYOUTS set_btnMode[] = { { ANCHOR_CENTRE, -135 }, { ANCHOR_CENTRE, -70 } }; LAYOUTS set_lblMode[] = { { ANCHOR_CENTRE_MIN, -70 }, { ANCHOR_CENTRE, -70 } }; @@ -1425,62 +1391,58 @@ static void SettingsScreen_DPIScaling(struct LCheckbox* w) { #endif } -static void SettingsScreen_Init(struct LScreen* s_) { - struct SettingsScreen* s = (struct SettingsScreen*)s_; - LLine_Init( &s->sep, 380, set_sep); +static void SettingsScreen_AddWidgets(struct SettingsScreen* s) { + LLine_Init(s, &s->sep, 380, set_sep); + LButton_Init(s, &s->btnMode, 110, 35, "Mode", set_btnMode); + LLabel_Init(s, &s->lblMode, "&eChange the enabled features", set_lblMode); - LButton_Init(&s->btnMode, 110, 35, "Mode", set_btnMode); - LLabel_Init( &s->lblMode, "&eChange the enabled features", set_lblMode); - - LButton_Init(&s->btnColours, 110, 35, "Theme", set_btnColours); - LLabel_Init( &s->lblColours, "&eChange how the launcher looks", set_lblColours); + if (!Options_GetBool(OPT_CLASSIC_MODE, false)) { + LButton_Init(s, &s->btnColours, 110, 35, "Theme", set_btnColours); + LLabel_Init(s, &s->lblColours, "&eChange how the launcher looks", set_lblColours); + } #if defined CC_BUILD_MOBILE - LCheckbox_Init(&s->cbExtra, "Force landscape", set_cbExtra); - s->cbExtra.ValueChanged = SettingsScreen_LockOrientation; + LCheckbox_Init(s, &s->cbExtra, "Force landscape", set_cbExtra); #else - LCheckbox_Init(&s->cbExtra, "Close this after game starts", set_cbExtra); - s->cbExtra.ValueChanged = SettingsScreen_AutoClose; + LCheckbox_Init(s, &s->cbExtra, "Close this after game starts", set_cbExtra); #endif - LCheckbox_Init(&s->cbEmpty, "Show empty servers in list", set_cbEmpty); - s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty; - LButton_Init( &s->btnBack, 80, 35, "Back", set_btnBack); - - - LCheckbox_Init(&s->cbScale, "Use display scaling", set_cbScale); - s->cbScale.ValueChanged = SettingsScreen_DPIScaling; - - s->btnMode.OnClick = SwitchToChooseMode; - s->btnColours.OnClick = SwitchToThemes; - s->btnBack.OnClick = SwitchToMain; + LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list", set_cbEmpty); + LCheckbox_Init(s, &s->cbScale, "Use display scaling", set_cbScale); + LButton_Init(s, &s->btnBack, 80, 35, "Back", set_btnBack); } static void SettingsScreen_Show(struct LScreen* s_) { struct SettingsScreen* s = (struct SettingsScreen*)s_; - if (Options_GetBool(OPT_CLASSIC_MODE, false)) { - s->widgets = settings_classic; - s->numWidgets = Array_Elems(settings_classic); - } else { - s->widgets = settings_widgets; - s->numWidgets = Array_Elems(settings_widgets); - } + s->widgets = settings_widgets; + s->maxWidgets = Array_Elems(settings_widgets); + s->numWidgets = 0; + SettingsScreen_AddWidgets(s); + + s->btnMode.OnClick = SwitchToChooseMode; + s->btnColours.OnClick = SwitchToThemes; + s->btnBack.OnClick = SwitchToMain; #if defined CC_BUILD_MOBILE + s->cbExtra.ValueChanged = SettingsScreen_LockOrientation; LCheckbox_Set(&s->cbExtra, Options_GetBool(OPT_LANDSCAPE_MODE, false)); #else + s->cbExtra.ValueChanged = SettingsScreen_AutoClose; LCheckbox_Set(&s->cbExtra, Options_GetBool(LOPT_AUTO_CLOSE, false)); #endif + + s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty; LCheckbox_Set(&s->cbEmpty, Launcher_ShowEmptyServers); + + s->cbScale.ValueChanged = SettingsScreen_DPIScaling; LCheckbox_Set(&s->cbScale, DisplayInfo.DPIScaling); } void SettingsScreen_SetActive(void) { struct SettingsScreen* s = &SettingsScreen; LScreen_Reset((struct LScreen*)s); - s->Init = SettingsScreen_Init; - s->Show = SettingsScreen_Show; + s->Show = SettingsScreen_Show; s->title = "Options"; s->onEscapeWidget = (struct LWidget*)&s->btnBack; @@ -1497,11 +1459,8 @@ static struct ThemesScreen { struct LButton btnCustom, btnBack; } ThemesScreen; -static struct LWidget* themes_widgets[] = { - (struct LWidget*)&ThemesScreen.btnModern, (struct LWidget*)&ThemesScreen.btnClassic, - (struct LWidget*)&ThemesScreen.btnNordic, (struct LWidget*)&ThemesScreen.btnCustom, - (struct LWidget*)&ThemesScreen.btnBack -}; +#define THEME_SCREEN_MAX_WIDGETS 5 +static struct LWidget* themes_widgets[THEME_SCREEN_MAX_WIDGETS]; LAYOUTS the_btnModern[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -120 } }; LAYOUTS the_btnClassic[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -70 } }; @@ -1526,16 +1485,16 @@ static void ThemesScreen_Nordic(void* w) { ThemesScreen_Set(&Launcher_NordicTheme); } -static void ThemesScreen_Init(struct LScreen* s_) { +static void ThemesScreen_Show(struct LScreen* s_) { struct ThemesScreen* s = (struct ThemesScreen*)s_; s->widgets = themes_widgets; - s->numWidgets = Array_Elems(themes_widgets); + s->maxWidgets = Array_Elems(themes_widgets); - LButton_Init(&s->btnModern, 200, 35, "Modern", the_btnModern); - LButton_Init(&s->btnClassic, 200, 35, "Classic", the_btnClassic); - LButton_Init(&s->btnNordic, 200, 35, "Nordic", the_btnNordic); - LButton_Init(&s->btnCustom, 200, 35, "Custom", the_btnCustom); - LButton_Init(&s->btnBack, 80, 35, "Back", the_btnBack); + LButton_Init(s, &s->btnModern, 200, 35, "Modern", the_btnModern); + LButton_Init(s, &s->btnClassic, 200, 35, "Classic", the_btnClassic); + LButton_Init(s, &s->btnNordic, 200, 35, "Nordic", the_btnNordic); + LButton_Init(s, &s->btnCustom, 200, 35, "Custom", the_btnCustom); + LButton_Init(s, &s->btnBack, 80, 35, "Back", the_btnBack); s->btnModern.OnClick = ThemesScreen_Modern; s->btnClassic.OnClick = ThemesScreen_Classic; @@ -1547,7 +1506,7 @@ static void ThemesScreen_Init(struct LScreen* s_) { void ThemesScreen_SetActive(void) { struct ThemesScreen* s = &ThemesScreen; LScreen_Reset((struct LScreen*)s); - s->Init = ThemesScreen_Init; + s->Show = ThemesScreen_Show; s->title = "Select theme"; s->onEscapeWidget = (struct LWidget*)&s->btnBack; @@ -1567,15 +1526,8 @@ static struct UpdatesScreen { cc_bool pendingFetch, release; } UpdatesScreen; -static struct LWidget* updates_widgets[] = { - (struct LWidget*)&UpdatesScreen.seps[0], (struct LWidget*)&UpdatesScreen.seps[1], - (struct LWidget*)&UpdatesScreen.lblYour, - (struct LWidget*)&UpdatesScreen.lblRel, (struct LWidget*)&UpdatesScreen.lblDev, - (struct LWidget*)&UpdatesScreen.lblStatus, (struct LWidget*)&UpdatesScreen.btnBack, - (struct LWidget*)&UpdatesScreen.lblInfo, - (struct LWidget*)&UpdatesScreen.btnRel[0], (struct LWidget*)&UpdatesScreen.btnDev[0], - (struct LWidget*)&UpdatesScreen.btnRel[1], (struct LWidget*)&UpdatesScreen.btnDev[1], -}; +#define UPDATESSCREEN_MAX_WIDGETS 12 +static struct LWidget* updates_widgets[UPDATESSCREEN_MAX_WIDGETS]; LAYOUTS upd_lblYour[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -120 } }; LAYOUTS upd_seps0[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -100 } }; @@ -1734,31 +1686,28 @@ static void UpdatesScreen_Init(struct LScreen* s_) { struct UpdatesScreen* s = (struct UpdatesScreen*)s_; int builds = Updater_Info.numBuilds; s->widgets = updates_widgets; - s->numWidgets = Array_Elems(updates_widgets); + s->maxWidgets = Array_Elems(updates_widgets); - if (Updater_Info.numBuilds < 2) s->numWidgets -= 2; - if (Updater_Info.numBuilds < 1) s->numWidgets -= 2; + LLine_Init(s, &s->seps[0], 320, upd_seps0); + LLine_Init(s, &s->seps[1], 320, upd_seps1); + LLabel_Init(s, &s->lblYour, "Your build: (unknown)", upd_lblYour); - LLabel_Init(&s->lblYour, "Your build: (unknown)", upd_lblYour); - LLine_Init( &s->seps[0], 320, upd_seps0); - LLine_Init( &s->seps[1], 320, upd_seps1); - - LLabel_Init( &s->lblRel, "Latest release: Checking..", upd_lblRel); - LLabel_Init( &s->lblDev, "Latest dev build: Checking..", upd_lblDev); - LLabel_Init( &s->lblStatus, "", upd_lblStatus); - LButton_Init(&s->btnBack, 80, 35, "Back", upd_btnBack); + LLabel_Init(s, &s->lblRel, "Latest release: Checking..", upd_lblRel); + LLabel_Init(s, &s->lblDev, "Latest dev build: Checking..", upd_lblDev); + LLabel_Init(s, &s->lblStatus, "", upd_lblStatus); + LButton_Init(s, &s->btnBack, 80, 35, "Back", upd_btnBack); + LLabel_Init(s, &s->lblInfo, Updater_Info.info, upd_lblInfo); if (builds >= 1) { - LButton_Init(&s->btnRel[0], 130, 35, Updater_Info.builds[0].name, + LButton_Init(s, &s->btnRel[0], 130, 35, Updater_Info.builds[0].name, builds == 1 ? upd_btnRel0_1 : upd_btnRel0_2); - LButton_Init(&s->btnDev[0], 130, 35, Updater_Info.builds[0].name, + LButton_Init(s, &s->btnDev[0], 130, 35, Updater_Info.builds[0].name, builds == 1 ? upd_btnDev0_1 : upd_btnDev0_2); } if (builds >= 2) { - LButton_Init(&s->btnRel[1], 130, 35, Updater_Info.builds[1].name, upd_btnRel1_2); - LButton_Init(&s->btnDev[1], 130, 35, Updater_Info.builds[1].name, upd_btnDev1_2); + LButton_Init(s, &s->btnRel[1], 130, 35, Updater_Info.builds[1].name, upd_btnRel1_2); + LButton_Init(s, &s->btnDev[1], 130, 35, Updater_Info.builds[1].name, upd_btnDev1_2); } - LLabel_Init(&s->lblInfo, Updater_Info.info, upd_lblInfo); s->btnRel[0].OnClick = UpdatesScreen_Rel_0; s->btnRel[1].OnClick = UpdatesScreen_Rel_1; diff --git a/src/LScreens.h b/src/LScreens.h index b53dac452..ee3c7b007 100644 --- a/src/LScreens.h +++ b/src/LScreens.h @@ -27,6 +27,7 @@ typedef void (*LScreen_Func)(struct LScreen* s); struct LWidget* hoveredWidget; /* Widget the mouse is currently hovering over. */ \ struct LWidget* selectedWidget; /* Widget mouse last clicked on. */ \ int numWidgets; /* Number of widgets actually used */ \ + int maxWidgets; /* Maximum number of widgets that can be added to the screen */ \ struct LWidget** widgets; /* Array of pointers to all the widgets in the screen */ \ const char* title; /* Titlebar text */ @@ -34,6 +35,7 @@ struct LScreen { LScreen_Layout }; void LScreen_SelectWidget(struct LScreen* s, int idx, struct LWidget* w, cc_bool was); void LScreen_UnselectWidget(struct LScreen* s, int idx, struct LWidget* w); +void LScreen_AddWidget(void* screen, void* widget); void ChooseModeScreen_SetActive(cc_bool firstTime); void ColoursScreen_SetActive(void); diff --git a/src/LWidgets.c b/src/LWidgets.c index 278e96e51..38617cbe2 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -113,13 +113,16 @@ static const struct LWidgetVTABLE lbutton_VTABLE = { LButton_Hover, LButton_Unhover, /* Hover */ LButton_OnSelect, LButton_OnUnselect /* Select */ }; -void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LLayout* layouts) { +void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text, + const struct LLayout* layouts) { w->VTABLE = &lbutton_VTABLE; w->type = LWIDGET_BUTTON; w->layouts = layouts; w->autoSelectable = true; + LBackend_ButtonInit(w, width, height); LButton_SetConst(w, text); + LScreen_AddWidget(screen, w); } void LButton_SetConst(struct LButton* w, const char* text) { @@ -142,7 +145,8 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = { NULL, NULL, /* Hover */ NULL, NULL /* Select */ }; -void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts) { +void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, + const struct LLayout* layouts) { w->VTABLE = &lcheckbox_VTABLE; w->type = LWIDGET_CHECKBOX; w->layouts = layouts; @@ -150,6 +154,7 @@ void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* w->text = String_FromReadonly(text); LBackend_CheckboxInit(w); + LScreen_AddWidget(screen, w); } void LCheckbox_Set(struct LCheckbox* w, cc_bool value) { @@ -314,7 +319,8 @@ static const struct LWidgetVTABLE linput_VTABLE = { LInput_Select, LInput_Unselect, /* Select */ NULL, LInput_TextChanged /* TextChanged */ }; -void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LLayout* layouts) { +void LInput_Init(void* screen, struct LInput* w, int width, const char* hintText, + const struct LLayout* layouts) { w->VTABLE = &linput_VTABLE; w->type = LWIDGET_INPUT; w->autoSelectable = true; @@ -325,6 +331,7 @@ void LInput_Init(struct LInput* w, int width, const char* hintText, const struct w->hintText = hintText; w->caretPos = -1; LBackend_InputInit(w, width); + LScreen_AddWidget(screen, w); } void LInput_SetText(struct LInput* w, const cc_string* text) { @@ -369,7 +376,8 @@ static const struct LWidgetVTABLE llabel_VTABLE = { NULL, NULL, /* Hover */ NULL, NULL /* Select */ }; -void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layouts) { +void LLabel_Init(void* screen, struct LLabel* w, const char* text, + const struct LLayout* layouts) { w->VTABLE = &llabel_VTABLE; w->type = LWIDGET_LABEL; w->layouts = layouts; @@ -377,6 +385,7 @@ void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layou String_InitArray(w->text, w->_textBuffer); LBackend_LabelInit(w); LLabel_SetConst(w, text); + LScreen_AddWidget(screen, w); } void LLabel_SetText(struct LLabel* w, const cc_string* text) { @@ -405,11 +414,14 @@ static const struct LWidgetVTABLE lline_VTABLE = { NULL, NULL, /* Hover */ NULL, NULL /* Select */ }; -void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts) { +void LLine_Init(void* screen, struct LLine* w, int width, + const struct LLayout* layouts) { w->VTABLE = &lline_VTABLE; w->type = LWIDGET_LINE; w->layouts = layouts; + LBackend_LineInit(w, width); + LScreen_AddWidget(screen, w); } #define CLASSIC_LINE_COLOR BitmapColor_RGB(128, 128, 128) @@ -432,13 +444,16 @@ static const struct LWidgetVTABLE lslider_VTABLE = { NULL, NULL, /* Hover */ NULL, NULL /* Select */ }; -void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts) { +void LSlider_Init(void* screen, struct LSlider* w, int width, int height, BitmapCol color, + const struct LLayout* layouts) { w->VTABLE = &lslider_VTABLE; w->type = LWIDGET_SLIDER; w->color = color; w->opaque = true; w->layouts = layouts; + LBackend_SliderInit(w, width, height); + LScreen_AddWidget(screen, w); } void LSlider_SetProgress(struct LSlider* w, int progress) { @@ -621,7 +636,8 @@ static const struct LWidgetVTABLE ltable_VTABLE = { LTable_MouseDown, LTable_MouseUp, /* Select */ LTable_MouseWheel, /* Wheel */ }; -void LTable_Init(struct LTable* w, const struct LLayout* layouts) { +void LTable_Init(void* screen, struct LTable* w, + const struct LLayout* layouts) { int i; w->VTABLE = <able_VTABLE; w->type = LWIDGET_TABLE; @@ -635,6 +651,7 @@ void LTable_Init(struct LTable* w, const struct LLayout* layouts) { w->columns[i].width = Display_ScaleX(w->columns[i].width); } LBackend_TableInit(w); + LScreen_AddWidget(screen, w); } void LTable_Reset(struct LTable* w) { diff --git a/src/LWidgets.h b/src/LWidgets.h index e83b81d47..88838a69d 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -69,7 +69,8 @@ struct LButton { cc_string text; int _textWidth, _textHeight; }; -CC_NOINLINE void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LLayout* layouts); +CC_NOINLINE void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text, + const struct LLayout* layouts); CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text); CC_NOINLINE void LButton_DrawBackground(struct Context2D* ctx, int x, int y, int width, int height, cc_bool active); @@ -80,7 +81,8 @@ struct LCheckbox { cc_string text; void (*ValueChanged)(struct LCheckbox* w); }; -CC_NOINLINE void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts); +CC_NOINLINE void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, + const struct LLayout* layouts); CC_NOINLINE void LCheckbox_Set(struct LCheckbox* w, cc_bool value); struct LInput; @@ -105,7 +107,8 @@ struct LInput { int _textHeight; char _textBuffer[STRING_SIZE]; }; -CC_NOINLINE void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LLayout* layouts); +CC_NOINLINE void LInput_Init(void* screen, struct LInput* w, int width, const char* hintText, + const struct LLayout* layouts); CC_NOINLINE void LInput_UNSAFE_GetText(struct LInput* w, cc_string* text); CC_NOINLINE void LInput_SetText(struct LInput* w, const cc_string* text); CC_NOINLINE void LInput_ClearText(struct LInput* w); @@ -123,7 +126,8 @@ struct LLabel { cc_string text; char _textBuffer[STRING_SIZE]; }; -CC_NOINLINE void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layouts); +CC_NOINLINE void LLabel_Init(void* screen, struct LLabel* w, const char* text, + const struct LLayout* layouts); CC_NOINLINE void LLabel_SetText(struct LLabel* w, const cc_string* text); CC_NOINLINE void LLabel_SetConst(struct LLabel* w, const char* text); @@ -132,7 +136,8 @@ struct LLine { LWidget_Layout int _width; }; -CC_NOINLINE void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts); +CC_NOINLINE void LLine_Init(void* screen, struct LLine* w, int width, + const struct LLayout* layouts); CC_NOINLINE BitmapCol LLine_GetColor(void); #define LLINE_HEIGHT 2 @@ -142,7 +147,8 @@ struct LSlider { int value, _width, _height; BitmapCol color; }; -CC_NOINLINE void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts); +CC_NOINLINE void LSlider_Init(void* screen, struct LSlider* w, int width, int height, BitmapCol color, + const struct LLayout* layouts); CC_NOINLINE void LSlider_SetProgress(struct LSlider* w, int progress); struct ServerInfo; @@ -213,7 +219,8 @@ struct LTableCell { struct LTable* table; int x, y, width; }; /* Initialises a table. */ /* NOTE: Must also call LTable_Reset to make a table actually useful. */ -void LTable_Init(struct LTable* table, const struct LLayout* layouts); +void LTable_Init(void* screen, struct LTable* table, + const struct LLayout* layouts); /* Resets state of a table (reset sorter, filter, etc) */ void LTable_Reset(struct LTable* table); /* Whether this table would handle the given key being pressed. */ diff --git a/src/_GraphicsBase.h b/src/_GraphicsBase.h index 0687cbbe8..0da828c53 100644 --- a/src/_GraphicsBase.h +++ b/src/_GraphicsBase.h @@ -236,7 +236,7 @@ void Gfx_RestoreAlphaState(cc_uint8 draw) { } -static float Reversed_CalcZNear(float fov, int depthbufferBits) { +static CC_INLINE float Reversed_CalcZNear(float fov, int depthbufferBits) { /* With reversed z depth, near Z plane can be much closer (with sufficient depth buffer precision) */ /* This reduces clipping with high FOV without sacrificing depth precision for faraway objects */ /* However for low FOV, don't reduce near Z in order to gain a bit more depth precision */ @@ -266,7 +266,7 @@ static void CopyTextureData(void* dst, int dstStride, const struct Bitmap* src, /* Quoted from http://www.realtimerendering.com/blog/gpus-prefer-premultiplication/ */ /* The short version: if you want your renderer to properly handle textures with alphas when using */ /* bilinear interpolation or mipmapping, you need to premultiply your PNG color data by their (unassociated) alphas. */ -static BitmapCol AverageCol(BitmapCol p1, BitmapCol p2) { +static BitmapCol AverageColor(BitmapCol p1, BitmapCol p2) { cc_uint32 a1, a2, aSum; cc_uint32 b1, g1, r1; cc_uint32 b2, g2, r2; @@ -298,7 +298,7 @@ static void GenMipmaps(int width, int height, BitmapCol* dst, BitmapCol* src, in if (srcWidth == 1) { for (y = 0; y < height; y++) { /* 1x2 bilinear filter */ - dst[0] = AverageCol(*src, *(src + srcWidth)); + dst[0] = AverageColor(*src, *(src + srcWidth)); dst += width; src += (srcWidth << 1); @@ -313,9 +313,9 @@ static void GenMipmaps(int width, int height, BitmapCol* dst, BitmapCol* src, in for (x = 0; x < width; x++) { int srcX = (x << 1); /* 2x2 bilinear filter */ - BitmapCol ave0 = AverageCol(src0[srcX], src0[srcX + 1]); - BitmapCol ave1 = AverageCol(src1[srcX], src1[srcX + 1]); - dst[x] = AverageCol(ave0, ave1); + BitmapCol ave0 = AverageColor(src0[srcX], src0[srcX + 1]); + BitmapCol ave1 = AverageColor(src1[srcX], src1[srcX + 1]); + dst[x] = AverageColor(ave0, ave1); } src += (srcWidth << 1); dst += width;