未验证 提交 4f6f390b 编写于 作者: S stuartmorgan 提交者: GitHub

Allow overriding the GLFW pixel ratio (#11388)

Allows a client to set a specific pixel ratio rather than using one
computed based on the screen details.

Fixes https://github.com/flutter/flutter/issues/37620
上级 6f911ab3
......@@ -80,6 +80,14 @@ class FlutterWindow {
return FlutterDesktopWindowGetScaleFactor(window_);
}
// Forces a specific pixel ratio for Flutter rendering, rather than one
// computed automatically from screen information.
//
// To clear a previously set override, pass an override value of zero.
void SetPixelRatioOverride(double pixel_ratio) {
FlutterDesktopWindowSetPixelRatioOverride(window_, pixel_ratio);
}
private:
// Handle for interacting with the C API's window.
//
......
......@@ -115,6 +115,14 @@ double FlutterDesktopWindowGetScaleFactor(
return 1.0;
}
void FlutterDesktopWindowSetPixelRatioOverride(
FlutterDesktopWindowRef flutter_window,
double pixel_ratio) {
if (s_stub_implementation) {
return s_stub_implementation->SetPixelRatioOverride(pixel_ratio);
}
}
bool FlutterDesktopRunWindowEventLoopWithTimeout(
FlutterDesktopWindowControllerRef controller,
uint32_t millisecond_timeout) {
......
......@@ -65,6 +65,9 @@ class StubFlutterGlfwApi {
// Called for FlutterDesktopWindowGetScaleFactor.
virtual double GetWindowScaleFactor() { return 1.0; }
// Called for FlutterDesktopWindowSetPixelRatioOverride.
virtual void SetPixelRatioOverride(double pixel_ratio) {}
// Called for FlutterDesktopRunWindowEventLoopWithTimeout.
virtual bool RunWindowEventLoopWithTimeout(uint32_t millisecond_timeout) {
return true;
......
......@@ -92,6 +92,10 @@ struct FlutterDesktopWindow {
// The ratio of pixels per screen coordinate for the window.
double pixels_per_screen_coordinate = 1.0;
// If non-zero, a forced pixel ratio to use instead of one computed based on
// screen information.
double pixel_ratio_override = 0.0;
// Resizing triggers a window refresh, but the resize already updates Flutter.
// To avoid double messages, the refresh after each resize is skipped.
bool skip_next_window_refresh = false;
......@@ -177,9 +181,14 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* state,
event.struct_size = sizeof(event);
event.width = width;
event.height = height;
// The Flutter pixel_ratio is defined as DPI/dp. Limit the ratio to a minimum
// of 1 to avoid rendering a smaller UI on standard resolution monitors.
event.pixel_ratio = std::max(dpi / kDpPerInch, 1.0);
if (state->window_wrapper->pixel_ratio_override == 0.0) {
// The Flutter pixel_ratio is defined as DPI/dp. Limit the ratio to a
// minimum of 1 to avoid rendering a smaller UI on standard resolution
// monitors.
event.pixel_ratio = std::max(dpi / kDpPerInch, 1.0);
} else {
event.pixel_ratio = state->window_wrapper->pixel_ratio_override;
}
FlutterEngineSendWindowMetricsEvent(state->engine, &event);
}
......@@ -714,6 +723,19 @@ double FlutterDesktopWindowGetScaleFactor(
return flutter_window->pixels_per_screen_coordinate;
}
void FlutterDesktopWindowSetPixelRatioOverride(
FlutterDesktopWindowRef flutter_window,
double pixel_ratio) {
flutter_window->pixel_ratio_override = pixel_ratio;
// Send a metrics update using the new pixel ratio.
int width_px, height_px;
glfwGetFramebufferSize(flutter_window->window, &width_px, &height_px);
if (width_px > 0 && height_px > 0) {
auto* state = GetSavedWindowState(flutter_window->window);
SendWindowMetrics(state, width_px, height_px);
}
}
bool FlutterDesktopRunWindowEventLoopWithTimeout(
FlutterDesktopWindowControllerRef controller,
uint32_t timeout_milliseconds) {
......
......@@ -159,6 +159,14 @@ FLUTTER_EXPORT void FlutterDesktopWindowSetFrame(
FLUTTER_EXPORT double FlutterDesktopWindowGetScaleFactor(
FlutterDesktopWindowRef flutter_window);
// Forces a specific pixel ratio for Flutter rendering in |flutter_window|,
// rather than one computed automatically from screen information.
//
// To clear a previously set override, pass an override value of zero.
FLUTTER_EXPORT void FlutterDesktopWindowSetPixelRatioOverride(
FlutterDesktopWindowRef flutter_window,
double pixel_ratio);
// Runs an instance of a headless Flutter engine.
//
// Returns a null pointer in the event of an error.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册