Skip to content

Commit 59402ff

Browse files
authored
Merge pull request #64631 from nathanfranke/3-ios-opaque
(3.x) iOS: Force app store icon to be opaque, use proper errors, fix memory leak
2 parents 8388ea1 + da3aecf commit 59402ff

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

platform/iphone/export/export.cpp

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -415,27 +415,27 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
415415
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/microphone_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need to use the microphone"), ""));
416416
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"), ""));
417417

418-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/iphone_120x120", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPhone/iPod Touch with Retina display
419-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/iphone_180x180", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPhone with Retina HD display
418+
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
419+
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
420420

421-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_76x76", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPad
422-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_152x152", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPad with Retina display
423-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_167x167", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPad Pro
421+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_76x76", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad
422+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_152x152", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad with Retina display
423+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/ipad_167x167", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Home screen on iPad Pro
424424

425-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/app_store_1024x1024", PROPERTY_HINT_FILE, "*.png"), "")); // App Store
425+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/app_store_1024x1024", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // App Store
426426

427-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_40x40", PROPERTY_HINT_FILE, "*.png"), "")); // Spotlight
428-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_80x80", PROPERTY_HINT_FILE, "*.png"), "")); // Spotlight on devices with Retina display
427+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_40x40", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Spotlight
428+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "icons/spotlight_80x80", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); // Spotlight on devices with Retina display
429429

430430
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_launch_screen_storyboard"), false));
431431
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));
432-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@2x", PROPERTY_HINT_FILE, "*.png"), ""));
433-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@3x", PROPERTY_HINT_FILE, "*.png"), ""));
432+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@2x", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), ""));
433+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@3x", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), ""));
434434
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_custom_bg_color"), false));
435435
r_options->push_back(ExportOption(PropertyInfo(Variant::COLOR, "storyboard/custom_bg_color"), Color()));
436436

437437
for (uint64_t i = 0; i < sizeof(loading_screen_infos) / sizeof(loading_screen_infos[0]); ++i) {
438-
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, loading_screen_infos[i].preset_key, PROPERTY_HINT_FILE, "*.png"), ""));
438+
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, loading_screen_infos[i].preset_key, PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), ""));
439439
}
440440
}
441441

@@ -812,26 +812,27 @@ struct IconInfo {
812812
const char *actual_size_side;
813813
const char *scale;
814814
const char *unscaled_size;
815+
const bool force_opaque;
815816
};
816817

817818
static const IconInfo icon_infos[] = {
818819
// Home screen on iPhone
819-
{ "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "2x", "60x60" },
820-
{ "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "3x", "40x40" },
821-
{ "icons/iphone_180x180", "iphone", "Icon-180.png", "180", "3x", "60x60" },
820+
{ "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "2x", "60x60", false },
821+
{ "icons/iphone_120x120", "iphone", "Icon-120.png", "120", "3x", "40x40", false },
822+
{ "icons/iphone_180x180", "iphone", "Icon-180.png", "180", "3x", "60x60", false },
822823

823824
// Home screen on iPad
824-
{ "icons/ipad_76x76", "ipad", "Icon-76.png", "76", "1x", "76x76" },
825-
{ "icons/ipad_152x152", "ipad", "Icon-152.png", "152", "2x", "76x76" },
826-
{ "icons/ipad_167x167", "ipad", "Icon-167.png", "167", "2x", "83.5x83.5" },
825+
{ "icons/ipad_76x76", "ipad", "Icon-76.png", "76", "1x", "76x76", false },
826+
{ "icons/ipad_152x152", "ipad", "Icon-152.png", "152", "2x", "76x76", false },
827+
{ "icons/ipad_167x167", "ipad", "Icon-167.png", "167", "2x", "83.5x83.5", false },
827828

828829
// App Store
829-
{ "icons/app_store_1024x1024", "ios-marketing", "Icon-1024.png", "1024", "1x", "1024x1024" },
830+
{ "icons/app_store_1024x1024", "ios-marketing", "Icon-1024.png", "1024", "1x", "1024x1024", true },
830831

831832
// Spotlight
832-
{ "icons/spotlight_40x40", "ipad", "Icon-40.png", "40", "1x", "40x40" },
833-
{ "icons/spotlight_80x80", "iphone", "Icon-80.png", "80", "2x", "40x40" },
834-
{ "icons/spotlight_80x80", "ipad", "Icon-80.png", "80", "2x", "40x40" }
833+
{ "icons/spotlight_40x40", "ipad", "Icon-40.png", "40", "1x", "40x40", false },
834+
{ "icons/spotlight_80x80", "iphone", "Icon-80.png", "80", "2x", "40x40", false },
835+
{ "icons/spotlight_80x80", "ipad", "Icon-80.png", "80", "2x", "40x40", false }
835836
};
836837

837838
Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_preset, const String &p_iconset_dir) {
@@ -851,26 +852,38 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
851852
Ref<Image> img = memnew(Image);
852853
Error err = ImageLoader::load_image(icon_path, img);
853854
if (err != OK) {
854-
ERR_PRINT("Invalid icon (" + String(info.preset_key) + "): '" + icon_path + "'.");
855+
memdelete(da);
856+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
857+
return ERR_UNCONFIGURED;
858+
}
859+
if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
860+
memdelete(da);
861+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
855862
return ERR_UNCONFIGURED;
856863
}
857864
img->resize(side_size, side_size);
858865
err = img->save_png(p_iconset_dir + info.export_name);
859866
if (err) {
860-
String err_str = String("Failed to export icon(" + String(info.preset_key) + "): '" + icon_path + "'.");
861-
ERR_PRINT(err_str.utf8().get_data());
867+
memdelete(da);
868+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Failed to export icon (%s): '%s'.", info.preset_key, icon_path));
862869
return err;
863870
}
864871
} else {
865872
// Load custom icon and resize if required
866873
Ref<Image> img = memnew(Image);
867874
Error err = ImageLoader::load_image(icon_path, img);
868875
if (err != OK) {
869-
ERR_PRINT("Invalid icon (" + String(info.preset_key) + "): '" + icon_path + "'.");
876+
memdelete(da);
877+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Invalid icon (%s): '%s'.", info.preset_key, icon_path));
878+
return ERR_UNCONFIGURED;
879+
}
880+
if (info.force_opaque && img->detect_alpha() != Image::ALPHA_NONE) {
881+
memdelete(da);
882+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Icon (%s) must be opaque.", info.preset_key));
870883
return ERR_UNCONFIGURED;
871884
}
872885
if (img->get_width() != side_size || img->get_height() != side_size) {
873-
WARN_PRINT("Icon (" + String(info.preset_key) + "): '" + icon_path + "' has incorrect size (" + String::num_int64(img->get_width()) + "x" + String::num_int64(img->get_height()) + ") and was automatically resized to " + String::num_int64(side_size) + "x" + String::num_int64(side_size) + ".");
886+
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(), Vector2(side_size, side_size)));
874887
img->resize(side_size, side_size);
875888
err = img->save_png(p_iconset_dir + info.export_name);
876889
} else {
@@ -879,8 +892,7 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
879892

880893
if (err) {
881894
memdelete(da);
882-
String err_str = String("Failed to export icon(" + String(info.preset_key) + "): '" + icon_path + "'.");
883-
ERR_PRINT(err_str.utf8().get_data());
895+
add_message(EXPORT_MESSAGE_ERROR, TTR("Export Icons"), vformat("Failed to export icon (%s): '%s'.", info.preset_key, icon_path));
884896
return err;
885897
}
886898
}

0 commit comments

Comments
 (0)