mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 10:11:57 +03:00
Merge pull request #102668 from jkirsteins/janiskirsteins/ios-aspect-fill-splash
[iOS] Sync the boot splash and the launch screen image scale modes
This commit is contained in:
@@ -198,6 +198,19 @@ static const DataCollectionInfo data_collect_purpose_info[] = {
|
||||
{ "Other", "NSPrivacyCollectedDataTypePurposeOther" },
|
||||
};
|
||||
|
||||
static const String export_method_string[] = {
|
||||
"app-store",
|
||||
"development",
|
||||
"ad-hoc",
|
||||
"enterprise"
|
||||
};
|
||||
static const String storyboard_image_scale_mode[] = {
|
||||
"center",
|
||||
"scaleAspectFit",
|
||||
"scaleAspectFill",
|
||||
"scaleToFill"
|
||||
};
|
||||
|
||||
String EditorExportPlatformIOS::get_export_option_warning(const EditorExportPreset *p_preset, const StringName &p_name) const {
|
||||
if (p_preset) {
|
||||
if (p_name == "application/app_store_team_id") {
|
||||
@@ -402,19 +415,28 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
|
||||
r_options->push_back(ExportOption(PropertyInfo(Variant::COLOR, "storyboard/custom_bg_color"), Color()));
|
||||
}
|
||||
|
||||
HashMap<String, Variant> EditorExportPlatformIOS::get_custom_project_settings(const Ref<EditorExportPreset> &p_preset) const {
|
||||
HashMap<String, Variant> settings;
|
||||
|
||||
int image_scale_mode = p_preset->get("storyboard/image_scale_mode");
|
||||
String value;
|
||||
|
||||
switch (image_scale_mode) {
|
||||
case 0: {
|
||||
String logo_path = GLOBAL_GET("application/boot_splash/image");
|
||||
bool is_on = GLOBAL_GET("application/boot_splash/fullsize");
|
||||
// If custom logo is not specified, Godot does not scale default one, so we should do the same.
|
||||
value = (is_on && logo_path.length() > 0) ? "scaleAspectFit" : "center";
|
||||
} break;
|
||||
default: {
|
||||
value = storyboard_image_scale_mode[image_scale_mode - 1];
|
||||
}
|
||||
}
|
||||
settings["ios/launch_screen_image_mode"] = value;
|
||||
return settings;
|
||||
}
|
||||
|
||||
void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &pfile, const IOSConfigData &p_config, bool p_debug) {
|
||||
static const String export_method_string[] = {
|
||||
"app-store",
|
||||
"development",
|
||||
"ad-hoc",
|
||||
"enterprise"
|
||||
};
|
||||
static const String storyboard_image_scale_mode[] = {
|
||||
"center",
|
||||
"scaleAspectFit",
|
||||
"scaleAspectFill",
|
||||
"scaleToFill"
|
||||
};
|
||||
String dbg_sign_id = p_preset->get("application/code_sign_identity_debug").operator String().is_empty() ? "iPhone Developer" : p_preset->get("application/code_sign_identity_debug");
|
||||
String rel_sign_id = p_preset->get("application/code_sign_identity_release").operator String().is_empty() ? "iPhone Distribution" : p_preset->get("application/code_sign_identity_release");
|
||||
bool dbg_manual = !p_preset->get_or_env("application/provisioning_profile_uuid_debug", ENV_IOS_PROFILE_UUID_DEBUG).operator String().is_empty() || (dbg_sign_id != "iPhone Developer" && dbg_sign_id != "iPhone Distribution");
|
||||
|
||||
@@ -203,6 +203,8 @@ public:
|
||||
return list;
|
||||
}
|
||||
|
||||
virtual HashMap<String, Variant> get_custom_project_settings(const Ref<EditorExportPreset> &p_preset) const override;
|
||||
|
||||
virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, BitField<EditorExportPlatform::DebugFlags> p_flags = 0) override;
|
||||
|
||||
virtual bool has_valid_export_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug = false) const override;
|
||||
|
||||
@@ -132,6 +132,8 @@ public:
|
||||
|
||||
void on_enter_background();
|
||||
void on_exit_background();
|
||||
|
||||
virtual Rect2 calculate_boot_screen_rect(const Size2 &p_window_size, const Size2 &p_imgrect_size) const override;
|
||||
};
|
||||
|
||||
#endif // IOS_ENABLED
|
||||
|
||||
@@ -86,6 +86,46 @@ void register_dynamic_symbol(char *name, void *address) {
|
||||
OS_IOS::dynamic_symbol_lookup_table[String(name)] = address;
|
||||
}
|
||||
|
||||
Rect2 fit_keep_aspect_centered(const Vector2 &p_container, const Vector2 &p_rect) {
|
||||
real_t available_ratio = p_container.width / p_container.height;
|
||||
real_t fit_ratio = p_rect.width / p_rect.height;
|
||||
Rect2 result;
|
||||
if (fit_ratio < available_ratio) {
|
||||
// Fit height - we'll have horizontal gaps
|
||||
result.size.height = p_container.height;
|
||||
result.size.width = p_container.height * fit_ratio;
|
||||
result.position.y = 0;
|
||||
result.position.x = (p_container.width - result.size.width) * 0.5f;
|
||||
} else {
|
||||
// Fit width - we'll have vertical gaps
|
||||
result.size.width = p_container.width;
|
||||
result.size.height = p_container.width / fit_ratio;
|
||||
result.position.x = 0;
|
||||
result.position.y = (p_container.height - result.size.height) * 0.5f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Rect2 fit_keep_aspect_covered(const Vector2 &p_container, const Vector2 &p_rect) {
|
||||
real_t available_ratio = p_container.width / p_container.height;
|
||||
real_t fit_ratio = p_rect.width / p_rect.height;
|
||||
Rect2 result;
|
||||
if (fit_ratio < available_ratio) {
|
||||
// Need to scale up to fit width, and crop height
|
||||
result.size.width = p_container.width;
|
||||
result.size.height = p_container.width / fit_ratio;
|
||||
result.position.x = 0;
|
||||
result.position.y = (p_container.height - result.size.height) * 0.5f;
|
||||
} else {
|
||||
// Need to scale up to fit height, and crop width
|
||||
result.size.width = p_container.height * fit_ratio;
|
||||
result.size.height = p_container.height;
|
||||
result.position.x = (p_container.width - result.size.width) * 0.5f;
|
||||
result.position.y = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
OS_IOS *OS_IOS::get_singleton() {
|
||||
return (OS_IOS *)OS::get_singleton();
|
||||
}
|
||||
@@ -660,4 +700,21 @@ void OS_IOS::on_exit_background() {
|
||||
}
|
||||
}
|
||||
|
||||
Rect2 OS_IOS::calculate_boot_screen_rect(const Size2 &p_window_size, const Size2 &p_imgrect_size) const {
|
||||
String scalemodestr = GLOBAL_GET("ios/launch_screen_image_mode");
|
||||
|
||||
if (scalemodestr == "scaleAspectFit") {
|
||||
return fit_keep_aspect_centered(p_window_size, p_imgrect_size);
|
||||
} else if (scalemodestr == "scaleAspectFill") {
|
||||
return fit_keep_aspect_covered(p_window_size, p_imgrect_size);
|
||||
} else if (scalemodestr == "scaleToFill") {
|
||||
return Rect2(Point2(), p_window_size);
|
||||
} else if (scalemodestr == "center") {
|
||||
return OS_Unix::calculate_boot_screen_rect(p_window_size, p_imgrect_size);
|
||||
} else {
|
||||
WARN_PRINT(vformat("Boot screen scale mode mismatch between iOS and Godot: %s not supported", scalemodestr));
|
||||
return OS_Unix::calculate_boot_screen_rect(p_window_size, p_imgrect_size);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // IOS_ENABLED
|
||||
|
||||
Reference in New Issue
Block a user