Merge pull request #46802 from Faless/js/3.x_allow_hidpi

[3.2][HTML5] Respect allow_hidpi option during setup
This commit is contained in:
Rémi Verschelde 2021-03-09 10:56:21 +01:00 committed by GitHub
commit 16fbe80dd2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 8 deletions

View file

@ -457,7 +457,7 @@
Position offset for tooltips, relative to the mouse cursor's hotspot. Position offset for tooltips, relative to the mouse cursor's hotspot.
</member> </member>
<member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="" default="false"> <member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="" default="false">
If [code]true[/code], allows HiDPI display on Windows and macOS. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there. If [code]true[/code], allows HiDPI display on Windows, macOS, and the HTML5 platform. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there.
</member> </member>
<member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter="" default="true"> <member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter="" default="true">
If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms. If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms.

View file

@ -92,7 +92,7 @@ extern int godot_js_display_gamepad_sample_get(int p_idx, float r_btns[16], int3
extern void godot_js_display_notification_cb(void (*p_callback)(int p_notification), int p_enter, int p_exit, int p_in, int p_out); extern void godot_js_display_notification_cb(void (*p_callback)(int p_notification), int p_enter, int p_exit, int p_in, int p_out);
extern void godot_js_display_paste_cb(void (*p_callback)(const char *p_text)); extern void godot_js_display_paste_cb(void (*p_callback)(const char *p_text));
extern void godot_js_display_drop_files_cb(void (*p_callback)(char **p_filev, int p_filec)); extern void godot_js_display_drop_files_cb(void (*p_callback)(char **p_filev, int p_filec));
extern void godot_js_display_setup_canvas(int p_width, int p_height, int p_fullscreen); extern void godot_js_display_setup_canvas(int p_width, int p_height, int p_fullscreen, int p_hidpi);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -400,6 +400,10 @@ const GodotDisplayScreen = {
$GodotDisplayScreen__deps: ['$GodotConfig', '$GodotOS', '$GL', 'emscripten_webgl_get_current_context'], $GodotDisplayScreen__deps: ['$GodotConfig', '$GodotOS', '$GL', 'emscripten_webgl_get_current_context'],
$GodotDisplayScreen: { $GodotDisplayScreen: {
desired_size: [0, 0], desired_size: [0, 0],
hidpi: true,
getPixelRatio: function () {
return GodotDisplayScreen.hidpi ? window.devicePixelRatio || 1 : 1;
},
isFullscreen: function () { isFullscreen: function () {
const elem = document.fullscreenElement || document.mozFullscreenElement const elem = document.fullscreenElement || document.mozFullscreenElement
|| document.webkitFullscreenElement || document.msFullscreenElement; || document.webkitFullscreenElement || document.msFullscreenElement;
@ -477,7 +481,7 @@ const GodotDisplayScreen = {
} }
return 0; return 0;
} }
const scale = window.devicePixelRatio || 1; const scale = GodotDisplayScreen.getPixelRatio();
if (isFullscreen || wantsFullWindow) { if (isFullscreen || wantsFullWindow) {
// We need to match screen size. // We need to match screen size.
width = window.innerWidth * scale; width = window.innerWidth * scale;
@ -555,7 +559,7 @@ const GodotDisplay = {
godot_js_display_pixel_ratio_get__sig: 'f', godot_js_display_pixel_ratio_get__sig: 'f',
godot_js_display_pixel_ratio_get: function () { godot_js_display_pixel_ratio_get: function () {
return window.devicePixelRatio || 1; return GodotDisplayScreen.getPixelRatio();
}, },
godot_js_display_fullscreen_request__sig: 'i', godot_js_display_fullscreen_request__sig: 'i',
@ -581,7 +585,7 @@ const GodotDisplay = {
godot_js_display_screen_size_get__sig: 'vii', godot_js_display_screen_size_get__sig: 'vii',
godot_js_display_screen_size_get: function (width, height) { godot_js_display_screen_size_get: function (width, height) {
const scale = window.devicePixelRatio || 1; const scale = GodotDisplayScreen.getPixelRatio();
GodotRuntime.setHeapValue(width, window.screen.width * scale, 'i32'); GodotRuntime.setHeapValue(width, window.screen.width * scale, 'i32');
GodotRuntime.setHeapValue(height, window.screen.height * scale, 'i32'); GodotRuntime.setHeapValue(height, window.screen.height * scale, 'i32');
}, },
@ -776,8 +780,8 @@ const GodotDisplay = {
GodotDisplayListeners.add(canvas, 'drop', GodotDisplayDragDrop.handler(dropFiles)); GodotDisplayListeners.add(canvas, 'drop', GodotDisplayDragDrop.handler(dropFiles));
}, },
godot_js_display_setup_canvas__sig: 'viii', godot_js_display_setup_canvas__sig: 'viiii',
godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen) { godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen, p_hidpi) {
const canvas = GodotConfig.canvas; const canvas = GodotConfig.canvas;
GodotDisplayListeners.add(canvas, 'contextmenu', function (ev) { GodotDisplayListeners.add(canvas, 'contextmenu', function (ev) {
ev.preventDefault(); ev.preventDefault();
@ -786,6 +790,7 @@ const GodotDisplay = {
alert('WebGL context lost, please reload the page'); // eslint-disable-line no-alert alert('WebGL context lost, please reload the page'); // eslint-disable-line no-alert
ev.preventDefault(); ev.preventDefault();
}, false); }, false);
GodotDisplayScreen.hidpi = !!p_hidpi;
switch (GodotConfig.canvas_resize_policy) { switch (GodotConfig.canvas_resize_policy) {
case 0: // None case 0: // None
GodotDisplayScreen.desired_size = [canvas.width, canvas.height]; GodotDisplayScreen.desired_size = [canvas.width, canvas.height];

View file

@ -782,7 +782,8 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver,
video_mode = p_desired; video_mode = p_desired;
// fullscreen_change_callback will correct this if the request is successful. // fullscreen_change_callback will correct this if the request is successful.
video_mode.fullscreen = false; video_mode.fullscreen = false;
godot_js_display_setup_canvas(video_mode.width, video_mode.height, video_mode.fullscreen); // Handle contextmenu, webglcontextlost // Handle contextmenu, webglcontextlost, initial canvas setup.
godot_js_display_setup_canvas(video_mode.width, video_mode.height, video_mode.fullscreen, is_hidpi_allowed() ? 1 : 0);
swap_ok_cancel = godot_js_display_is_swap_ok_cancel() == 1; swap_ok_cancel = godot_js_display_is_swap_ok_cancel() == 1;