diff --git a/client/src/overlay/splash.c b/client/src/overlay/splash.c index 55f5ef00..534038d2 100644 --- a/client/src/overlay/splash.c +++ b/client/src/overlay/splash.c @@ -26,10 +26,15 @@ #include "overlay_utils.h" #include "common/array.h" +#include "version.h" +#include "common/appstrings.h" +#include "common/stringlist.h" +#include "common/stringutils.h" + #include "resources/lg-logo.svg.h" +#include #include -#include #define SEGMENTS 12 @@ -38,6 +43,8 @@ static bool l_fadeDone; static float l_alpha; static OverlayImage l_logo; static float l_vectors[SEGMENTS][2]; +static StringList l_tagline; +static StringList l_footline; static void calcRadialVectors(float vectors[][2], int segments) { @@ -86,12 +93,63 @@ static bool splash_init(void ** udata, const void * params) overlayLoadSVG(b_lg_logo_svg, b_lg_logo_svg_size, &l_logo, 200, 200); calcRadialVectors(l_vectors, ARRAY_LENGTH(l_vectors)); + + l_tagline = stringlist_new(false); + l_footline = stringlist_new(false); + + stringlist_push(l_tagline, "Looking Glass"); + stringlist_push(l_tagline, (char *)LG_WEBSITE_URL); + + stringlist_push(l_footline, (char *)LG_VERSION_STR); + stringlist_push(l_footline, (char *)LG_COPYRIGHT_STR); + return true; } static void splash_free(void * udata) { overlayFreeImage(&l_logo); + stringlist_free(&l_tagline ); + stringlist_free(&l_footline); +} + +static void renderText(ImDrawList * list, int x, int y, ImU32 color, + StringList lines, bool topAlign) +{ + static float textHeight = 0.0f; + ImVec2 size; + + if (textHeight == 0.0f) + { + const char * tmp = "W"; + igCalcTextSize(&size, tmp, tmp + 1, false, 0.0f); + textHeight = size.y; + } + + float fy = y; + const unsigned int count = stringlist_count(lines); + for(int i = 0; i < count; ++i) + { + const char * text = stringlist_at(lines, topAlign ? i : count - i - 1); + const int len = strlen(text); + + igCalcTextSize(&size, text, text + len, false, 0.0f); + ImDrawList_AddText_Vec2( + list, + (ImVec2){ + x - size.x / 2, + topAlign ? fy : fy - size.y + }, + color, + text, + text + len + ); + + if (topAlign) + fy += textHeight; + else + fy -= textHeight; + } } static int splash_render(void * udata, bool interactive, struct Rect * windowRects, @@ -124,6 +182,8 @@ static int splash_render(void * udata, bool interactive, struct Rect * windowRec 0.0f, 0.0f, 0.0f, alpha}); const ImU32 imageColor = igColorConvertFloat4ToU32((ImVec4){ 1.0f, 1.0f, 1.0f, alpha}); + const ImU32 fontColor = igColorConvertFloat4ToU32((ImVec4){ + 0.8f, 0.8f, 0.8f, alpha}); drawRadialGradient(list, screen->x / 2, screen->y / 2, @@ -148,6 +208,20 @@ static int splash_render(void * udata, bool interactive, struct Rect * windowRec (ImVec2){ 1, 1 }, imageColor); + renderText(list, + screen->x / 2, + logoRect.y + logoRect.h + 10, + fontColor, + l_tagline, + true); + + renderText(list, + screen->x / 2, + screen->y - 10, + fontColor, + l_footline, + false); + *windowRects = rect; return 1; }