Browse Source

iOS Export: Storyboard custom values

Sergey Minakov 5 years ago
parent
commit
96e204bb0d
1 changed files with 82 additions and 26 deletions
  1. 82 26
      platform/iphone/export/export.cpp

+ 82 - 26
platform/iphone/export/export.cpp

@@ -257,6 +257,11 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
 	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/spotlight_80x80", PROPERTY_HINT_FILE, "*.png"), "")); // Spotlight on devices with retina display
 
 	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_launch_screen_storyboard"), false));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "storyboard/image_scale_mode", PROPERTY_HINT_ENUM, "Same as Logo,Center,Scale To Fit,Scale To Fill,Scale"), 0));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@2x", PROPERTY_HINT_FILE, "*.png"), ""));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@3x", PROPERTY_HINT_FILE, "*.png"), ""));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_custom_bg_color"), false));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::COLOR, "storyboard/custom_bg_color"), Color()));
 
 	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "launch_screens/generate_missing"), false));
 
@@ -277,6 +282,12 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_
 		"ad-hoc",
 		"enterprise"
 	};
+	static const String storyboard_image_scale_mode[] = {
+		"center",
+		"scaleAspectFit",
+		"scaleAspectFill",
+		"scaleToFill"
+	};
 	String str;
 	String strnew;
 	str.parse_utf8((const char *)pfile.ptr(), pfile.size());
@@ -418,13 +429,25 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_
 			String value = is_on ? "" : "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;";
 			strnew += lines[i].replace("$pbx_launch_image_usage_setting", value) + "\n";
 		} else if (lines[i].find("$launch_screen_image_mode") != -1) {
-			String logo_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
-			bool is_on = ProjectSettings::get_singleton()->get("application/boot_splash/fullsize");
-			// If custom logo is not specified, Godot does not scale default one, so we should do the same.
-			String value = (is_on && logo_path.length() > 0) ? "scaleAspectFit" : "center";
+			int image_scale_mode = p_preset->get("storyboard/image_scale_mode");
+			String value;
+
+			switch (image_scale_mode) {
+				case 0: {
+					String logo_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
+					bool is_on = ProjectSettings::get_singleton()->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];
+				}
+			}
+
 			strnew += lines[i].replace("$launch_screen_image_mode", value) + "\n";
 		} else if (lines[i].find("$launch_screen_background_color") != -1) {
-			Color color = ProjectSettings::get_singleton()->get("application/boot_splash/bg_color");
+			bool use_custom = p_preset->get("storyboard/use_custom_bg_color");
+			Color color = use_custom ? p_preset->get("storyboard/custom_bg_color") : ProjectSettings::get_singleton()->get("application/boot_splash/bg_color");
 			const String value_format = "red=\"$red\" green=\"$green\" blue=\"$blue\" alpha=\"$alpha\"";
 
 			Dictionary value_dictionary;
@@ -637,35 +660,68 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
 }
 
 Error EditorExportPlatformIOS::_export_loading_screen_file(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir) {
-	Ref<Image> splash;
+	const String custom_launch_image_2x = p_preset->get("storyboard/custom_image@2x");
+	const String custom_launch_image_3x = p_preset->get("storyboard/custom_image@3x");
 
-	const String splash_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
+	if (custom_launch_image_2x.length() > 0 && custom_launch_image_3x.length() > 0) {
+		Ref<Image> image;
+		String image_path = p_dest_dir.plus_file("[email protected]");
+		image.instance();
+		Error err = image->load(custom_launch_image_2x);
 
-	if (!splash_path.empty()) {
-		splash.instance();
-		const Error err = splash->load(splash_path);
 		if (err) {
-			splash.unref();
+			image.unref();
+			return err;
 		}
-	}
 
-	if (splash.is_null()) {
-		splash = Ref<Image>(memnew(Image(boot_splash_png)));
-	}
+		if (image->save_png(image_path) != OK) {
+			return ERR_FILE_CANT_WRITE;
+		}
 
-	// Using same image for both @2x and @3x
-	// because Godot's own boot logo uses single image for all resolutions.
-	// Also not using @1x image, because devices using this image variant
-	// are not supported by iOS 9, which is minimal target.
-	const String splash_png_path_2x = p_dest_dir.plus_file("[email protected]");
-	const String splash_png_path_3x = p_dest_dir.plus_file("[email protected]");
+		image.unref();
+		image_path = p_dest_dir.plus_file("[email protected]");
+		image.instance();
+		err = image->load(custom_launch_image_3x);
 
-	if (splash->save_png(splash_png_path_2x) != OK) {
-		return ERR_FILE_CANT_WRITE;
-	}
+		if (err) {
+			image.unref();
+			return err;
+		}
+
+		if (image->save_png(image_path) != OK) {
+			return ERR_FILE_CANT_WRITE;
+		}
+	} else {
+		Ref<Image> splash;
+
+		const String splash_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
+
+		if (!splash_path.empty()) {
+			splash.instance();
+			const Error err = splash->load(splash_path);
+			if (err) {
+				splash.unref();
+			}
+		}
 
-	if (splash->save_png(splash_png_path_3x) != OK) {
-		return ERR_FILE_CANT_WRITE;
+		if (splash.is_null()) {
+			splash = Ref<Image>(memnew(Image(boot_splash_png)));
+		}
+
+		// Using same image for both @2x and @3x
+		// because Godot's own boot logo uses single image for all resolutions.
+		// Also not using @1x image, because devices using this image variant
+		// are not supported by iOS 9, which is minimal target.
+		const String splash_png_path_2x = p_dest_dir.plus_file("[email protected]");
+		const String splash_png_path_3x = p_dest_dir.plus_file("[email protected]");
+
+		if (splash->save_png(splash_png_path_2x) != OK) {
+			return ERR_FILE_CANT_WRITE;
+		}
+
+		if (splash->save_png(splash_png_path_3x) != OK) {
+			return ERR_FILE_CANT_WRITE;
+		}
 	}
 
 	return OK;