From 61af9d882e33ac3c9bec583e4651326cac338b29 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 18 Jun 2021 19:21:30 -0600 Subject: [PATCH] WindowServer: Load multiple scaled versions of Bitmaps and Cursors This enables rendering of mixed-scale screen layouts with e.g. high resolution cursors and window button icons on high-dpi screens while using lower resolution bitmaps on regular screens. --- Userland/Services/WindowServer/Button.cpp | 8 +- Userland/Services/WindowServer/Button.h | 8 +- Userland/Services/WindowServer/CMakeLists.txt | 1 + .../WindowServer/ClientConnection.cpp | 2 +- Userland/Services/WindowServer/Compositor.cpp | 2 +- Userland/Services/WindowServer/Cursor.cpp | 59 +++++++++---- Userland/Services/WindowServer/Cursor.h | 32 +++++-- .../WindowServer/MultiScaleBitmaps.cpp | 70 ++++++++++++++++ .../Services/WindowServer/MultiScaleBitmaps.h | 32 +++++++ Userland/Services/WindowServer/Screen.cpp | 17 ++++ Userland/Services/WindowServer/Screen.h | 16 ++++ .../Services/WindowServer/WindowFrame.cpp | 84 +++++++++---------- Userland/Services/WindowServer/WindowFrame.h | 11 +-- .../Services/WindowServer/WindowManager.cpp | 20 +---- .../Services/WindowServer/WindowManager.h | 6 +- 15 files changed, 269 insertions(+), 99 deletions(-) create mode 100644 Userland/Services/WindowServer/MultiScaleBitmaps.cpp create mode 100644 Userland/Services/WindowServer/MultiScaleBitmaps.h diff --git a/Userland/Services/WindowServer/Button.cpp b/Userland/Services/WindowServer/Button.cpp index 6abd91e2c9..c6db1d3437 100644 --- a/Userland/Services/WindowServer/Button.cpp +++ b/Userland/Services/WindowServer/Button.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace WindowServer { @@ -23,7 +24,7 @@ Button::~Button() { } -void Button::paint(Gfx::Painter& painter) +void Button::paint(Screen& screen, Gfx::Painter& painter) { auto palette = WindowManager::the().palette(); Gfx::PainterStateSaver saver(painter); @@ -31,10 +32,11 @@ void Button::paint(Gfx::Painter& painter) Gfx::StylePainter::paint_button(painter, rect(), palette, Gfx::ButtonStyle::Normal, m_pressed, m_hovered); if (m_icon) { - auto icon_location = rect().center().translated(-(m_icon->width() / 2), -(m_icon->height() / 2)); + auto& bitmap = m_icon->bitmap(screen.scale_factor()); + auto icon_location = rect().center().translated(-(bitmap.width() / 2), -(bitmap.height() / 2)); if (m_pressed) painter.translate(1, 1); - painter.blit(icon_location, *m_icon, m_icon->rect()); + painter.blit(icon_location, bitmap, bitmap.rect()); } } diff --git a/Userland/Services/WindowServer/Button.h b/Userland/Services/WindowServer/Button.h index 90f5b440bc..843d7c61d2 100644 --- a/Userland/Services/WindowServer/Button.h +++ b/Userland/Services/WindowServer/Button.h @@ -11,10 +11,12 @@ #include #include #include +#include namespace WindowServer { class MouseEvent; +class Screen; class WindowFrame; class Button : public Weakable