Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix xcassets icon generation (correct image sizes) + stop overriding user defined assets once generated #951

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update xcassets.py
Novfensec authored Dec 7, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 0e9dcb2982007626d81f60a68d1ed7b15fd46dd6
362 changes: 187 additions & 175 deletions kivy_ios/tools/external/xcassets.py
Original file line number Diff line number Diff line change
@@ -495,202 +495,214 @@ def icon(image_xcassets, image_fn):
"""Generate all the possible Icon from a single image_fn
"""
appicon_dir = join(image_xcassets, "AppIcon.appiconset")

# this ensure that kivy-ios does not override the user defined assets.
if not exists(appicon_dir):
makedirs(appicon_dir)
with open(join(appicon_dir, "Contents.json"), "w") as fd:
json.dump(appicon_json, fd)

options = (
# iPhone
# Spotlight - iOS 5,6
# Settings - iOS 5-8
# 29pt - 1x,2x,3x
("87", None, "Icon87.png"),
("58", None, "Icon58.png"),
("29", "Icon58.png", "Icon29.png"),

# iPhone notification
# 20pt - 2x,3x
# ("40", None, "Icon40.png"),
("60", None, "Icon60.png"),

# iPhone
# Spotlight - iOS 7-8
# 40pt 2x,3x
("120", None, "Icon120.png"),
("80", None, "Icon80.png"),

# iPhone
# App - iOS 5,6
# 57pt 1x,2x
("114", None, "Icon114.png"),
("57", "Icon114.png", "Icon57.png"),

# iPhone
# App - iOS 7,8
# 60pt 2x,3x
("180", None, "Icon180.png"),
# ("120", None, "Icon120.png # duplicate"),

# iPad
# Notifications
# 20pt 1x,2x
("20", "Icon80.png", "Icon20.png"),
("40", "Icon80.png", "Icon40.png"),

# iPad
# Settings iOS 5-8
# ("58", None, "Icon58.png # duplicate"),
# ("29", "Icon58.png", "Icon29.png # duplicate"),

# iPad
# Spotlight iOS 7,8
# 40pt 1x,2x
# ("80", None, "Icon80.png # duplicate"),
("40", "Icon80.png", "Icon40.png"),

# iPad
# Spotlight iOS 5,6
# 50pt 1x,2x
("100", None, "Icon100.png"),
("50", "Icon100.png", "Icon50.png"),

# iPad
# App iOS 5,6
# 72pt 1x,2x
("144", None, "Icon144.png"),
("72", "Icon144.png", "Icon72.png"),

# iPad
# App iOS 7,8
# 76pt 1x,2x
("152", None, "Icon152.png"),
("76", "Icon152.png", "Icon76.png"),

# iPad
# App iOS 9
# 83.5pt 2x
("167", None, "Icon167.png"),


# CarPlay
# App iOS 8
# 120pt 1x
# ("120", None, "Icon120.png # duplicate"),


# Apple Watch
# Notification Center
# 38mm, 42mm
("48", None, "Icon48.png"),
("55", None, "Icon55.png"),

# Apple Watch
# Companion Settings
# 29pt 2x,3x
# ("58", None, "Icon58.png # duplicate"),
# ("87", None, "Icon87.png # duplicate"),

# Apple Watch
# Home Screen (All)
# Long Look (38mm)
# ("80", None, "Icon80.png # duplicate"),

# Apple Watch
# Long Look (42mm)
("88", None, "Icon88.png"),

# Apple Watch
# Short Look
# 38mm, 42mm, 44mm
("172", None, "Icon172.png"),
("196", None, "Icon196.png"),
("216", None, "Icon216.png"),


# OS X
# 512pt 1x,2x
("1024", None, "Icon1024.png"),
("512", "Icon1024.png", "Icon512.png"),

# OS X
# 256pt 1x,2x
# ("512", "Icon1024.png", "Icon512.png # duplicate"),
("256", "Icon512.png", "Icon256.png"),

# OS X
# 128pt 1x,2x
# ("256", "Icon512.png", "Icon256.png # duplicate"),
("128", "Icon256.png", "Icon128.png"),

# OS X
# 32pt 1x,2x
("64", "Icon128.png", "Icon64.png"),
("32", "Icon64.png", "Icon32.png"),

# OS X
# 16pt 1x,2x
# ("32", "Icon64.png", "Icon32.png # duplicate"),
("16", "Icon32.png", "Icon16.png"))

_generate("AppIcon.appiconset", image_xcassets, image_fn, options, icon=True)
with open(join(appicon_dir, "Contents.json"), "w") as fd:
json.dump(appicon_json, fd)
options = (
# iPhone
# Spotlight - iOS 5,6
# Settings - iOS 5-8
# 29pt - 1x,2x,3x
("87", None, "Icon87.png"),
("58", None, "Icon58.png"),
("29", "Icon58.png", "Icon29.png"),
# iPhone notification
# 20pt - 2x,3x
# ("40", None, "Icon40.png"),
("60", None, "Icon60.png"),
# iPhone
# Spotlight - iOS 7-8
# 40pt 2x,3x
("120", None, "Icon120.png"),
("80", None, "Icon80.png"),
# iPhone
# App - iOS 5,6
# 57pt 1x,2x
("114", None, "Icon114.png"),
("57", "Icon114.png", "Icon57.png"),
# iPhone
# App - iOS 7,8
# 60pt 2x,3x
("180", None, "Icon180.png"),
# ("120", None, "Icon120.png # duplicate"),
# iPad
# Notifications
# 20pt 1x,2x
("20", "Icon80.png", "Icon20.png"),
("40", "Icon80.png", "Icon40.png"),
# iPad
# Settings iOS 5-8
# ("58", None, "Icon58.png # duplicate"),
# ("29", "Icon58.png", "Icon29.png # duplicate"),
# iPad
# Spotlight iOS 7,8
# 40pt 1x,2x
# ("80", None, "Icon80.png # duplicate"),
("40", "Icon80.png", "Icon40.png"),
# iPad
# Spotlight iOS 5,6
# 50pt 1x,2x
("100", None, "Icon100.png"),
("50", "Icon100.png", "Icon50.png"),
# iPad
# App iOS 5,6
# 72pt 1x,2x
("144", None, "Icon144.png"),
("72", "Icon144.png", "Icon72.png"),
# iPad
# App iOS 7,8
# 76pt 1x,2x
("152", None, "Icon152.png"),
("76", "Icon152.png", "Icon76.png"),
# iPad
# App iOS 9
# 83.5pt 2x
("167", None, "Icon167.png"),
# CarPlay
# App iOS 8
# 120pt 1x
# ("120", None, "Icon120.png # duplicate"),
# Apple Watch
# Notification Center
# 38mm, 42mm
("48", None, "Icon48.png"),
("55", None, "Icon55.png"),
# Apple Watch
# Companion Settings
# 29pt 2x,3x
# ("58", None, "Icon58.png # duplicate"),
# ("87", None, "Icon87.png # duplicate"),
# Apple Watch
# Home Screen (All)
# Long Look (38mm)
# ("80", None, "Icon80.png # duplicate"),
# Apple Watch
# Long Look (42mm)
("88", None, "Icon88.png"),
# Apple Watch
# Short Look
# 38mm, 42mm, 44mm
("172", None, "Icon172.png"),
("196", None, "Icon196.png"),
("216", None, "Icon216.png"),
# OS X
# 512pt 1x,2x
("1024", None, "Icon1024.png"),
("512", "Icon1024.png", "Icon512.png"),
# OS X
# 256pt 1x,2x
# ("512", "Icon1024.png", "Icon512.png # duplicate"),
("256", "Icon512.png", "Icon256.png"),
# OS X
# 128pt 1x,2x
# ("256", "Icon512.png", "Icon256.png # duplicate"),
("128", "Icon256.png", "Icon128.png"),
# OS X
# 32pt 1x,2x
("64", "Icon128.png", "Icon64.png"),
("32", "Icon64.png", "Icon32.png"),
# OS X
# 16pt 1x,2x
# ("32", "Icon64.png", "Icon32.png # duplicate"),
("16", "Icon32.png", "Icon16.png"))
_generate("AppIcon.appiconset", image_xcassets, image_fn, options, icon=True)


def launchimage(image_xcassets, image_fn):
"""Generate all the possible Launch Images from a single image_fn
"""
launchimage_dir = join(image_xcassets, "LaunchImage.launchimage")

# this ensure that kivy-ios does not override the user defined assets.
if not exists(launchimage_dir):
makedirs(launchimage_dir)
with open(join(launchimage_dir, "Contents.json"), "w") as fd:
json.dump(launchimage_json, fd)

options = (
# size, input, output
# iPhone 3.5" @2x
("640 960", None, "Default640x960.png"),
# iPhone 3.5" @1x
("320 480", None, "Default320x480.png"),
# iPhone 4.0" @2x
("640 1136", None, "Default640x1136.png"),
# iPhone 5.5" @3x - landscape
("2208 1242", None, "Default2208x1242.png"),
# iPhone 5.5" @3x - portrait
("1242 2208", None, "Default1242x2208.png"),
# iPhone 4.7" @2x
("750 1334", None, "Default750x1334.png"),
# iPad @2x - landscape
("2048 1536", None, "Default2048x1536.png"),
# iPad @2x - portrait
("1536 2048", None, "Default1536x2048.png"),
# iPad @1x - landscape
("1024 768", None, "Default1024x768.png"),
# iPad @1x - portrait
("768 1024", None, "Default768x1024.png"),
)

_generate("LaunchImage.launchimage", image_xcassets, image_fn, options)
with open(join(launchimage_dir, "Contents.json"), "w") as fd:
json.dump(launchimage_json, fd)
options = (
# size, input, output
# iPhone 3.5" @2x
("640 960", None, "Default640x960.png"),
# iPhone 3.5" @1x
("320 480", None, "Default320x480.png"),
# iPhone 4.0" @2x
("640 1136", None, "Default640x1136.png"),
# iPhone 5.5" @3x - landscape
("2208 1242", None, "Default2208x1242.png"),
# iPhone 5.5" @3x - portrait
("1242 2208", None, "Default1242x2208.png"),
# iPhone 4.7" @2x
("750 1334", None, "Default750x1334.png"),
# iPad @2x - landscape
("2048 1536", None, "Default2048x1536.png"),
# iPad @2x - portrait
("1536 2048", None, "Default1536x2048.png"),
# iPad @1x - landscape
("1024 768", None, "Default1024x768.png"),
# iPad @1x - portrait
("768 1024", None, "Default768x1024.png"),
)
_generate("LaunchImage.launchimage", image_xcassets, image_fn, options)


def _buildimage(in_fn, out_fn, size, padcolor=None):

im = Image.open(in_fn)

# read the first left/bottom pixel
# Read the first left/bottom pixel
bgcolor = im.getpixel((0, 0))

# ensure the image fit in the destination size
if im.size[0] > size[0] or im.size[1] > size[1]:
f = max(im.size[0] / size[0], im.size[1] / size[1])
newsize = int(im.size[0] / f), int(im.size[1] / f)
im = im.resize(newsize)
# Calculate the scaling factor to fit the image within the destination size
scaling_factor = min(size[0] / im.size[0], size[1] / im.size[1])

# create final image
# Compute the new size while maintaining the aspect ratio
newsize = (int(im.size[0] * scaling_factor), int(im.size[1] * scaling_factor))

# Resize the image
im = im.resize(newsize, Image.LANCZOS)

# Create the final image with the background color
outim = Image.new("RGB", size, bgcolor[:3])
x = (size[0] - im.size[0]) // 2
y = (size[1] - im.size[1]) // 2

# Compute the top-left coordinates to paste the resized image
x = (size[0] - newsize[0]) // 2
y = (size[1] - newsize[1]) // 2

# Paste the resized image onto the background
outim.paste(im, (x, y))

# save the image
# Save the final image
outim.save(out_fn)