diff --git a/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs index 40b80d4eb..a1e242ff5 100644 --- a/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs @@ -87,22 +87,13 @@ namespace ClassicalSharp.Gui.Screens { void HandleFontChange() { int selIndex = IndexOfWidget(selectedButton); game.Events.RaiseChatFontChanged(); - base.Dispose(); - base.Init(); + Recreate(); game.Gui.RefreshHud(); - for (int i = 0; i < widgets.Length; i++) { - if (widgets[i] == null || !(widgets[i] is ButtonWidget)) { - widgets[i] = null; continue; - } - - ButtonWidget btn = widgets[i] as ButtonWidget; - btn.font = titleFont; - btn.SetText(btn.Text); - } - - if (selIndex >= 0) + if (selIndex >= 0) { selectedButton = (ButtonWidget)widgets[selIndex]; + if (selectedButton != null) selectedButton.Active = true; + } } void MakeValidators() { diff --git a/src/Client/Entity.c b/src/Client/Entity.c index c6a4889fb..e4209bf9f 100644 --- a/src/Client/Entity.c +++ b/src/Client/Entity.c @@ -419,14 +419,15 @@ void TabList_Set(EntityID id, STRING_PURE String* player, STRING_PURE String* li TabList_GroupRanks[id] = rank; } -void TabList_Init(void) { StringBuffers_Init(&TabList_Buffer); } +void TabList_Init(void) { StringsBuffer_Init(&TabList_Buffer); } void TabList_Free(void) { StringsBuffer_Free(&TabList_Buffer); } void TabList_Reset(void) { Platform_MemSet(TabList_PlayerNames, 0, sizeof(TabList_PlayerNames)); Platform_MemSet(TabList_ListNames, 0, sizeof(TabList_ListNames)); Platform_MemSet(TabList_GroupNames, 0, sizeof(TabList_GroupNames)); Platform_MemSet(TabList_GroupRanks, 0, sizeof(TabList_GroupRanks)); - TabList_Buffer.Count = 0; /* TODO: Should we be freeing the buffer here? */ + /* TODO: Should we be trying to free the buffer here? */ + StringsBuffer_UNSAFE_Reset(&TabList_Buffer); } IGameComponent TabList_MakeComponent(void) { diff --git a/src/Client/Hotkeys.c b/src/Client/Hotkeys.c index 755d7d415..89bc1db70 100644 --- a/src/Client/Hotkeys.c +++ b/src/Client/Hotkeys.c @@ -111,7 +111,7 @@ bool Hotkeys_IsHotkey(Key key, STRING_TRANSIENT String* text, bool* moreInput) { } void Hotkeys_Init(void) { - StringBuffers_Init(&HotkeysText); + StringsBuffer_Init(&HotkeysText); String prefix = String_FromConst("hotkey-"); UInt32 i; for (i = 0; i < Options_Keys.Count; i++) { diff --git a/src/Client/Options.c b/src/Client/Options.c index 137c19c2c..527dd191e 100644 --- a/src/Client/Options.c +++ b/src/Client/Options.c @@ -6,8 +6,8 @@ #define OPT_NOT_FOUND UInt32_MaxValue void Options_Init(void) { - StringBuffers_Init(&Options_Keys); - StringBuffers_Init(&Options_Values); + StringsBuffer_Init(&Options_Keys); + StringsBuffer_Init(&Options_Values); } void Options_Free(void) { diff --git a/src/Client/Screens.c b/src/Client/Screens.c index 3612987b6..a896ea038 100644 --- a/src/Client/Screens.c +++ b/src/Client/Screens.c @@ -652,7 +652,7 @@ void FilesScreen_OnResize(Screen* elem) { Screen* FilesScreen_MakeInstance(void) { FilesScreen* screen = &FilesScreen_Instance; Platform_MemSet(&screen, 0, sizeof(FilesScreen) - sizeof(StringsBuffer)); - screen->Entries.Count = 0; + StringsBuffer_UNSAFE_Reset(&screen->Entries); Screen_Reset(&screen->Base); screen->Base.Base.HandlesKeyDown = FilesScreen_HandlesKeyDown; diff --git a/src/Client/String.c b/src/Client/String.c index 51f539ec6..8eeafd927 100644 --- a/src/Client/String.c +++ b/src/Client/String.c @@ -418,16 +418,16 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value) { #define STRINGSBUFFER_LEN_SHIFT 10 #define STRINGSBUFFER_LEN_MASK 0x3FFUL -void StringBuffers_Init(StringsBuffer* buffer) { - buffer->Count = 0; +void StringsBuffer_Init(StringsBuffer* buffer) { + StringsBuffer_UNSAFE_Reset(buffer); buffer->TextBuffer = buffer->DefaultBuffer; buffer->FlagsBuffer = buffer->DefaultFlags; - buffer->TextBufferSize = STRINGSBUFFER_BUFFER_DEF_SIZE; + buffer->TextBufferElems = STRINGSBUFFER_BUFFER_DEF_SIZE; buffer->FlagsBufferElems = STRINGSBUFFER_FLAGS_DEF_ELEMS; } void StringsBuffer_Free(StringsBuffer* buffer) { - if (buffer->TextBufferSize > STRINGSBUFFER_BUFFER_DEF_SIZE) { + if (buffer->TextBufferElems > STRINGSBUFFER_BUFFER_DEF_SIZE) { Platform_MemFree(buffer->TextBuffer); } if (buffer->FlagsBufferElems > STRINGSBUFFER_FLAGS_DEF_ELEMS) { @@ -435,6 +435,11 @@ void StringsBuffer_Free(StringsBuffer* buffer) { } } +void StringsBuffer_UNSAFE_Reset(StringsBuffer* buffer) { + buffer->Count = 0; + buffer->UsedElems = 0; +} + void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text) { String raw = StringsBuffer_UNSAFE_Get(buffer, index); String_Clear(text); @@ -479,29 +484,25 @@ void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text) { StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curElemSize, newElemsSize, reallocingElems); } - UInt32 textOffset = 0; - if (buffer->Count > 0) { - UInt32 lastFlags = buffer->FlagsBuffer[buffer->Count - 1]; - UInt32 lastOffset = lastFlags >> STRINGSBUFFER_LEN_SHIFT; - UInt32 lastLen = lastFlags & STRINGSBUFFER_LEN_MASK; - textOffset = lastOffset + lastLen; - } - - if (textOffset + text->length >= buffer->TextBufferSize) { - UInt32 curTextSize = buffer->TextBufferSize; - UInt32 newTextSize = buffer->TextBufferSize + STRINGSBUFFER_BUFFER_EXPAND_SIZE; - bool reallocingText = buffer->TextBufferSize > STRINGSBUFFER_BUFFER_DEF_SIZE; - StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curTextSize, newTextSize, reallocingText); - } - if (text->length > STRINGSBUFFER_LEN_MASK) { ErrorHandler_Fail("String too big to insert into StringsBuffer"); } + + UInt32 textOffset = buffer->UsedElems; + if (textOffset + text->length >= buffer->TextBufferElems) { + UInt32 curTextSize = buffer->TextBufferElems; + UInt32 newTextSize = buffer->TextBufferElems + STRINGSBUFFER_BUFFER_EXPAND_SIZE; + bool reallocingText = buffer->TextBufferElems > STRINGSBUFFER_BUFFER_DEF_SIZE; + StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curTextSize, newTextSize, reallocingText); + } + if (text->length > 0) { Platform_MemCpy(&buffer->TextBuffer[textOffset], text->buffer, text->length); } buffer->FlagsBuffer[buffer->Count] = text->length | (textOffset << STRINGSBUFFER_LEN_SHIFT); + buffer->Count++; + buffer->UsedElems += text->length; } void StringsBuffer_Remove(StringsBuffer* buffer, UInt32 index) { @@ -511,19 +512,17 @@ void StringsBuffer_Remove(StringsBuffer* buffer, UInt32 index) { UInt32 offset = flags >> STRINGSBUFFER_LEN_SHIFT; UInt32 len = flags & STRINGSBUFFER_LEN_MASK; - UInt32 lastFlags = buffer->FlagsBuffer[buffer->Count - 1]; - UInt32 lastOffset = lastFlags >> STRINGSBUFFER_LEN_SHIFT; - UInt32 lastLen = lastFlags & STRINGSBUFFER_LEN_MASK; - - /* Imagine buffer is this: XXYYYYZZZ, and want to delete X */ + /* Imagine buffer is this: AAXXYYZZ, and want to delete X */ /* Start points to first character of Y */ - /* End points to last character of Z */ - UInt32 i, start = offset + len, end = lastOffset + lastLen; + /* End points to character past last character of Z */ + UInt32 i, start = offset + len, end = buffer->UsedElems; for (i = start; i < end; i++) { buffer->TextBuffer[i - len] = buffer->TextBuffer[i]; } for (i = index; i < buffer->Count; i++) { buffer->FlagsBuffer[i] = buffer->FlagsBuffer[i + 1]; } + buffer->Count--; + buffer->UsedElems -= len; } \ No newline at end of file diff --git a/src/Client/String.h b/src/Client/String.h index 9bf4e9e72..7fc8b0419 100644 --- a/src/Client/String.h +++ b/src/Client/String.h @@ -85,17 +85,17 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value); #define STRINGSBUFFER_FLAGS_DEF_ELEMS 256 #define STRINGSBUFFER_FLAGS_EXPAND_ELEMS 512 typedef struct StringsBuffer_ { - UInt8* TextBuffer; - UInt32 TextBufferSize; + UInt8* TextBuffer; UInt32* FlagsBuffer; - UInt32 FlagsBufferElems; - UInt32 Count; + UInt32 TextBufferElems, FlagsBufferElems; + UInt32 Count, UsedElems; UInt8 DefaultBuffer[STRINGSBUFFER_BUFFER_DEF_SIZE]; UInt32 DefaultFlags[STRINGSBUFFER_FLAGS_DEF_ELEMS]; } StringsBuffer; -void StringBuffers_Init(StringsBuffer* buffer); +void StringsBuffer_Init(StringsBuffer* buffer); void StringsBuffer_Free(StringsBuffer* buffer); +void StringsBuffer_UNSAFE_Reset(StringsBuffer* buffer); void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text); STRING_REF String StringsBuffer_UNSAFE_Get(StringsBuffer* buffer, UInt32 index); void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text);