From 8991be671fb231ebe268352fe9cc883911b066c2 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Wed, 25 Oct 2023 22:05:04 +0100 Subject: [PATCH] renderer: respect viewporter dest on base surfaces --- src/helpers/WLSurface.cpp | 13 +++++++++++-- src/helpers/WLSurface.hpp | 1 + src/render/Renderer.cpp | 9 +++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/helpers/WLSurface.cpp b/src/helpers/WLSurface.cpp index a34c77a1..3d3800cb 100644 --- a/src/helpers/WLSurface.cpp +++ b/src/helpers/WLSurface.cpp @@ -38,11 +38,20 @@ Vector2D CWLSurface::correctSmallVec() const { if (!m_pOwner || !exists() || !small() || m_bFillIgnoreSmall) return {}; - return Vector2D{(m_pOwner->m_vReportedSize.x - m_pWLRSurface->current.buffer_width) / 2, (m_pOwner->m_vReportedSize.y - m_pWLRSurface->current.buffer_height) / 2}.clamp( - {}, {INFINITY, INFINITY}) * + const auto SIZE = getViewporterCorrectedSize(); + + return Vector2D{(m_pOwner->m_vReportedSize.x - SIZE.x) / 2, (m_pOwner->m_vReportedSize.y - SIZE.y) / 2}.clamp({}, {INFINITY, INFINITY}) * (m_pOwner->m_vRealSize.vec() / m_pOwner->m_vReportedSize); } +Vector2D CWLSurface::getViewporterCorrectedSize() const { + if (!exists()) + return {}; + + return m_pWLRSurface->current.viewport.has_dst ? Vector2D{m_pWLRSurface->current.viewport.dst_width, m_pWLRSurface->current.viewport.dst_height} : + Vector2D{m_pWLRSurface->current.buffer_width, m_pWLRSurface->current.buffer_height}; +} + void CWLSurface::destroy() { if (!m_pWLRSurface) return; diff --git a/src/helpers/WLSurface.hpp b/src/helpers/WLSurface.hpp index ee6574de..8b4ef835 100644 --- a/src/helpers/WLSurface.hpp +++ b/src/helpers/WLSurface.hpp @@ -22,6 +22,7 @@ class CWLSurface { bool exists() const; bool small() const; // means surface is smaller than the requested size Vector2D correctSmallVec() const; // returns a corrective vector for small() surfaces + Vector2D getViewporterCorrectedSize() const; // allow stretching. Useful for plugins. bool m_bFillIgnoreSmall = false; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 4326b89f..f5a79bdf 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -31,17 +31,18 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees m_pOwner */) { const auto CORRECT = PSURFACE->correctSmallVec(); + const auto SIZE = PSURFACE->getViewporterCorrectedSize(); const auto INTERACTIVERESIZEINPROGRESS = g_pInputManager->currentlyDraggedWindow == PSURFACE->m_pOwner && g_pInputManager->dragMode == MBIND_RESIZE; if (!INTERACTIVERESIZEINPROGRESS) { windowBox.x += CORRECT.x; windowBox.y += CORRECT.y; - windowBox.width = (double)surface->current.buffer_width * (PSURFACE->m_pOwner->m_vRealSize.vec().x / PSURFACE->m_pOwner->m_vReportedSize.x); - windowBox.height = (double)surface->current.buffer_height * (PSURFACE->m_pOwner->m_vRealSize.vec().y / PSURFACE->m_pOwner->m_vReportedSize.y); + windowBox.width = SIZE.x * (PSURFACE->m_pOwner->m_vRealSize.vec().x / PSURFACE->m_pOwner->m_vReportedSize.x); + windowBox.height = SIZE.y * (PSURFACE->m_pOwner->m_vRealSize.vec().y / PSURFACE->m_pOwner->m_vReportedSize.y); } else { - windowBox.width = (double)surface->current.buffer_width; - windowBox.height = (double)surface->current.buffer_height; + windowBox.width = SIZE.x; + windowBox.height = SIZE.y; } }