diff --git a/client/src/app.c b/client/src/app.c index e45f2f88..ef1d11e0 100644 --- a/client/src/app.c +++ b/client/src/app.c @@ -30,6 +30,7 @@ #include "kb.h" #include "common/debug.h" +#include "common/rects.h" #include "common/stringutils.h" #include "interface/overlay.h" #include "overlays.h" @@ -1073,12 +1074,7 @@ render_again: buffer, MAX_OVERLAY_RECTS); for (int i = 0; i < written; ++i) - { - buffer[i].x *= g_state.windowScale; - buffer[i].y *= g_state.windowScale; - buffer[i].w *= g_state.windowScale; - buffer[i].h *= g_state.windowScale; - } + rectScaleOutward(buffer + i, g_state.windowScale); // It is an error to run out of rectangles, because we will not be able to // correctly calculate the damage of the next frame. diff --git a/client/src/overlay_utils.c b/client/src/overlay_utils.c index e491a0cd..70d2e23c 100644 --- a/client/src/overlay_utils.c +++ b/client/src/overlay_utils.c @@ -20,6 +20,7 @@ #include "overlay_utils.h" +#include #include #include "common/open.h" @@ -41,13 +42,19 @@ void overlayGetImGuiRect(struct Rect * rect) { - ImVec2 pos = igGetWindowPos(); - ImVec2 size = igGetWindowSize(); + const ImVec2 pos = igGetWindowPos(); + const ImVec2 size = igGetWindowSize(); + const float border = igGetStyle()->WindowBorderSize; + const float margin = border > 1.0f ? border : 1.0f; + const int left = (int)floorf(pos.x - margin); + const int top = (int)floorf(pos.y - margin); + const int right = (int)ceilf(pos.x + size.x + margin); + const int bottom = (int)ceilf(pos.y + size.y + margin); - rect->x = pos.x; - rect->y = pos.y; - rect->w = size.x; - rect->h = size.y; + rect->x = left; + rect->y = top; + rect->w = right - left; + rect->h = bottom - top; } ImVec2 * overlayGetScreenSize(void) diff --git a/common/include/common/rects.h b/common/include/common/rects.h index 1d0d5ae8..6d4f78d2 100644 --- a/common/include/common/rects.h +++ b/common/include/common/rects.h @@ -31,6 +31,8 @@ extern void (*rectCopyUnaligned)( uint8_t *restrict dst, const uint8_t *restrict src, int ystart, int yend, int dx, int dstPitch, int srcPitch, int width); +void rectScaleOutward(struct Rect * rect, double scale); + void rectsBufferToFramebuffer(FrameDamageRect * rects, int count, int bpp, FrameBuffer * frame, int dstPitch, int height, const uint8_t * src, int srcPitch); diff --git a/common/src/rects.c b/common/src/rects.c index a10cf2e2..83a7f63f 100644 --- a/common/src/rects.c +++ b/common/src/rects.c @@ -22,6 +22,7 @@ #include "common/util.h" #include "common/cpuinfo.h" +#include #include #include @@ -38,6 +39,19 @@ struct Edge int delta; }; +void rectScaleOutward(struct Rect * rect, double scale) +{ + const int left = (int)floor(rect->x * scale); + const int top = (int)floor(rect->y * scale); + const int right = (int)ceil(((double)rect->x + rect->w) * scale); + const int bottom = (int)ceil(((double)rect->y + rect->h) * scale); + + rect->x = left; + rect->y = top; + rect->w = right - left; + rect->h = bottom - top; +} + inline static bool rectIntersects(const FrameDamageRect * r1, const FrameDamageRect * r2) {