[iOS] iOS export improvements.
Add export options to set Settings and Notification icons on export. Automatically fill background of the app store icon instead of failing (with warning). Update development region to use `en` instead of `English`.
This commit is contained in:
parent
966785751f
commit
7467067d23
2 changed files with 68 additions and 55 deletions
|
@ -164,7 +164,7 @@
|
||||||
};
|
};
|
||||||
buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */;
|
buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */;
|
||||||
compatibilityVersion = "Xcode 3.2";
|
compatibilityVersion = "Xcode 3.2";
|
||||||
developmentRegion = English;
|
developmentRegion = en;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
en,
|
en,
|
||||||
|
|
|
@ -49,6 +49,46 @@ Vector<EditorExportPlatformIOS::ExportArchitecture> EditorExportPlatformIOS::_ge
|
||||||
return archs;
|
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 {
|
struct LoadingScreenInfo {
|
||||||
const char *preset_key;
|
const char *preset_key;
|
||||||
const char *export_name;
|
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::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::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
|
HashSet<String> used_names;
|
||||||
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
|
for (uint64_t i = 0; i < sizeof(icon_infos) / sizeof(icon_infos[0]); ++i) {
|
||||||
|
if (!used_names.has(icon_infos[i].preset_key)) {
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_76x76", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad
|
used_names.insert(icon_infos[i].preset_key);
|
||||||
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, icon_infos[i].preset_key, PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), ""));
|
||||||
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
|
|
||||||
|
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_launch_screen_storyboard"), false));
|
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::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"), ""));
|
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) {
|
Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_preset, const String &p_iconset_dir) {
|
||||||
String json_description = "{\"images\":[";
|
String json_description = "{\"images\":[";
|
||||||
String sizes;
|
String sizes;
|
||||||
|
@ -568,6 +573,8 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
||||||
Ref<DirAccess> da = DirAccess::open(p_iconset_dir);
|
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 + "'.");
|
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) {
|
for (uint64_t i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) {
|
||||||
IconInfo info = icon_infos[i];
|
IconInfo info = icon_infos[i];
|
||||||
int side_size = String(info.actual_size_side).to_int();
|
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) {
|
if (err != OK) {
|
||||||
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
||||||
return ERR_UNCONFIGURED;
|
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) {
|
if (err) {
|
||||||
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Failed to export icon (%s): '%s'.", info.preset_key, icon_path));
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Failed to export icon (%s): '%s'.", info.preset_key, icon_path));
|
||||||
return err;
|
return err;
|
||||||
|
@ -598,12 +609,14 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
|
||||||
return ERR_UNCONFIGURED;
|
return ERR_UNCONFIGURED;
|
||||||
}
|
} else if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
|
||||||
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));
|
||||||
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
|
img->resize(side_size, side_size);
|
||||||
return ERR_UNCONFIGURED;
|
Ref<Image> new_img = Image::create_empty(side_size, side_size, false, Image::FORMAT_RGBA8);
|
||||||
}
|
new_img->fill(boot_bg_color);
|
||||||
if (img->get_width() != side_size || img->get_height() != side_size) {
|
_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)));
|
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);
|
img->resize(side_size, side_size);
|
||||||
err = img->save_png(p_iconset_dir + info.export_name);
|
err = img->save_png(p_iconset_dir + info.export_name);
|
||||||
|
|
Loading…
Add table
Reference in a new issue