From b234a1b7a7cce7f536608b34f67d31ca2bc54f6e Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 17 May 2019 19:12:52 +0200 Subject: [PATCH] Use mac_max_scaling_factor() in create_scaled_bitmap() --- src/slic3r/GUI/wxExtensions.cpp | 12 +++++++++++- src/slic3r/Utils/MacDarkMode.mm | 7 +++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index fa8942c545..103a9ecf0c 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1,6 +1,7 @@ #include "wxExtensions.hpp" #include +#include #include "libslic3r/Utils.hpp" #include "libslic3r/Model.hpp" @@ -19,6 +20,7 @@ #include "libslic3r/GCode/PreviewData.hpp" #include "I18N.hpp" #include "GUI_Utils.hpp" +#include "../Utils/MacDarkMode.hpp" using Slic3r::GUI::from_u8; @@ -389,7 +391,15 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, static Slic3r::GUI::BitmapCache cache; #ifdef __APPLE__ - const float scale_factor = win != nullptr ? win->GetContentScaleFactor() : 1.0f; + // Note: win->GetContentScaleFactor() is not used anymore here because it tends to + // return bogus results quite often (such as 1.0 on Retina or even 0.0). + // We're using the max scaling factor across all screens because it's very likely to be good enough. + + static float max_scaling_factor = NAN; + if (std::isnan(max_scaling_factor)) { + max_scaling_factor = Slic3r::GUI::mac_max_scaling_factor(); + } + const float scale_factor = win != nullptr ? max_scaling_factor : 1.0f; #else (void)(win); const float scale_factor = 1.0f; diff --git a/src/slic3r/Utils/MacDarkMode.mm b/src/slic3r/Utils/MacDarkMode.mm index 514b6e7d3f..adbd72aabd 100644 --- a/src/slic3r/Utils/MacDarkMode.mm +++ b/src/slic3r/Utils/MacDarkMode.mm @@ -1,6 +1,9 @@ #import "MacDarkMode.hpp" +#import + #import +#import @implementation MacDarkMode @@ -19,12 +22,12 @@ double mac_max_scaling_factor() { double scaling = 1.; if ([NSScreen screens] == nil) { - scalign = [[NSScreen mainScreen] backingScaleFactor]; + scaling = [[NSScreen mainScreen] backingScaleFactor]; } else { for (int i = 0; i < [[NSScreen screens] count]; ++ i) scaling = std::max(scaling, [[[NSScreen screens] objectAtIndex:0] backingScaleFactor]); } - return scalign; + return scaling; } }