mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-26 01:45:58 +01:00
renderer: use nearest_neighbor for misaligned fractional-scale surfaces
ref #4225
This commit is contained in:
parent
94d6b2d2c1
commit
b5b025a1ed
1 changed files with 16 additions and 6 deletions
|
@ -53,8 +53,9 @@ static void renderSurface(struct wlr_surface* surface, int x, int y, void* data)
|
||||||
static auto* const PBLURPOPUPS = &g_pConfigManager->getConfigValuePtr("decoration:blur:popups")->intValue;
|
static auto* const PBLURPOPUPS = &g_pConfigManager->getConfigValuePtr("decoration:blur:popups")->intValue;
|
||||||
static auto* const PBLURPOPUPSIGNOREALPHA = &g_pConfigManager->getConfigValuePtr("decoration:blur:popups_ignorealpha")->floatValue;
|
static auto* const PBLURPOPUPSIGNOREALPHA = &g_pConfigManager->getConfigValuePtr("decoration:blur:popups_ignorealpha")->floatValue;
|
||||||
|
|
||||||
const auto TEXTURE = wlr_surface_get_texture(surface);
|
const auto TEXTURE = wlr_surface_get_texture(surface);
|
||||||
const auto RDATA = (SRenderData*)data;
|
const auto RDATA = (SRenderData*)data;
|
||||||
|
const auto INTERACTIVERESIZEINPROGRESS = RDATA->pWindow && g_pInputManager->currentlyDraggedWindow == RDATA->pWindow && g_pInputManager->dragMode == MBIND_RESIZE;
|
||||||
|
|
||||||
if (!TEXTURE)
|
if (!TEXTURE)
|
||||||
return;
|
return;
|
||||||
|
@ -72,9 +73,8 @@ static void renderSurface(struct wlr_surface* surface, int x, int y, void* data)
|
||||||
auto* const PSURFACE = CWLSurface::surfaceFromWlr(surface);
|
auto* const PSURFACE = CWLSurface::surfaceFromWlr(surface);
|
||||||
|
|
||||||
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees m_pOwner */) {
|
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees m_pOwner */) {
|
||||||
const auto CORRECT = PSURFACE->correctSmallVec();
|
const auto CORRECT = PSURFACE->correctSmallVec();
|
||||||
const auto SIZE = PSURFACE->getViewporterCorrectedSize();
|
const auto SIZE = PSURFACE->getViewporterCorrectedSize();
|
||||||
const auto INTERACTIVERESIZEINPROGRESS = g_pInputManager->currentlyDraggedWindow == PSURFACE->m_pOwner && g_pInputManager->dragMode == MBIND_RESIZE;
|
|
||||||
|
|
||||||
if (!INTERACTIVERESIZEINPROGRESS) {
|
if (!INTERACTIVERESIZEINPROGRESS) {
|
||||||
windowBox.x += CORRECT.x;
|
windowBox.x += CORRECT.x;
|
||||||
|
@ -112,6 +112,15 @@ static void renderSurface(struct wlr_surface* surface, int x, int y, void* data)
|
||||||
windowBox.scale(RDATA->pMonitor->scale);
|
windowBox.scale(RDATA->pMonitor->scale);
|
||||||
windowBox.round();
|
windowBox.round();
|
||||||
|
|
||||||
|
// check for fractional scale surfaces misaligning the buffer size
|
||||||
|
// in those cases it's better to just force nearest neighbor
|
||||||
|
// as long as the window is not animated. During those it'd look weird
|
||||||
|
const auto NEARESTNEIGHBORSET = g_pHyprOpenGL->m_RenderData.useNearestNeighbor;
|
||||||
|
if (std::floor(RDATA->pMonitor->scale) != RDATA->pMonitor->scale /* Fractional */ && surface->current.scale == 1 /* fs protocol */ &&
|
||||||
|
windowBox.size() != Vector2D{surface->current.buffer_width, surface->current.buffer_height} /* misaligned */ &&
|
||||||
|
(!RDATA->pWindow || (!RDATA->pWindow->m_vRealSize.isBeingAnimated() && !INTERACTIVERESIZEINPROGRESS)) /* not window or not animated/resizing */)
|
||||||
|
g_pHyprOpenGL->m_RenderData.useNearestNeighbor = true;
|
||||||
|
|
||||||
float rounding = RDATA->rounding;
|
float rounding = RDATA->rounding;
|
||||||
|
|
||||||
rounding -= 1; // to fix a border issue
|
rounding -= 1; // to fix a border issue
|
||||||
|
@ -157,9 +166,10 @@ static void renderSurface(struct wlr_surface* surface, int x, int y, void* data)
|
||||||
|
|
||||||
g_pHyprOpenGL->blend(true);
|
g_pHyprOpenGL->blend(true);
|
||||||
|
|
||||||
// reset the UV, we might've set it above
|
// reset props
|
||||||
g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = Vector2D(-1, -1);
|
g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = Vector2D(-1, -1);
|
||||||
g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = Vector2D(-1, -1);
|
g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = Vector2D(-1, -1);
|
||||||
|
g_pHyprOpenGL->m_RenderData.useNearestNeighbor = NEARESTNEIGHBORSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor, CWorkspace* pWorkspace) {
|
bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor, CWorkspace* pWorkspace) {
|
||||||
|
|
Loading…
Reference in a new issue