[client] overlay/status: re-rasterize at high DPI when needed

When the window scale goes above the scale the SVGs were rasterized
at, we re-rasterize them at the necessary scale for a more crisp
appearance.
This commit is contained in:
Quantum 2022-05-27 01:10:22 -04:00 committed by Geoffrey McRae
parent 712b1cbc46
commit 8b8b580f63

View File

@ -19,6 +19,7 @@
*/ */
#include "interface/overlay.h" #include "interface/overlay.h"
#include "math.h"
#include "cimgui.h" #include "cimgui.h"
#include "../overlays.h" #include "../overlays.h"
@ -34,15 +35,29 @@
static bool l_state[LG_USER_STATUS_MAX] = { 0 }; static bool l_state[LG_USER_STATUS_MAX] = { 0 };
static OverlayImage l_image[LG_USER_STATUS_MAX] = { 0 }; static OverlayImage l_image[LG_USER_STATUS_MAX] = { 0 };
static bool l_recordToggle; static bool l_recordToggle;
static double l_scale = 1.0;
static void status_loadImage(const char * data, unsigned int size,
OverlayImage * image, int width, int height)
{
overlayFreeImage(image);
overlayLoadSVG(data, size, image, width, height);
}
static void status_loadIcons(double scale)
{
int iconSize = ceil(scale * ICON_SIZE);
status_loadImage(b_status_recording_svg, b_status_recording_svg_size,
&l_image[LG_USER_STATUS_RECORDING], iconSize, iconSize);
status_loadImage(b_status_spice_svg, b_status_spice_svg_size,
&l_image[LG_USER_STATUS_SPICE], iconSize, iconSize);
}
static bool status_init(void ** udata, const void * params) static bool status_init(void ** udata, const void * params)
{ {
overlayLoadSVG(b_status_recording_svg, b_status_recording_svg_size, status_loadIcons(l_scale);
&l_image[LG_USER_STATUS_RECORDING], ICON_SIZE, ICON_SIZE);
overlayLoadSVG(b_status_spice_svg, b_status_spice_svg_size,
&l_image[LG_USER_STATUS_SPICE], ICON_SIZE, ICON_SIZE);
return true; return true;
} }
@ -59,6 +74,12 @@ static int status_render(void * udata, bool interactive, struct Rect * windowRec
const int marginY = 10; const int marginY = 10;
const int gapX = 5; const int gapX = 5;
if (g_state.windowScale > l_scale)
{
l_scale = g_state.windowScale;
status_loadIcons(l_scale);
}
ImVec2 * screen = overlayGetScreenSize(); ImVec2 * screen = overlayGetScreenSize();
struct Rect rect = { struct Rect rect = {
.x = screen->x - LG_USER_STATUS_MAX * (ICON_SIZE + gapX) - marginX, .x = screen->x - LG_USER_STATUS_MAX * (ICON_SIZE + gapX) - marginX,
@ -87,7 +108,7 @@ static int status_render(void * udata, bool interactive, struct Rect * windowRec
}, },
(ImVec2){ (ImVec2){
xPos - ICON_SIZE, xPos - ICON_SIZE,
img->height + marginY img->height / l_scale + marginY
}, },
(ImVec2){ 0, 0 }, (ImVec2){ 0, 0 },
(ImVec2){ 1, 1 }, (ImVec2){ 1, 1 },