Status icons are back (#794)
This commit is contained in:
parent
dca050445e
commit
898bbf7a7f
184 changed files with 614 additions and 32 deletions
107
scripts/iconz/generate-all.sh
Executable file
107
scripts/iconz/generate-all.sh
Executable file
|
|
@ -0,0 +1,107 @@
|
|||
#!/bin/bash
|
||||
|
||||
generate_async() {
|
||||
local count=$#
|
||||
local suffix=${!count}
|
||||
|
||||
# Get all arguments except the last (used as Python args)
|
||||
local args=("${@:1:count-1}")
|
||||
|
||||
# Run Python with args and output to XML named after suffix
|
||||
python generate-v3.py "${args[@]}" > "ic_lang_${suffix}.xml" &
|
||||
}
|
||||
|
||||
generate_all_cases() {
|
||||
font_file=$1
|
||||
lang_code=$2
|
||||
file_code=$3
|
||||
alignment_lo=$4
|
||||
alignment_cp=$5
|
||||
alignment_up=$6
|
||||
|
||||
generate_async $font_file ${lang_code} ${alignment_lo} ${file_code}_lo
|
||||
generate_async $font_file $(echo $lang_code | awk '{print toupper($0)}') ${alignment_up} ${file_code}_up
|
||||
generate_async $font_file $(echo $lang_code | awk '{print toupper(substr($0,1,1)) substr($0,2)}') ${alignment_cp} ${file_code}_cp
|
||||
}
|
||||
|
||||
# 123
|
||||
generate_async NotoSans-Bold.ttf 12 -0.15 123
|
||||
|
||||
# ABC
|
||||
generate_async NotoSans-Bold.ttf ab -0.15 latin_lo
|
||||
generate_async NotoSans-Bold.ttf AB -0.15 latin_up
|
||||
generate_async NotoSans-Bold.ttf аб -0.15 cyrillic_lo
|
||||
generate_async NotoSans-Bold.ttf АБ -0.15 cyrillic_up
|
||||
|
||||
# Arabic / Farsi
|
||||
generate_async NotoSansArabic-Bold.ttf ع -0.05 ar
|
||||
generate_async NotoSansArabic-Bold.ttf ف -0.3 fa
|
||||
generate_async NotoSansArabic-Bold.ttf أﺏ -0.15 alifba
|
||||
|
||||
# CJK
|
||||
generate_async NotoSansJP-Bold.ttf あ -0.15 hiragana
|
||||
generate_async NotoSansJP-Bold.ttf ア -0.15 katakana
|
||||
generate_async NotoSansJP-Bold.ttf 漢 -0.17 kanji
|
||||
generate_async NotoSansKR-Bold.ttf 한 -0.17 ko
|
||||
generate_async NotoSansSC-Bold.ttf 拼 -0.17 zh_pinyin
|
||||
|
||||
# Greek
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ελ" "el" -0.12 -0.12 -0.15
|
||||
generate_async NotoSans-Bold.ttf αβ alfabeta_lo
|
||||
generate_async NotoSans-Bold.ttf ΑΒ -0.15 alfabeta_up
|
||||
|
||||
# Hebrew / Yiddish
|
||||
generate_async NotoSansHebrew-Bold יי -0.2 ji
|
||||
generate_async NotoSansHebrew-Bold אב -0.2 he
|
||||
generate_async NotoSansHebrew-Bold עב -0.17 alefbet
|
||||
|
||||
# Hindi
|
||||
generate_async NotoSansDevanagari-Bold.ttf ह -0.05 hi
|
||||
generate_async NotoSansDevanagari-Bold.ttf कख -0.1 hi_abc
|
||||
|
||||
# Gujarati
|
||||
generate_async NotoSansGujarati-Bold.ttf ગુ -0.1 gu
|
||||
generate_async NotoSansGujarati-Bold.ttf કખ -0.1 gu_abc
|
||||
|
||||
# Tamazight / Tifinagh
|
||||
generate_async NotoSansTifinagh.ttf ⵜⵎ -0.15 tm_tifinagh
|
||||
generate_async NotoSansTifinagh.ttf ⴰⴱ -0.15 tifinagh
|
||||
|
||||
# Thai
|
||||
generate_async NotoSansThai-Bold.ttf ไท -0.15 th
|
||||
generate_async NotoSansThai-Bold.ttf กข -0.15 th_abc
|
||||
|
||||
generate_all_cases "NotoSans-Bold.ttf" "br" "br" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "бг" "bg" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ca" "ca" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "hr" "hr" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "cz" "cz" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "da" "da" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "nl" "nl" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "en" "en" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ee" "et" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "su" "su" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "fr" "fr" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "de" "de" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "hn" "hn" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "mg" "mg" -0.1 -0.1 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "id" "id" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ga" "ga" -0.1 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "it" "it" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "sw" "sw" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "lv" "lv" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "lt" "lt" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "no" "no" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "pl" "pl" -0.08 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "pt" "pt" -0.08 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ro" "ro" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "ру" "ru" -0.08 -0.08 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "sl" "sl" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "es" "es" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "sv" "sv" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "tm" "tm" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "tr" "tr" -0.15 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "уk" "uk" -0.05 -0.15 -0.15
|
||||
generate_all_cases "NotoSans-Bold.ttf" "vi" "vi" -0.15 -0.15 -0.15
|
||||
|
||||
wait
|
||||
76
scripts/iconz/generate-v3.py
Normal file
76
scripts/iconz/generate-v3.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import sys
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import io
|
||||
import re
|
||||
|
||||
# Configurations
|
||||
OUTPUT_WIDTH_DP = 24
|
||||
OUTPUT_HEIGHT_DP = 16
|
||||
CANVAS_WIDTH = 48
|
||||
CANVAS_HEIGHT = 32
|
||||
FONT_SCALE = 1.0
|
||||
PADDING = 0.0
|
||||
VERTICAL_ADJUST = 0
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print(f"Usage: {sys.argv[0]} FONT_FILE TEXT [VERTICAL_ADJUST]")
|
||||
sys.exit(1)
|
||||
|
||||
font_path = sys.argv[1]
|
||||
text = sys.argv[2]
|
||||
|
||||
if len(sys.argv) >= 4:
|
||||
try:
|
||||
VERTICAL_ADJUST += float(sys.argv[3])
|
||||
except ValueError:
|
||||
print("Error: VERTICAL_ADJUST must be a float.")
|
||||
sys.exit(1)
|
||||
|
||||
# Create image
|
||||
img = Image.new('RGBA', (CANVAS_WIDTH, CANVAS_HEIGHT), (0, 0, 0, 0))
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
usable_width = CANVAS_WIDTH * (1 - PADDING * 2)
|
||||
usable_height = CANVAS_HEIGHT * (1 - PADDING * 2)
|
||||
font_size = int(min(usable_width, usable_height) * FONT_SCALE)
|
||||
font = ImageFont.truetype(font_path, font_size)
|
||||
|
||||
_, _, text_width, text_height = draw.textbbox((0, 0), text, font=font)
|
||||
|
||||
offset_x = CANVAS_WIDTH * PADDING
|
||||
offset_y = CANVAS_HEIGHT * PADDING
|
||||
text_x = offset_x + (usable_width - text_width) / 2
|
||||
text_y = offset_y + (usable_height - text_height) / 2 + (CANVAS_HEIGHT * VERTICAL_ADJUST)
|
||||
|
||||
draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255, 255))
|
||||
|
||||
# Output XML to STDOUT
|
||||
output = io.StringIO()
|
||||
output.write('<?xml version="1.0" encoding="utf-8"?>\n')
|
||||
output.write('<vector xmlns:android="http://schemas.android.com/apk/res/android"\n')
|
||||
output.write(f' android:width="{OUTPUT_WIDTH_DP}dp"\n')
|
||||
output.write(f' android:height="{OUTPUT_HEIGHT_DP}dp"\n')
|
||||
output.write(f' android:viewportWidth="{CANVAS_WIDTH}"\n')
|
||||
output.write(f' android:viewportHeight="{CANVAS_HEIGHT}">\n')
|
||||
|
||||
for y in range(CANVAS_HEIGHT):
|
||||
x = 0
|
||||
while x < CANVAS_WIDTH:
|
||||
r, g, b, a = img.getpixel((x, y))
|
||||
if a > 128:
|
||||
color = (r, g, b)
|
||||
start_x = x
|
||||
while x < CANVAS_WIDTH:
|
||||
r2, g2, b2, a2 = img.getpixel((x, y))
|
||||
if a2 <= 128 or (r2, g2, b2) != color:
|
||||
break
|
||||
x += 1
|
||||
width = x - start_x
|
||||
color_hex = f"#{r:02X}{g:02X}{b:02X}"
|
||||
output.write(f' <path android:fillColor="{color_hex}" android:pathData="M{start_x},{y}h{width}v1h-{width}z"/>\n')
|
||||
else:
|
||||
x += 1
|
||||
|
||||
output.write('</vector>\n')
|
||||
|
||||
print(re.sub(r'\s+', ' ', output.getvalue()).replace('> <', '><').strip())
|
||||
1
scripts/iconz/requirements.txt
Normal file
1
scripts/iconz/requirements.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
pillow==11.2.1
|
||||
Loading…
Add table
Add a link
Reference in a new issue