mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-05-24 13:38:14 +08:00
Support for HiDPI in OpenGL on Linux / GTK3.
wxGTK3 HiDPI support seems to emulate what OSX does quite closely, thus the changes are relatively minimal. Also fixed an ugly rounding issue when populating the ImGUI font map with image thumbnails. Fixes Gtk3 issue on 4k+ screens #4135 Fixes HiDPI screens with Wayland on Fedora 30 cause Plater view to be too small. #3245
This commit is contained in:
parent
43581059ff
commit
a13b35ce92
@ -86,6 +86,13 @@ static const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4;
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
#ifdef __WXGTK3__
|
||||||
|
// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support.
|
||||||
|
RetinaHelper::RetinaHelper(wxWindow* window) : m_window(window), m_self(nullptr) {}
|
||||||
|
RetinaHelper::~RetinaHelper() {}
|
||||||
|
float RetinaHelper::get_scale_factor() { return float(m_window->GetContentScaleFactor()); }
|
||||||
|
#endif // __WXGTK3__
|
||||||
|
|
||||||
Size::Size()
|
Size::Size()
|
||||||
: m_width(0)
|
: m_width(0)
|
||||||
, m_height(0)
|
, m_height(0)
|
||||||
@ -3732,7 +3739,8 @@ void GLCanvas3D::update_ui_from_settings()
|
|||||||
{
|
{
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
||||||
#if ENABLE_RETINA_GL
|
#if __APPLE__
|
||||||
|
// Update OpenGL scaling on OSX after the user toggled the "use_retina_opengl" settings in Preferences dialog.
|
||||||
const float orig_scaling = m_retina_helper->get_scale_factor();
|
const float orig_scaling = m_retina_helper->get_scale_factor();
|
||||||
|
|
||||||
const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1";
|
const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1";
|
||||||
|
@ -31,8 +31,9 @@ class wxPaintEvent;
|
|||||||
class wxGLCanvas;
|
class wxGLCanvas;
|
||||||
class wxGLContext;
|
class wxGLContext;
|
||||||
|
|
||||||
// Support for Retina OpenGL on Mac OS
|
// Support for Retina OpenGL on Mac OS.
|
||||||
#define ENABLE_RETINA_GL __APPLE__
|
// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support, enable it as well.
|
||||||
|
#define ENABLE_RETINA_GL (__APPLE__ || __WXGTK3__)
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
|
@ -963,6 +963,8 @@ void ImGuiWrapper::init_font(bool compress)
|
|||||||
// Fill rectangles from the SVG-icons
|
// Fill rectangles from the SVG-icons
|
||||||
for (auto icon : font_icons) {
|
for (auto icon : font_icons) {
|
||||||
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
||||||
|
assert(rect->Width == icon_sz);
|
||||||
|
assert(rect->Height == icon_sz);
|
||||||
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
||||||
const ImU32* pIn = (ImU32*)raw_data.data();
|
const ImU32* pIn = (ImU32*)raw_data.data();
|
||||||
for (int y = 0; y < icon_sz; y++) {
|
for (int y = 0; y < icon_sz; y++) {
|
||||||
@ -973,10 +975,12 @@ void ImGuiWrapper::init_font(bool compress)
|
|||||||
}
|
}
|
||||||
rect_id++;
|
rect_id++;
|
||||||
}
|
}
|
||||||
icon_sz = lround(32 * font_scale); // default size of large icon is 32 px
|
|
||||||
|
icon_sz *= 2; // default size of large icon is 32 px
|
||||||
for (auto icon : font_icons_large) {
|
for (auto icon : font_icons_large) {
|
||||||
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
||||||
|
assert(rect->Width == icon_sz);
|
||||||
|
assert(rect->Height == icon_sz);
|
||||||
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
||||||
const ImU32* pIn = (ImU32*)raw_data.data();
|
const ImU32* pIn = (ImU32*)raw_data.data();
|
||||||
for (int y = 0; y < icon_sz; y++) {
|
for (int y = 0; y < icon_sz; y++) {
|
||||||
|
@ -228,7 +228,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
|||||||
// OSX specific issue:
|
// OSX specific issue:
|
||||||
// When we move application between Retina and non-Retina displays, The legend on a canvas doesn't redraw
|
// When we move application between Retina and non-Retina displays, The legend on a canvas doesn't redraw
|
||||||
// So, redraw explicitly canvas, when application is moved
|
// So, redraw explicitly canvas, when application is moved
|
||||||
#if ENABLE_RETINA_GL
|
//FIXME maybe this is useful for __WXGTK3__ as well?
|
||||||
|
#if __APPLE__
|
||||||
Bind(wxEVT_MOVE, [this](wxMoveEvent& event) {
|
Bind(wxEVT_MOVE, [this](wxMoveEvent& event) {
|
||||||
wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
|
wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
|
||||||
wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
|
wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user