|
@@ -49,6 +49,46 @@ Vector<EditorExportPlatformIOS::ExportArchitecture> EditorExportPlatformIOS::_ge
|
|
|
return archs;
|
|
|
}
|
|
|
|
|
|
+struct IconInfo {
|
|
|
+ const char *preset_key;
|
|
|
+ const char *idiom;
|
|
|
+ const char *export_name;
|
|
|
+ const char *actual_size_side;
|
|
|
+ const char *scale;
|
|
|
+ const char *unscaled_size;
|
|
|
+ const bool force_opaque;
|
|
|
+};
|
|
|
+
|
|
|
+static const IconInfo icon_infos[] = {
|
|
|
+ // Home screen on iPhone
|
|
|
+ { PNAME("icons/iphone_120x120"), "iphone", "Icon-120.png", "120", "2x", "60x60", false },
|
|
|
+ { PNAME("icons/iphone_120x120"), "iphone", "Icon-120.png", "120", "3x", "40x40", false },
|
|
|
+ { PNAME("icons/iphone_180x180"), "iphone", "Icon-180.png", "180", "3x", "60x60", false },
|
|
|
+
|
|
|
+ // Home screen on iPad
|
|
|
+ { PNAME("icons/ipad_76x76"), "ipad", "Icon-76.png", "76", "1x", "76x76", false },
|
|
|
+ { PNAME("icons/ipad_152x152"), "ipad", "Icon-152.png", "152", "2x", "76x76", false },
|
|
|
+ { PNAME("icons/ipad_167x167"), "ipad", "Icon-167.png", "167", "2x", "83.5x83.5", false },
|
|
|
+
|
|
|
+ // App Store
|
|
|
+ { PNAME("icons/app_store_1024x1024"), "ios-marketing", "Icon-1024.png", "1024", "1x", "1024x1024", true },
|
|
|
+
|
|
|
+ // Spotlight
|
|
|
+ { PNAME("icons/spotlight_40x40"), "ipad", "Icon-40.png", "40", "1x", "40x40", false },
|
|
|
+ { PNAME("icons/spotlight_80x80"), "iphone", "Icon-80.png", "80", "2x", "40x40", false },
|
|
|
+ { PNAME("icons/spotlight_80x80"), "ipad", "Icon-80.png", "80", "2x", "40x40", false },
|
|
|
+
|
|
|
+ // Settings
|
|
|
+ { PNAME("icons/settings_58x58"), "iphone", "Icon-58.png", "58", "2x", "29x29", false },
|
|
|
+ { PNAME("icons/settings_58x58"), "ipad", "Icon-58.png", "58", "2x", "29x29", false },
|
|
|
+ { PNAME("icons/settings_87x87"), "iphone", "Icon-87.png", "87", "3x", "29x29", false },
|
|
|
+
|
|
|
+ // Notification
|
|
|
+ { PNAME("icons/notification_40x40"), "iphone", "Icon-40.png", "40", "2x", "20x20", false },
|
|
|
+ { PNAME("icons/notification_40x40"), "ipad", "Icon-40.png", "40", "2x", "20x20", false },
|
|
|
+ { PNAME("icons/notification_60x60"), "iphone", "Icon-60.png", "60", "3x", "20x20", false }
|
|
|
+};
|
|
|
+
|
|
|
struct LoadingScreenInfo {
|
|
|
const char *preset_key;
|
|
|
const char *export_name;
|
|
@@ -139,18 +179,13 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
|
|
|
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/photolibrary_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need access to the photo library"), ""));
|
|
|
r_options->push_back(ExportOption(PropertyInfo(Variant::DICTIONARY, "privacy/photolibrary_usage_description_localized", PROPERTY_HINT_LOCALIZABLE_STRING), Dictionary()));
|
|
|
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/iphone_120x120", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPhone/iPod Touch with Retina display
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/iphone_180x180", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPhone with Retina HD display
|
|
|
-
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_76x76", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_152x152", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad with Retina display
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_167x167", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad Pro
|
|
|
-
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/app_store_1024x1024", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // App Store
|
|
|
-
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_40x40", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Spotlight
|
|
|
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_80x80", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Spotlight on devices with Retina display
|
|
|
-
|
|
|
+ HashSet<String> used_names;
|
|
|
+ for (uint64_t i = 0; i < sizeof(icon_infos) / sizeof(icon_infos[0]); ++i) {
|
|
|
+ if (!used_names.has(icon_infos[i].preset_key)) {
|
|
|
+ used_names.insert(icon_infos[i].preset_key);
|
|
|
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, icon_infos[i].preset_key, PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), ""));
|
|
|
+ }
|
|
|
+ }
|
|
|
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,*.jpg,*.jpeg"), ""));
|
|
@@ -531,36 +566,6 @@ void EditorExportPlatformIOS::_blend_and_rotate(Ref<Image> &p_dst, Ref<Image> &p
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-struct IconInfo {
|
|
|
- const char *preset_key;
|
|
|
- const char *idiom;
|
|
|
- const char *export_name;
|
|
|
- const char *actual_size_side;
|
|
|
- const char *scale;
|
|
|
- const char *unscaled_size;
|
|
|
- const bool force_opaque;
|
|
|
-};
|
|
|
-
|
|
|
-static const IconInfo icon_infos[] = {
|
|
|
- // Home screen on iPhone
|
|
|
- { "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "2x", "60x60", false },
|
|
|
- { "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "3x", "40x40", false },
|
|
|
- { "icons/iphone_180x180", "iphone", "Icon-180.png", "180", "3x", "60x60", false },
|
|
|
-
|
|
|
- // Home screen on iPad
|
|
|
- { "icons/ipad_76x76", "ipad", "Icon-76.png", "76", "1x", "76x76", false },
|
|
|
- { "icons/ipad_152x152", "ipad", "Icon-152.png", "152", "2x", "76x76", false },
|
|
|
- { "icons/ipad_167x167", "ipad", "Icon-167.png", "167", "2x", "83.5x83.5", false },
|
|
|
-
|
|
|
- // App Store
|
|
|
- { "icons/app_store_1024x1024", "ios-marketing", "Icon-1024.png", "1024", "1x", "1024x1024", true },
|
|
|
-
|
|
|
- // Spotlight
|
|
|
- { "icons/spotlight_40x40", "ipad", "Icon-40.png", "40", "1x", "40x40", false },
|
|
|
- { "icons/spotlight_80x80", "iphone", "Icon-80.png", "80", "2x", "40x40", false },
|
|
|
- { "icons/spotlight_80x80", "ipad", "Icon-80.png", "80", "2x", "40x40", false }
|
|
|
-};
|
|
|
-
|
|
|
Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_preset, const String &p_iconset_dir) {
|
|
|
String json_description = "{\"images\":[";
|
|
|
String sizes;
|
|
@@ -568,6 +573,8 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
|
|
Ref<DirAccess> da = DirAccess::open(p_iconset_dir);
|
|
|
ERR_FAIL_COND_V_MSG(da.is_null(), ERR_CANT_OPEN, "Cannot open directory '" + p_iconset_dir + "'.");
|
|
|
|
|
|
+ Color boot_bg_color = GLOBAL_GET("application/boot_splash/bg_color");
|
|
|
+
|
|
|
for (uint64_t i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) {
|
|
|
IconInfo info = icon_infos[i];
|
|
|
int side_size = String(info.actual_size_side).to_int();
|
|
@@ -580,13 +587,17 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
|
|
if (err != OK) {
|
|
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
|
|
return ERR_UNCONFIGURED;
|
|
|
+ } else if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
|
|
|
+ add_message(EXPORT_MESSAGE_WARNING, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
|
|
|
+ img->resize(side_size, side_size);
|
|
|
+ Ref<Image> new_img = Image::create_empty(side_size, side_size, false, Image::FORMAT_RGBA8);
|
|
|
+ new_img->fill(boot_bg_color);
|
|
|
+ _blend_and_rotate(new_img, img, false);
|
|
|
+ err = new_img->save_png(p_iconset_dir + info.export_name);
|
|
|
+ } else {
|
|
|
+ img->resize(side_size, side_size);
|
|
|
+ err = img->save_png(p_iconset_dir + info.export_name);
|
|
|
}
|
|
|
- if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
|
|
|
- add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
|
|
|
- return ERR_UNCONFIGURED;
|
|
|
- }
|
|
|
- img->resize(side_size, side_size);
|
|
|
- err = img->save_png(p_iconset_dir + info.export_name);
|
|
|
if (err) {
|
|
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Failed to export icon (%s): '%s'.", info.preset_key, icon_path));
|
|
|
return err;
|
|
@@ -598,12 +609,14 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
|
|
if (err != OK) {
|
|
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
|
|
return ERR_UNCONFIGURED;
|
|
|
- }
|
|
|
- if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
|
|
|
- add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
|
|
|
- return ERR_UNCONFIGURED;
|
|
|
- }
|
|
|
- if (img->get_width() != side_size || img->get_height() != side_size) {
|
|
|
+ } else if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
|
|
|
+ add_message(EXPORT_MESSAGE_WARNING, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
|
|
|
+ img->resize(side_size, side_size);
|
|
|
+ Ref<Image> new_img = Image::create_empty(side_size, side_size, false, Image::FORMAT_RGBA8);
|
|
|
+ new_img->fill(boot_bg_color);
|
|
|
+ _blend_and_rotate(new_img, img, false);
|
|
|
+ err = new_img->save_png(p_iconset_dir + info.export_name);
|
|
|
+ } else if (img->get_width() != side_size || img->get_height() != side_size) {
|
|
|
add_message(EXPORT_MESSAGE_WARNING, TTR("Export Icons"), vformat("Icon (%s): '%s' has incorrect size %s and was automatically resized to %s.", info.preset_key, icon_path, img->get_size(), Vector2i(side_size, side_size)));
|
|
|
img->resize(side_size, side_size);
|
|
|
err = img->save_png(p_iconset_dir + info.export_name);
|