C funcs to create/delete fonts.

This commit is contained in:
UnknownShadow200 2017-10-20 11:57:48 +11:00
parent 3049822462
commit a69a285222
14 changed files with 110 additions and 45 deletions

View File

@ -26,7 +26,7 @@ namespace ClassicalSharp.Gui.Screens {
void InitTableWidget() {
table = new TableWidget(game);
table.font = font;
table.ElementsPerRow = game.ClassicMode && !game.ClassicHacks ? 9 : 10;
table.ElementsPerRow = game.PureClassic ? 9 : 10;
table.Init();
}

View File

@ -341,7 +341,7 @@ namespace ClassicalSharp.Network {
public object Data;
/// <summary> Point in time the item most recently cached. (if at all) </summary>
public DateTime LastModified;
public DateTime LastModified;
/// <summary> ETag of the item most recently cached. (if any) </summary>
public string ETag;

View File

@ -49,4 +49,9 @@
#define SkinType_64x64 1
#define SkinType_64x64Slim 2
#define SkinType_Invalid 3
#define FONT_STYLE_NORMAL 0
#define FONT_STYLE_ITALIC 1
#define FONT_STYLE_BOLD 2
#define FONT_STYLE_UNDERLINE 3
#endif

View File

@ -4,9 +4,9 @@
#include "Platform.h"
#include "ExtMath.h"
void DrawTextArgs_Make(DrawTextArgs* args, STRING_REF String* text, void* font, bool useShadow) {
void DrawTextArgs_Make(DrawTextArgs* args, STRING_REF String* text, FontDesc* font, bool useShadow) {
args->Text = *text;
args->Font = font;
args->Font = *font;
args->UseShadow = useShadow;
}
@ -113,7 +113,7 @@ void Drawer2D_Clear(PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height)
void Drawer2D_DrawText(DrawTextArgs* args, Int32 x, Int32 y);
Size2D Drawer2D_MeasureText(DrawTextArgs* args);
Int32 Drawer2D_FontHeight(void* font, bool useShadow) {
Int32 Drawer2D_FontHeight(FontDesc* font, bool useShadow) {
DrawTextArgs args;
String text = String_FromConstant("I");
DrawTextArgs_Make(&args, &text, font, useShadow);

View File

@ -10,13 +10,7 @@ Copyright 2017 ClassicalSharp | Licensed under BSD-3
#include "2DStructs.h"
#include "Texture.h"
/* Contains arguments for measuring or drawing text. */
typedef struct DrawTextArgs_ {
String Text;
void* Font;
bool UseShadow;
} DrawTextArgs;
void DrawTextArgs_Make(DrawTextArgs* args, STRING_REF String* text, void* font, bool useShadow);
void DrawTextArgs_Make(DrawTextArgs* args, STRING_REF String* text, FontDesc* font, bool useShadow);
const float Offset = 1.3f;
@ -42,7 +36,7 @@ void Drawer2D_Clear(PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
void Drawer2D_DrawText(DrawTextArgs* args, Int32 x, Int32 y);
Size2D Drawer2D_MeasureText(DrawTextArgs* args);
Int32 Drawer2D_FontHeight(void* font, bool useShadow);
Int32 Drawer2D_FontHeight(FontDesc* font, bool useShadow);
Texture Drawer2D_MakeTextTexture(DrawTextArgs* args, Int32 windowX, Int32 windowY);
Texture Drawer2D_Make2DTexture(Bitmap* bmp, Size2D used, Int32 windowX, Int32 windowY);

View File

@ -56,4 +56,9 @@ UInt32 Platform_FileLength(void* file);
/* Blocks the calling thread for given number of milliseconds. */
void Platform_ThreadSleep(UInt32 milliseconds);
/* Allocates handle for the given font. */
void Platform_MakeFont(FontDesc* desc);
/* Frees handle for the given font. */
void Platform_FreeFont(FontDesc* desc);
#endif

View File

@ -1,5 +1,7 @@
#include "Screens.h"
#include "Widgets.h"
#include "Game.h"
#include "Events.h"
void Screen_FreeWidgets(Widget** widgets, UInt32 widgetsCount) {
if (widgets == NULL) return;
@ -80,4 +82,4 @@ void ClickableScreen_Create(ClickableScreen* screen) {
screen->LastX = -1; screen->LastY = -1;
screen->OnWidgetSelected = ClickableScreen_DefaultWidgetSelected;
}
}

View File

@ -157,7 +157,7 @@ bool String_AppendConst(STRING_TRANSIENT String* str, const UInt8* buffer) {
return true;
}
bool String_AppendString(STRING_TRANSIENT String* str, String* buffer) {
bool String_AppendString(STRING_TRANSIENT String* str, STRING_TRANSIENT String* buffer) {
Int32 i;
for (i = 0; i < buffer->length; i++) {
@ -184,10 +184,39 @@ Int32 String_LastIndexOf(STRING_TRANSIENT String* str, UInt8 c) {
}
UInt8 String_CharAt(STRING_TRANSIENT String* str, Int32 offset) {
if (offset < 0 || offset >= str->length) return 0;
if (offset < 0 || offset >= str->length) return NULL;
return str->buffer[offset];
}
void String_InsertAt(STRING_TRANSIENT String* str, UInt8 c, Int32 offset) {
if (offset < 0 || offset > str->length) {
ErrorHandler_Fail("Offset for InsertAt out of range");
}
if (str->length == str->capacity) {
ErrorHandler_Fail("Cannot insert character into full string");
}
Int32 i;
for (i = str->length; i > offset; i--) {
str->buffer[i] = str->buffer[i - 1];
}
str->buffer[offset] = c;
str->length++;
}
void String_DeleteAt(STRING_TRANSIENT String* str, Int32 offset) {
if (offset < 0 || offset >= str->length) {
ErrorHandler_Fail("Offset for DeleteAt out of range");
}
Int32 i;
for (i = offset; i < str->length - 1; i++) {
str->buffer[i] = str->buffer[i + 1];
}
str->buffer[str->length - 1] = NULL;
str->length--;
}
Int32 String_IndexOfString(STRING_TRANSIENT String* str, STRING_TRANSIENT String* sub) {
Int32 i, j;
/* Special case, sub is an empty string*/

View File

@ -63,6 +63,10 @@ Int32 String_IndexOf(STRING_TRANSIENT String* str, UInt8 c, Int32 offset);
Int32 String_LastIndexOf(STRING_TRANSIENT String* str, UInt8 c);
/* Gets the character at the given index in the string. */
UInt8 String_CharAt(STRING_TRANSIENT String* str, Int32 offset);
/* Inserts a character at the given index in the string. */
void String_InsertAt(STRING_TRANSIENT String* str, UInt8 c, Int32 offset);
/* Deletes a character at the given index in the string. */
void String_DeleteAt(STRING_TRANSIENT String* str, Int32 offset);
/* Find the first index of sub in given string, -1 if not found. */
Int32 String_IndexOfString(STRING_TRANSIENT String* str, STRING_TRANSIENT String* sub);

View File

@ -45,6 +45,9 @@ typedef UInt8 Face;
/* Skin layout a humanoid skin texture can have. */
typedef UInt8 SkinType;
typedef struct FontDesc_ { void* Handle; UInt16 Size, Style; } FontDesc;
typedef struct DrawTextArgs_ { String Text; FontDesc Font; bool UseShadow; } DrawTextArgs;
#define UInt8_MaxValue ((UInt8)0xFF)
#define Int16_MaxValue ((Int16)0x7FFF)
#define UInt16_MaxValue ((UInt16)0xFFFF)

View File

@ -18,7 +18,7 @@ void Widget_SetLocation(Widget* widget, Anchor horAnchor, Anchor verAnchor, Int3
void TextWidget_SetHeight(TextWidget* widget, Int32 height) {
if (widget->ReducePadding) {
Drawer2D_ReducePadding_Height(&height, font.Size, 4);
Drawer2D_ReducePadding_Height(&height, widget->Font.Size, 4);
}
widget->DefaultHeight = height;
widget->Base.Height = height;
@ -26,7 +26,7 @@ void TextWidget_SetHeight(TextWidget* widget, Int32 height) {
void TextWidget_Init(GuiElement* elem) {
TextWidget* widget = (TextWidget*)elem;
Int32 height = Drawer2D_FontHeight(widget->Font, true);
Int32 height = Drawer2D_FontHeight(&widget->Font, true);
TextWidget_SetHeight(widget, height);
}
@ -50,11 +50,11 @@ void TextWidget_Reposition(Widget* elem) {
widget->Texture.Y += elem->Y - oldY;
}
void TextWidget_Create(TextWidget* widget, STRING_TRANSIENT String* text, void* font) {
void TextWidget_Create(TextWidget* widget, STRING_TRANSIENT String* text, FontDesc* font) {
Widget_Init(&widget->Base);
PackedCol col = PACKEDCOL_WHITE;
widget->Col = col;
widget->Font = font;
widget->Font = *font;
widget->Base.Reposition = TextWidget_Reposition;
widget->Base.Base.Init = TextWidget_Init;
widget->Base.Base.Render = TextWidget_Render;
@ -69,10 +69,10 @@ void TextWidget_SetText(TextWidget* widget, STRING_TRANSIENT String* text) {
elem->Width = 0; elem->Height = widget->DefaultHeight;
} else {
DrawTextArgs args;
DrawTextArgs_Make(&args, text, widget->Font, true);
DrawTextArgs_Make(&args, text, &widget->Font, true);
widget->Texture = Drawer2D_MakeTextTexture(&args, 0, 0);
if (widget->ReducePadding) {
Drawer2D_ReducePadding_Tex(&widget->Texture, font.Size, 4);
Drawer2D_ReducePadding_Tex(&widget->Texture, widget->Font.Size, 4);
}
elem->Width = widget->Texture.Width; elem->Height = widget->Texture.Height;
@ -91,7 +91,7 @@ PackedCol Button_DisabledCol = PACKEDCOL_CONST(160, 160, 160, 255);
void ButtonWidget_Init(GuiElement* elem) {
ButtonWidget* widget = (ButtonWidget*)elem;
widget->DefaultHeight = Drawer2D_FontHeight(widget->Font, true);
widget->DefaultHeight = Drawer2D_FontHeight(&widget->Font, true);
widget->Base.Height = widget->DefaultHeight;
}
@ -143,14 +143,14 @@ void ButtonWidget_Render(GuiElement* elem, Real64 delta) {
Texture_RenderShaded(&widget->Texture, col);
}
void ButtonWidget_Create(ButtonWidget* widget, STRING_TRANSIENT String* text, Int32 minWidth, void* font, Gui_MouseHandler onClick) {
void ButtonWidget_Create(ButtonWidget* widget, STRING_TRANSIENT String* text, Int32 minWidth, FontDesc* font, Gui_MouseHandler onClick) {
Widget_Init(&widget->Base);
widget->Base.Base.Init = ButtonWidget_Init;
widget->Base.Base.Render = ButtonWidget_Render;
widget->Base.Base.Free = ButtonWidget_Free;
widget->Base.Reposition = ButtonWidget_Reposition;
widget->Font = font;
widget->Font = *font;
GuiElement* elem = &widget->Base.Base;
elem->Init(elem);
widget->MinWidth = minWidth; widget->MinHeight = 40;
@ -166,7 +166,7 @@ void ButtonWidget_SetText(ButtonWidget* widget, STRING_TRANSIENT String* text) {
elem->Width = 0; elem->Height = widget->DefaultHeight;
} else {
DrawTextArgs args;
DrawTextArgs_Make(&args, text, widget->Font, true);
DrawTextArgs_Make(&args, text, &widget->Font, true);
widget->Texture = Drawer2D_MakeTextTexture(&args, 0, 0);
elem->Width = max(widget->Texture.Width, widget->MinWidth);
elem->Height = max(widget->Texture.Height, widget->MinHeight);
@ -571,7 +571,7 @@ void TableWidget_RecreateDescTex(TableWidget* widget) {
TableWidget_MakeBlockDesc(&desc, block);
DrawTextArgs args;
DrawTextArgs_Make(&args, &desc, widget->Font, true);
DrawTextArgs_Make(&args, &desc, &widget->Font, true);
widget->DescTex = Drawer2D_MakeTextTexture(&args, 0, 0);
TableWidget_UpdateDescTexPos(widget);
}

View File

@ -16,13 +16,13 @@ typedef struct TextWidget_ {
Widget Base;
Texture Texture;
Int32 DefaultHeight;
void* Font;
FontDesc Font;
bool ReducePadding;
PackedCol Col;
} TextWidget;
void TextWidget_Create(TextWidget* widget, STRING_TRANSIENT String* text, void* font);
void TextWidget_Create(TextWidget* widget, STRING_TRANSIENT String* text, FontDesc* font);
void TextWidget_SetText(TextWidget* widget, STRING_TRANSIENT String* text);
@ -33,7 +33,7 @@ typedef struct ButtonWidget_ {
Widget Base;
Texture Texture;
Int32 DefaultHeight;
void* Font;
FontDesc Font;
String OptName;
ButtonWidget_GetValue GetValue;
@ -41,7 +41,7 @@ typedef struct ButtonWidget_ {
Int32 MinWidth, MinHeight, Metadata;
} ButtonWidget;
void ButtonWidget_Create(ButtonWidget* widget, STRING_TRANSIENT String* text, Int32 minWidth, void* font, Gui_MouseHandler onClick);
void ButtonWidget_Create(ButtonWidget* widget, STRING_TRANSIENT String* text, Int32 minWidth, FontDesc* font, Gui_MouseHandler onClick);
void ButtonWidget_SetText(ButtonWidget* widget, STRING_TRANSIENT String* text);
@ -49,8 +49,8 @@ typedef struct ScrollbarWidget_ {
Widget Base;
Int32 TotalRows, ScrollY;
Real32 ScrollingAcc;
bool DraggingMouse;
Int32 MouseOffset;
bool DraggingMouse;
} ScrollbarWidget;
void ScrollbarWidget_Create(ScrollbarWidget* widget);
@ -62,8 +62,8 @@ typedef struct HotbarWidget_ {
Texture SelTex, BackTex;
Real32 BarHeight, SelBlockSize, ElemSize;
Real32 BarXOffset, BorderSize;
bool AltHandled;
Real32 ScrollAcc;
bool AltHandled;
} HotbarWidget;
void HotbarWidget_Create(HotbarWidget* widget);
@ -73,11 +73,11 @@ typedef struct TableWidget_ {
Widget Base;
Int32 ElementsCount, ElementsPerRow, RowsCount;
Int32 LastCreatedIndex;
void* Font;
bool PendingClose;
FontDesc Font;
Int32 SelectedIndex, BlockSize;
Real32 SelBlockExpand;
GfxResourceID VB;
bool PendingClose;
BlockID Elements[BLOCK_COUNT];
ScrollbarWidget Scroll;
@ -103,13 +103,13 @@ void SpecialInputTab_Init(SpecialInputTab* tab, STRING_REF String* title,
typedef struct SpecialInputWidget_ {
Widget Base;
Texture Tex;
void* Font;
FontDesc Font;
SpecialInputAppendFunc AppendFunc;
Size2D ElementSize;
SpecialInputTab Tabs[5];
} SpecialInputWidget;
void SpecialInputWidget_Create(SpecialInputWidget* widget, void* font, SpecialInputAppendFunc appendFunc);
void SpecialInputWidget_Create(SpecialInputWidget* widget, FontDesc* font, SpecialInputAppendFunc appendFunc);
void SpecialInputWidget_UpdateColours(SpecialInputWidget* widget);
void SpecialInputWidget_SetActive(SpecialInputWidget* widget, bool active);
void SpecialInputWidget_Redraw(SpecialInputWidget* widget);
@ -120,7 +120,7 @@ struct InputWidget_;
/* Remakes the raw texture containing all the chat lines. Also updates the dimensions of the widget. */
typedef struct InputWidget_ {
Widget Base;
void* Font;
FontDesc Font;
Int32 MaxLines;
Int32 MaxCharsPerLine;
Int32 Padding;
@ -144,7 +144,7 @@ typedef struct InputWidget_ {
Real64 CaretAccumulator;
} InputWidget;
void InputWidget_Create(InputWidget* widget, void* font);
void InputWidget_Create(InputWidget* widget, FontDesc* font);
/* Calculates the sizes of each line in the text buffer. */
void InputWidget_CalculateLineSizes(InputWidget* widget);
/* Calculates the location and size of the caret character. */
@ -176,15 +176,14 @@ typedef struct LinkData_ {
typedef struct TextGroupWidget_ {
Widget Base;
Int32 LinesCount, DefaultHeight;
void* Font;
void* UnderlineFont;
FontDesc Font, UnderlineFont;
bool PlaceholderHeight[TEXTGROUPWIDGET_MAX_LINES];
String Lines[TEXTGROUPWIDGET_MAX_LINES];
LinkData LinkDatas[TEXTGROUPWIDGET_MAX_LINES];
Texture Textures[TEXTGROUPWIDGET_MAX_LINES];
} TextGroupWidget;
void TextGroupWidget_Create(TextGroupWidget* widget, Int32 linesCount, void* font, void* underlineFont);
void TextGroupWidget_Create(TextGroupWidget* widget, Int32 linesCount, FontDesc* font, FontDesc* underlineFont);
void TextGroupWidget_SetUsePlaceHolder(TextGroupWidget* widget, Int32 index, bool placeHolder);
void TextGroupWidget_PushUpAndReplaceLast(TextGroupWidget* widget, STRING_TRANSIENT String* text);
Int32 TextGroupWidget_GetUsedHeight(TextGroupWidget* widget);

View File

@ -1,6 +1,7 @@
#include "Platform.h"
#include "Stream.h"
#include "DisplayDevice.h"
#include "ExtMath.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
@ -61,7 +62,7 @@ void Platform_MemCpy(void* dst, void* src, UInt32 numBytes) {
}
void Platform_Log(String message) {
void Platform_Log(STRING_TRANSIENT String* message) {
/* TODO: log to console */
}
@ -172,4 +173,26 @@ UInt32 Platform_FileLength(void* file) {
void Platform_ThreadSleep(UInt32 milliseconds) {
Sleep(milliseconds);
}
}
void Platform_MakeFont(FontDesc* desc) {
LOGFONTA font = { 0 };
font.lfHeight = -Math_Ceil(desc->Size * GetDeviceCaps(hDC, LOGPIXELSY) / 72.0f);
font.lfItalic = desc->Style == FONT_STYLE_ITALIC;
font.lfUnderline = desc->Style == FONT_STYLE_UNDERLINE;
font.lfWeight = desc->Style == FONT_STYLE_BOLD ? FW_BOLD : FW_NORMAL;
font.lfQuality = ANTIALIASED_QUALITY;
desc->Handle = CreateFontIndirectA(&font);
if (desc->Handle == NULL) {
ErrorHandler_Fail("Creating font handle failed");
}
}
void Platform_FreeFont(FontDesc* desc) {
if (!DeleteObject(desc->Handle)) {
ErrorHandler_Fail("Deleting font handle failed");
}
desc->Handle = NULL;
}

View File

@ -36,7 +36,8 @@ Int32 WordWrap_WrapLine(String* text, Int32 index, Int32 lineSize) {
if (!WordWrap_IsWrapper(text->buffer[i])) continue;
for (Int32 j = lineEnd; j >= i + 1; j--) {
InsertAt(index + lineSize, text->buffer[j]);
UInt8 c = text->buffer[j];
String_InsertAt(text, index + lineSize, c);
text->buffer[j] = ' ';
}
return (i + 1) - index;