diff options
| author | Felix Dick <felix.dick@web.de> | 2022-09-29 14:24:59 +0200 |
|---|---|---|
| committer | Felix Dick <felix.dick@web.de> | 2022-09-29 14:24:59 +0200 |
| commit | 425b07d1e511d712d7920aecd6b5624845597242 (patch) | |
| tree | 12c5881b0319d093b54fab4f49479ac6701f40ce /src/render | |
| parent | 65fb526d5c3ef0bfab83f6fdc2e69270c4522448 (diff) | |
| parent | 2636abca2dcf1eca2c0296bb817f644b8626a860 (diff) | |
Merge branch 'main' into rework_rounding_shader
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/OpenGL.cpp | 57 | ||||
| -rw-r--r-- | src/render/OpenGL.hpp | 5 | ||||
| -rw-r--r-- | src/render/Renderer.cpp | 8 |
3 files changed, 36 insertions, 34 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 73cad693..faf91d37 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1114,18 +1114,19 @@ void CHyprOpenGLImpl::renderMirrored() { renderTexture(PFB->m_cTex, &monbox, 255.f, 0, false, false); } -void CHyprOpenGLImpl::renderSplash(cairo_t *const CAIRO, cairo_surface_t *const CAIROSURFACE) { +void CHyprOpenGLImpl::renderSplash(cairo_t *const CAIRO, cairo_surface_t *const CAIROSURFACE, double offsetY) { cairo_select_font_face(CAIRO, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); const auto FONTSIZE = (int)(m_RenderData.pMonitor->vecPixelSize.y / 76); cairo_set_font_size(CAIRO, FONTSIZE); - cairo_set_source_rgba(CAIRO, 1.f, 1.f, 1.f, 0.32f); + cairo_set_source_rgba(CAIRO, 1.0, 1.0, 1.0, 0.32); cairo_text_extents_t textExtents; cairo_text_extents(CAIRO, g_pCompositor->m_szCurrentSplash.c_str(), &textExtents); - cairo_move_to(CAIRO, m_RenderData.pMonitor->vecPixelSize.x / 2.f - textExtents.width / 2.f, m_RenderData.pMonitor->vecPixelSize.y - textExtents.height - 1); + cairo_move_to(CAIRO, (m_RenderData.pMonitor->vecPixelSize.x - textExtents.width) / 2.0, m_RenderData.pMonitor->vecPixelSize.y - textExtents.height + offsetY); + cairo_show_text(CAIRO, g_pCompositor->m_szCurrentSplash.c_str()); cairo_surface_flush(CAIROSURFACE); @@ -1167,13 +1168,37 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(CMonitor* pMonitor) { PTEX->m_vSize = textureSize; + // calc the target box + const double MONRATIO = m_RenderData.pMonitor->vecTransformedSize.x / m_RenderData.pMonitor->vecTransformedSize.y; + const double WPRATIO = 1.77; + + Vector2D origin; + double scale; + + if (MONRATIO > WPRATIO) { + scale = m_RenderData.pMonitor->vecTransformedSize.x / PTEX->m_vSize.x; + + origin.y = (m_RenderData.pMonitor->vecTransformedSize.y - PTEX->m_vSize.y * scale) / 2.0; + } else { + scale = m_RenderData.pMonitor->vecTransformedSize.y / PTEX->m_vSize.y; + + origin.x = (m_RenderData.pMonitor->vecTransformedSize.x - PTEX->m_vSize.x * scale) / 2.0; + } + + wlr_box box = {origin.x, origin.y, PTEX->m_vSize.x * scale, PTEX->m_vSize.y * scale}; + + m_mMonitorRenderResources[pMonitor].backgroundTexBox = box; + // create a new one with cairo const auto CAIROSURFACE = cairo_image_surface_create_from_png(texPath.c_str()); - const auto CAIRO = cairo_create(CAIROSURFACE); + // scale it to fit the current monitor + cairo_scale(CAIRO, textureSize.x / pMonitor->vecTransformedSize.x, textureSize.y / pMonitor->vecTransformedSize.y); + + // render splash on wallpaper if (!*PNOSPLASH) - renderSplash(CAIRO, CAIROSURFACE); + renderSplash(CAIRO, CAIROSURFACE, origin.y * WPRATIO / MONRATIO); // copy the data to an OpenGL texture we have const auto DATA = cairo_image_surface_get_data(CAIROSURFACE); @@ -1189,28 +1214,6 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(CMonitor* pMonitor) { cairo_surface_destroy(CAIROSURFACE); cairo_destroy(CAIRO); - // calc the target box - - const float MONRATIO = m_RenderData.pMonitor->vecTransformedSize.x / m_RenderData.pMonitor->vecTransformedSize.y; - const float WPRATIO = 1.77f; - - Vector2D origin; - float scale; - - if (MONRATIO > WPRATIO) { - scale = m_RenderData.pMonitor->vecTransformedSize.x / PTEX->m_vSize.x; - - origin.y = -(PTEX->m_vSize.y * scale - m_RenderData.pMonitor->vecTransformedSize.y) / 2.f / scale; - } else { - scale = m_RenderData.pMonitor->vecTransformedSize.y / PTEX->m_vSize.y; - - origin.x = -(PTEX->m_vSize.x * scale - m_RenderData.pMonitor->vecTransformedSize.x) / 2.f / scale; - } - - wlr_box box = {origin.x * scale, origin.y * scale, PTEX->m_vSize.x * scale, PTEX->m_vSize.y * scale}; - - m_mMonitorRenderResources[pMonitor].backgroundTexBox = box; - Debug::log(LOG, "Background created for monitor %s", pMonitor->szName.c_str()); } diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index df47ebd3..30d66084 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -139,10 +139,9 @@ private: CFramebuffer* blurMainFramebufferWithDamage(float a, wlr_box* pBox, pixman_region32_t* damage); void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool noAA = false, bool allowCustomUV = false, bool allowDim = false); - - void renderSplash(cairo_t *const, cairo_surface_t *const); + void renderSplash(cairo_t *const, cairo_surface_t *const, double); void preBlurForCurrentMonitor(); }; -inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL;
\ No newline at end of file +inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 12cf4850..e36fc5e1 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -226,8 +226,8 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, CMonitor* pMonitor, timespec* SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y}; renderdata.surface = g_pXWaylandManager->getWindowSurface(pWindow); - renderdata.w = std::max(pWindow->m_vRealSize.vec().x, (double)5); // clamp the size to min 5, - renderdata.h = std::max(pWindow->m_vRealSize.vec().y, (double)5); // otherwise we'll have issues later with invalid boxes + renderdata.w = std::max(pWindow->m_vRealSize.vec().x, 5.0); // clamp the size to min 5, + renderdata.h = std::max(pWindow->m_vRealSize.vec().y, 5.0); // otherwise we'll have issues later with invalid boxes renderdata.dontRound = (pWindow->m_bIsFullscreen && PWORKSPACE->m_efFullscreenMode == FULLSCREEN_FULL) || (!pWindow->m_sSpecialRenderData.rounding); renderdata.fadeAlpha = pWindow->m_fAlpha.fl() * (pWindow->m_bPinned ? 1.f : (PWORKSPACE->m_fAlpha.fl() / 255.f)); renderdata.alpha = pWindow->m_fActiveInactiveAlpha.fl(); @@ -492,8 +492,8 @@ void CHyprRenderer::calculateUVForWindowSurface(CWindow* pWindow, wlr_surface* p g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = Vector2D(0, 0); g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = Vector2D( - g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.x * ((double)pWindow->m_vRealSize.vec().x / ((double)geom.width / g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.x)), - g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.y * ((double)pWindow->m_vRealSize.vec().y / ((double)geom.height / g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.y))); + g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.x * (pWindow->m_vRealSize.vec().x / ((double)geom.width / g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.x)), + g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.y * (pWindow->m_vRealSize.vec().y / ((double)geom.height / g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight.y))); } } else { g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = Vector2D(-1, -1); |
