11from mpos import Activity
22import lvgl as lv
3+ import os
34
4- CP_FROWNING_FACE = 0x2639 # ☹
5- CP_HEAVY_BLACK_HEART = 0x2764 # ❤️
6- CP_WHITE_SMILING_FACE = 0x263A # ☺
7- CP_SLIGHTLY_SMILING_FACE = 0x1F642 # 🙂
8- CP_GRINNING_FACE = 0x1F600 # 😀
9- CP_STAR_EYES = 0x1F929 # 🤩
105CP_VARIATION_SELECTOR_TEXT = 0xFE0E
116CP_VARIATION_SELECTOR_EMOJI = 0xFE0F
127
13- # Ideally, just list the files in EMOJI_PNG_PATH to know which emojis that are supported
14- EMOJI_PNG_PATH = "M:apps/com.micropythonos.showfonts/assets/openmoji-72x72-color/"
15- EMOJI_PNG_2639 = "2639.png"
16- EMOJI_PNG_263A = "263A.png"
17- EMOJI_PNG_1F600 = "1F600.png"
18- EMOJI_PNG_1F929 = "1F929.png"
8+ EMOJI_PNG_DIR = "openmoji-72x72-color"
9+ EMOJI_PNG_SRC_PREFIX = "M:apps/com.micropythonos.showfonts/assets/openmoji-72x72-color/"
10+ EMOJI_PNG_DIR_CANDIDATES = (
11+ EMOJI_PNG_DIR ,
12+ "./" + EMOJI_PNG_DIR ,
13+ "assets/" + EMOJI_PNG_DIR ,
14+ "apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR ,
15+ "/apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR ,
16+ "M:apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR ,
17+ )
18+ UNKNOWN_EMOJI_LOG_THRESHOLD = 0x2300
1919
2020
2121class ShowFonts (Activity ):
@@ -32,6 +32,7 @@ def onCreate(self):
3232 self ._imgfont_scaled_src_cache = {}
3333 self ._imgfont_source_size_cache = {}
3434 self ._imgfont_empty_src_cache = {}
35+ self ._unknown_emoji_codepoints_logged = {}
3536 self ._init_imagefont ()
3637 self ._init_ttf_font ()
3738
@@ -149,21 +150,67 @@ def addAllGlyphs(self, screen, start_y):
149150 screen .set_height (y + 20 )
150151
151152 def _init_imagefont (self ):
152- self ._emoji_map = {
153- CP_FROWNING_FACE : EMOJI_PNG_PATH + EMOJI_PNG_2639 ,
154- CP_WHITE_SMILING_FACE : EMOJI_PNG_PATH + EMOJI_PNG_263A ,
155- CP_HEAVY_BLACK_HEART : EMOJI_PNG_PATH + "2764.png" , # ❤️
156- CP_STAR_EYES : EMOJI_PNG_PATH + EMOJI_PNG_1F929 ,
157- CP_SLIGHTLY_SMILING_FACE : EMOJI_PNG_PATH + EMOJI_PNG_263A ,
158- CP_GRINNING_FACE : EMOJI_PNG_PATH + EMOJI_PNG_1F600 ,
159- }
153+ self ._emoji_map = self ._build_emoji_map_from_png_dir ()
160154 self ._emoji_font_big = lv .imgfont_create (72 , self ._imgfont_path_cb , None )
161155 self ._emoji_font_big .fallback = lv .font_montserrat_28
162156 self ._emoji_font = lv .imgfont_create (36 , self ._imgfont_path_cb , None )
163157 self ._emoji_font .fallback = lv .font_montserrat_28
164158 self ._emoji_font_small = lv .imgfont_create (18 , self ._imgfont_path_cb , None )
165159 self ._emoji_font_small .fallback = lv .font_montserrat_16
166160
161+ def _build_emoji_map_from_png_dir (self ):
162+ emoji_map = {}
163+ dir_path = None
164+ entries = None
165+ for candidate in EMOJI_PNG_DIR_CANDIDATES :
166+ entries = self ._list_dir_names (candidate )
167+ if entries is not None :
168+ dir_path = candidate
169+ break
170+
171+ if entries is None :
172+ print ("showfonts: could not list emoji dir candidates (cwd=" + self ._safe_getcwd () + ")" )
173+ return emoji_map
174+
175+ for name in entries :
176+ if not name .lower ().endswith (".png" ):
177+ continue
178+
179+ codepoint_hex = name [:- 4 ]
180+ try :
181+ codepoint = int (codepoint_hex , 16 )
182+ except Exception :
183+ print ("showfonts: skip non-hex emoji file: " + name )
184+ continue
185+
186+ emoji_map [codepoint ] = EMOJI_PNG_SRC_PREFIX + name
187+
188+ print ("showfonts: loaded " + str (len (emoji_map )) + " emoji png mappings from " + dir_path )
189+ return emoji_map
190+
191+ def _list_dir_names (self , path ):
192+ try :
193+ names = []
194+ for entry in os .ilistdir (path ):
195+ if isinstance (entry , tuple ):
196+ names .append (entry [0 ])
197+ else :
198+ names .append (entry )
199+ return names
200+ except Exception :
201+ pass
202+
203+ try :
204+ return os .listdir (path )
205+ except Exception :
206+ return None
207+
208+ def _safe_getcwd (self ):
209+ try :
210+ return os .getcwd ()
211+ except Exception :
212+ return "?"
213+
167214 def _normalize_emoji_text (self , text ):
168215 text = text .replace (chr (CP_VARIATION_SELECTOR_TEXT ), "" )
169216 text = text .replace (chr (CP_VARIATION_SELECTOR_EMOJI ), "" )
@@ -186,8 +233,19 @@ def _imgfont_path_cb(self, font, unicode_cp, unicode_next, offset_y, user_data):
186233 src = self ._emoji_map [unicode_cp ]
187234 target_height = self ._font_pixel_height (font )
188235 return self ._get_scaled_imgfont_src (src , target_height )
236+
237+ self ._log_unknown_emoji_codepoint (unicode_cp )
189238 return None
190239
240+ def _log_unknown_emoji_codepoint (self , unicode_cp ):
241+ if unicode_cp < UNKNOWN_EMOJI_LOG_THRESHOLD :
242+ return
243+ if unicode_cp in self ._unknown_emoji_codepoints_logged :
244+ return
245+
246+ self ._unknown_emoji_codepoints_logged [unicode_cp ] = True
247+ print ("showfonts: unknown emoji codepoint 0x{:X}" .format (unicode_cp ))
248+
191249 def _get_empty_imgfont_src (self , target_height ):
192250 target_height = max (1 , int (target_height ))
193251 if target_height in self ._imgfont_empty_src_cache :
0 commit comments