mirror of
https://github.com/Genymobile/scrcpy.git
synced 2026-04-21 01:33:36 +00:00
Add --render-fit feature
Add an option to configure how the rendering fits the window. The default, `--render-fit=letterbox`, preserves the aspect ratio and fits the window as best as possible, adding black bars at the top/bottom or left/right if needed. This has been the only behavior scrcpy supported so far. Another mode, `--render-fit=disabled`, renders the display at the top-left corner without scaling. This mode will be useful for virtual display resizing.
This commit is contained in:
parent
3b068b669e
commit
f7c5f71ea0
9 changed files with 76 additions and 2 deletions
|
|
@ -105,6 +105,7 @@ enum {
|
|||
OPT_CAMERA_ZOOM,
|
||||
OPT_MIN_SIZE_ALIGNMENT,
|
||||
OPT_NO_WINDOW_ASPECT_RATIO_LOCK,
|
||||
OPT_RENDER_FIT,
|
||||
};
|
||||
|
||||
struct sc_option {
|
||||
|
|
@ -777,6 +778,20 @@ static const struct sc_option options[] = {
|
|||
"\"opengles2\", \"opengles\", \"metal\" and \"software\".\n"
|
||||
"<https://wiki.libsdl.org/SDL_HINT_RENDER_DRIVER>",
|
||||
},
|
||||
{
|
||||
.longopt_id = OPT_RENDER_FIT,
|
||||
.longopt = "render-fit",
|
||||
.argdesc = "mode",
|
||||
.text = "Set the render-fit mode to configure how the rendering fits "
|
||||
"the window.\n"
|
||||
"Possible values are \"letterbox\" and \"disabled\".\n"
|
||||
"\"letterbox\": preserve the aspect ratio and fit the window "
|
||||
"as best as possible (black bars are added either at the top "
|
||||
"and bottom or at the sides if needed).\n"
|
||||
"\"disabled\": render the display at the top-left corner, "
|
||||
"without scaling.\n"
|
||||
"Default is \"letterbox\".",
|
||||
},
|
||||
{
|
||||
.longopt_id = OPT_REQUIRE_AUDIO,
|
||||
.longopt = "require-audio",
|
||||
|
|
@ -2322,6 +2337,22 @@ parse_mouse_bindings(const char *s, struct sc_mouse_bindings *mb) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
parse_render_fit(const char *optarg, enum sc_render_fit *mode) {
|
||||
if (!strcmp(optarg, "letterbox")) {
|
||||
*mode = SC_RENDER_FIT_LETTERBOX;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!strcmp(optarg, "disabled")) {
|
||||
*mode = SC_RENDER_FIT_DISABLED;
|
||||
return true;
|
||||
}
|
||||
|
||||
LOGE("Unsupported render-fit: %s (expected letterbox or disabled)", optarg);
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
||||
const char *optstring, const struct option *longopts) {
|
||||
|
|
@ -2755,6 +2786,11 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
|||
case OPT_NO_WINDOW_ASPECT_RATIO_LOCK:
|
||||
opts->window_aspect_ratio_lock = false;
|
||||
break;
|
||||
case OPT_RENDER_FIT:
|
||||
if (!parse_render_fit(optarg, &opts->render_fit)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// getopt prints the error message on stderr
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ const struct scrcpy_options scrcpy_options_default = {
|
|||
.display_orientation = SC_ORIENTATION_0,
|
||||
.record_orientation = SC_ORIENTATION_0,
|
||||
.display_ime_policy = SC_DISPLAY_IME_POLICY_UNDEFINED,
|
||||
.render_fit = SC_RENDER_FIT_LETTERBOX,
|
||||
.window_x = SC_WINDOW_POSITION_UNDEFINED,
|
||||
.window_y = SC_WINDOW_POSITION_UNDEFINED,
|
||||
.window_width = 0,
|
||||
|
|
|
|||
|
|
@ -220,6 +220,11 @@ enum sc_shortcut_mod {
|
|||
SC_SHORTCUT_MOD_RSUPER = 1 << 5,
|
||||
};
|
||||
|
||||
enum sc_render_fit {
|
||||
SC_RENDER_FIT_LETTERBOX,
|
||||
SC_RENDER_FIT_DISABLED,
|
||||
};
|
||||
|
||||
struct sc_port_range {
|
||||
uint16_t first;
|
||||
uint16_t last;
|
||||
|
|
@ -269,6 +274,7 @@ struct scrcpy_options {
|
|||
enum sc_orientation display_orientation;
|
||||
enum sc_orientation record_orientation;
|
||||
enum sc_display_ime_policy display_ime_policy;
|
||||
enum sc_render_fit render_fit;
|
||||
int16_t window_x; // SC_WINDOW_POSITION_UNDEFINED for "auto"
|
||||
int16_t window_y; // SC_WINDOW_POSITION_UNDEFINED for "auto"
|
||||
uint16_t window_width;
|
||||
|
|
|
|||
|
|
@ -814,6 +814,7 @@ aoa_complete:
|
|||
.window_height = options->window_height,
|
||||
.window_aspect_ratio_lock = options->window_aspect_ratio_lock,
|
||||
.window_borderless = options->window_borderless,
|
||||
.render_fit = options->render_fit,
|
||||
.orientation = options->display_orientation,
|
||||
.mipmaps = options->mipmaps,
|
||||
.fullscreen = options->fullscreen,
|
||||
|
|
|
|||
|
|
@ -158,7 +158,16 @@ sc_screen_is_relative_mode(struct sc_screen *screen) {
|
|||
|
||||
static void
|
||||
compute_content_rect(struct sc_size render_size, struct sc_size content_size,
|
||||
bool can_upscale, SDL_FRect *rect) {
|
||||
bool can_upscale, enum sc_render_fit render_fit,
|
||||
SDL_FRect *rect) {
|
||||
if (render_fit == SC_RENDER_FIT_DISABLED) {
|
||||
rect->x = 0;
|
||||
rect->y = 0;
|
||||
rect->w = content_size.width;
|
||||
rect->h = content_size.height;
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_optimal_size(render_size, content_size)) {
|
||||
rect->x = 0;
|
||||
rect->y = 0;
|
||||
|
|
@ -202,7 +211,7 @@ sc_screen_update_content_rect(struct sc_screen *screen) {
|
|||
struct sc_size render_size =
|
||||
sc_sdl_get_render_output_size(screen->renderer);
|
||||
compute_content_rect(render_size, screen->content_size, can_upscale,
|
||||
&screen->rect);
|
||||
screen->render_fit, &screen->rect);
|
||||
}
|
||||
|
||||
// render the texture to the renderer
|
||||
|
|
@ -406,6 +415,7 @@ sc_screen_init(struct sc_screen *screen,
|
|||
screen->video = params->video;
|
||||
screen->camera = params->camera;
|
||||
screen->window_aspect_ratio_lock = params->window_aspect_ratio_lock;
|
||||
screen->render_fit = params->render_fit;
|
||||
|
||||
screen->req.x = params->window_x;
|
||||
screen->req.y = params->window_y;
|
||||
|
|
|
|||
|
|
@ -65,6 +65,8 @@ struct sc_screen {
|
|||
SDL_GLContext gl_context;
|
||||
#endif
|
||||
|
||||
enum sc_render_fit render_fit;
|
||||
|
||||
struct sc_size frame_size;
|
||||
struct sc_size content_size; // rotated frame_size
|
||||
|
||||
|
|
@ -118,6 +120,7 @@ struct sc_screen_params {
|
|||
bool window_aspect_ratio_lock;
|
||||
bool window_borderless;
|
||||
|
||||
enum sc_render_fit render_fit;
|
||||
enum sc_orientation orientation;
|
||||
bool mipmaps;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue