Merge pull request #68778 from bruvzg/ios_icons
[iOS] iOS export improvements.
This commit is contained in:
commit
2e2a3a5f16
2 changed files with 68 additions and 55 deletions
|
@ -164,7 +164,7 @@
|
|||
};
|
||||
buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue