[HTML5] Detect screen scale and DPI.

`OS.get_screen_scale` will now return the `window.devicePixelRatio`
value, `OS.get_screen_dpi` uses CSS media queries to find approximate
DPI value for the current display.
`OS.get_screen_size` also return the actual screen size (not the CSS
pixel size).
This commit is contained in:
Fabio Alessandrelli 2021-02-05 19:56:56 +01:00
parent e71510097d
commit b3f78687de
4 changed files with 44 additions and 1 deletions

View file

@ -51,6 +51,7 @@ extern int godot_js_os_execute(const char *p_json);
extern void godot_js_os_shell_open(const char *p_uri);
// Display
extern int godot_js_display_screen_dpi_get();
extern double godot_js_display_pixel_ratio_get();
extern void godot_js_display_alert(const char *p_text);
extern int godot_js_display_touchscreen_is_available();

View file

@ -405,6 +405,27 @@ const GodotDisplay = {
$GodotDisplay__deps: ['$GodotConfig', '$GodotRuntime', '$GodotDisplayCursor', '$GodotDisplayListeners', '$GodotDisplayDragDrop', '$GodotDisplayGamepads'],
$GodotDisplay: {
window_icon: '',
findDPI: function () {
function testDPI(dpi) {
return window.matchMedia(`(max-resolution: ${dpi}dpi)`).matches;
}
function bisect(low, high, func) {
const mid = parseInt(((high - low) / 2) + low, 10);
if (high - low <= 1) {
return func(high) ? high : low;
}
if (func(mid)) {
return bisect(low, mid, func);
}
return bisect(mid, high, func);
}
try {
const dpi = bisect(0, 800, testDPI);
return dpi >= 96 ? dpi : 96;
} catch (e) {
return 96;
}
},
},
godot_js_display_is_swap_ok_cancel__sig: 'i',
@ -422,6 +443,11 @@ const GodotDisplay = {
window.alert(GodotRuntime.parseString(p_text)); // eslint-disable-line no-alert
},
godot_js_display_screen_dpi_get__sig: 'i',
godot_js_display_screen_dpi_get: function () {
return GodotDisplay.findDPI();
},
godot_js_display_pixel_ratio_get__sig: 'f',
godot_js_display_pixel_ratio_get: function () {
return window.devicePixelRatio || 1;

View file

@ -159,7 +159,8 @@ Size2 OS_JavaScript::get_screen_size(int p_screen) const {
EmscriptenFullscreenChangeEvent ev;
EMSCRIPTEN_RESULT result = emscripten_get_fullscreen_status(&ev);
ERR_FAIL_COND_V(result != EMSCRIPTEN_RESULT_SUCCESS, Size2());
return Size2(ev.screenWidth, ev.screenHeight);
double scale = godot_js_display_pixel_ratio_get();
return Size2(ev.screenWidth * scale, ev.screenHeight * scale);
}
void OS_JavaScript::set_window_size(const Size2 p_size) {
@ -1014,6 +1015,18 @@ bool OS_JavaScript::main_loop_iterate() {
return Main::iteration();
}
int OS_JavaScript::get_screen_dpi(int p_screen) const {
return godot_js_display_screen_dpi_get();
}
float OS_JavaScript::get_screen_scale(int p_screen) const {
return godot_js_display_pixel_ratio_get();
}
float OS_JavaScript::get_screen_max_scale() const {
return get_screen_scale();
}
void OS_JavaScript::delete_main_loop() {
memdelete(main_loop);

View file

@ -134,6 +134,9 @@ public:
virtual void set_window_fullscreen(bool p_enabled);
virtual bool is_window_fullscreen() const;
virtual Size2 get_screen_size(int p_screen = -1) const;
virtual int get_screen_dpi(int p_screen = -1) const;
virtual float get_screen_scale(int p_screen = -1) const;
virtual float get_screen_max_scale() const;
virtual Point2 get_mouse_position() const;
virtual int get_mouse_button_state() const;