diff options
| author | vaxerski <vaxry@vaxry.net> | 2024-02-19 11:24:54 +0000 |
|---|---|---|
| committer | vaxerski <vaxry@vaxry.net> | 2024-02-19 11:24:54 +0000 |
| commit | e4790e3f8e8f3693d924c3d8fc9012e3ab7bbf8f (patch) | |
| tree | 45d88aee67b0529d3d7c11e875bbb6f7653bb06d /src/render/Renderer.cpp | |
| parent | 69a4f08dbee6dc08d1e2ce498ce80ab20844e4f3 (diff) | |
surface: fix invalid damage tracking in damageSurface
ref #4744
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index fc676ad9..7b40f646 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1588,31 +1588,30 @@ void CHyprRenderer::damageSurface(wlr_surface* pSurface, double x, double y, dou y += CORRECTION.y; } - CRegion damageBox{&pSurface->buffer_damage}; + const auto WLSURF = CWLSurface::surfaceFromWlr(pSurface); + if (!WLSURF) + Debug::log(ERR, "BUG THIS: No CWLSurface for surface in damageSurface!!!"); + CRegion damageBox = WLSURF ? WLSURF->logicalDamage() : CRegion{&pSurface->buffer_damage}; if (scale != 1.0) - wlr_region_scale(damageBox.pixman(), damageBox.pixman(), scale); + damageBox.scale(scale); // schedule frame events - if (!wl_list_empty(&pSurface->current.frame_callback_list)) { + if (!wl_list_empty(&pSurface->current.frame_callback_list)) g_pCompositor->scheduleFrameForMonitor(g_pCompositor->getMonitorFromVector(Vector2D(x, y))); - } if (damageBox.empty()) return; + damageBox.translate({x, y}); + CRegion damageBoxForEach; for (auto& m : g_pCompositor->m_vMonitors) { if (!m->output) continue; - double lx = 0, ly = 0; - wlr_output_layout_output_coords(g_pCompositor->m_sWLROutputLayout, m->output, &lx, &ly); - - damageBoxForEach = damageBox; - damageBoxForEach.translate({x - m->vecPosition.x, y - m->vecPosition.y}); - wlr_region_scale(damageBoxForEach.pixman(), damageBoxForEach.pixman(), m->scale); - damageBoxForEach.translate({lx + m->vecPosition.x, ly + m->vecPosition.y}); + damageBoxForEach.set(damageBox); + damageBoxForEach.translate({-m->vecPosition.x, -m->vecPosition.y}).scale(m->scale); m->addDamage(&damageBoxForEach); } |
