diff --git a/tooling/cli/src/icon.rs b/tooling/cli/src/icon.rs index 319a15e8f..6535349d1 100644 --- a/tooling/cli/src/icon.rs +++ b/tooling/cli/src/icon.rs @@ -30,6 +30,7 @@ struct IcnsEntry { ostype: String, } +#[derive(Debug)] struct PngEntry { name: String, size: u32, @@ -244,6 +245,83 @@ fn png(source: &DynamicImage, out_dir: &Path) -> Result<()> { Ok(entries) } + fn ios_entries(out_dir: &Path) -> Result> { + struct IosEntry { + size: f32, + multipliers: Vec, + has_extra: bool, + } + + let mut entries = Vec::new(); + + let targets = vec![ + IosEntry { + size: 20., + multipliers: vec![1, 2, 3], + has_extra: true, + }, + IosEntry { + size: 29., + multipliers: vec![1, 2, 3], + has_extra: true, + }, + IosEntry { + size: 40., + multipliers: vec![1, 2, 3], + has_extra: true, + }, + IosEntry { + size: 60., + multipliers: vec![2, 3], + has_extra: false, + }, + IosEntry { + size: 76., + multipliers: vec![1, 2], + has_extra: false, + }, + IosEntry { + size: 83.5, + multipliers: vec![2], + has_extra: false, + }, + IosEntry { + size: 512., + multipliers: vec![2], + has_extra: false, + }, + ]; + + for target in targets { + let size_str = if target.size == 512. { + "512".to_string() + } else { + format!("{size}x{size}", size = target.size) + }; + if target.has_extra { + let name = format!("AppIcon-{size_str}@2x-1.png"); + entries.push(PngEntry { + out_path: out_dir.join(&name), + name, + size: (target.size * 2.) as u32, + }); + } + for multiplier in target.multipliers { + let name = format!( + "AppIcon-{size_str}@{multiplier}x.png", + multiplier = multiplier + ); + entries.push(PngEntry { + out_path: out_dir.join(&name), + name, + size: (target.size * multiplier as f32) as u32, + }); + } + } + + Ok(entries) + } + let mut entries = desktop_entries(out_dir); let _ = crate::mobile::android::with_config( Some(Default::default()), @@ -264,6 +342,19 @@ fn png(source: &DynamicImage, out_dir: &Path) -> Result<()> { }, ); + let ios_out = out_dir + .parent() + .unwrap() + .join("gen/apple/Assets.xcassets/AppIcon.appiconset"); + let out = if ios_out.exists() { + ios_out + } else { + let out = out_dir.join("ios"); + create_dir_all(&out).context("Can't create iOS output directory")?; + out + }; + entries.extend(ios_entries(&out)?); + for entry in entries { log::info!(action = "PNG"; "Creating {}", entry.name); resize_and_save_png(source, entry.size, &entry.out_path)?; diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png new file mode 100644 index 000000000..8a08f3c83 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png new file mode 100644 index 000000000..c39a34512 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png new file mode 100644 index 000000000..c39a34512 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png new file mode 100644 index 000000000..47f66cd3b Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png new file mode 100644 index 000000000..5586009eb Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png new file mode 100644 index 000000000..7971ff3d6 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png new file mode 100644 index 000000000..7971ff3d6 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png new file mode 100644 index 000000000..a7b57ec12 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png new file mode 100644 index 000000000..c39a34512 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png new file mode 100644 index 000000000..e0b5a2e02 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png new file mode 100644 index 000000000..e0b5a2e02 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png new file mode 100644 index 000000000..7eb5a2c28 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 000000000..d4ceb7603 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png new file mode 100644 index 000000000..5e9add731 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png new file mode 100644 index 000000000..7eb5a2c28 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png new file mode 100644 index 000000000..4bfc2d971 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png new file mode 100644 index 000000000..51ee10c22 Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png new file mode 100644 index 000000000..81223cecf Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png new file mode 100644 index 000000000..edc9595ce Binary files /dev/null and b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png differ diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..90eea7ec7 --- /dev/null +++ b/tooling/cli/templates/mobile/ios/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "AppIcon-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "AppIcon-512@2x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/tooling/cli/templates/mobile/ios/Assets.xcassets/Contents.json b/tooling/cli/templates/mobile/ios/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/tooling/cli/templates/mobile/ios/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/tooling/cli/templates/mobile/ios/project.yml b/tooling/cli/templates/mobile/ios/project.yml index 7f190c73c..31fe4bf97 100644 --- a/tooling/cli/templates/mobile/ios/project.yml +++ b/tooling/cli/templates/mobile/ios/project.yml @@ -30,6 +30,7 @@ targets: platform: iOS sources: - path: Sources + - path: Assets.xcassets - path: {{app.asset-dir}} buildPhase: resources type: folder