summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-21 16:13:43 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-21 16:13:43 +0100
commitbcb02b9307d09918a11fa377065d7f2c6e506754 (patch)
tree83d2c280a30fdfa2da5c7d999de093615d2b6fcb /src/render/Renderer.cpp
parentd06423c9d1fcf908a485b8654d13dd1b154613a4 (diff)
handle subsurfaces
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 6800d586..262b3d72 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -263,4 +263,51 @@ void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor) {
// right
border.x = correctPos.x + pWindow->m_vRealSize.x;
wlr_render_rect(g_pCompositor->m_sWLRRenderer, &border, BORDERWLRCOL, pMonitor->output->transform_matrix);
+}
+
+void damageSurfaceIter(struct wlr_surface* surface, int x, int y, void* data) {
+ auto* renderdata = (SRenderData*)data;
+ bool entire = (bool*)renderdata->data;
+
+ wlr_box box = {.x = renderdata->x, .y = renderdata->y, .width = renderdata->w, .height = renderdata->h};
+ scaleBox(&box, renderdata->output->scale);
+
+ pixman_region32_t damageRegion;
+ pixman_region32_init(&damageRegion);
+ wlr_surface_get_effective_damage(renderdata->surface, &damageRegion);
+ wlr_region_scale(&damageRegion, &damageRegion, renderdata->output->scale);
+
+ if (std::ceil(renderdata->output->scale) > renderdata->surface->current.scale) {
+ wlr_region_expand(&damageRegion, &damageRegion, std::ceil(renderdata->output->scale) - renderdata->surface->current.scale);
+ }
+
+ const auto PMONITOR = g_pCompositor->getMonitorFromOutput(renderdata->output);
+
+ pixman_region32_translate(&damageRegion, box.x, box.y);
+ wlr_output_damage_add(PMONITOR->damage, &damageRegion);
+ pixman_region32_fini(&damageRegion);
+
+ if (entire)
+ wlr_output_damage_add_box(PMONITOR->damage, &box);
+
+ if (!wl_list_empty(&surface->current.frame_callback_list)) {
+ wlr_output_schedule_frame(renderdata->output);
+ }
+}
+
+void CHyprRenderer::damageSurface(SMonitor* pMonitor, double x, double y, wlr_surface* pSurface, void* data) {
+ if (!pSurface || !pMonitor)
+ return; // wut?
+
+ SRenderData renderData = {
+ .output = pMonitor->output,
+ .x = x,
+ .y = y,
+ .data = data,
+ .surface = pSurface,
+ .w = pSurface->current.width,
+ .h = pSurface->current.height
+ };
+
+ wlr_surface_for_each_surface(pSurface, damageSurfaceIter, &renderData);
} \ No newline at end of file