You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.0 KiB
48 lines
1.0 KiB
3 days ago
|
import io
|
||
|
import re
|
||
|
|
||
|
from PIL import Image, ImageDraw, ImageFont
|
||
|
import pyray as rl
|
||
|
|
||
|
_cache: dict[str, rl.Texture] = {}
|
||
|
|
||
|
EMOJI_REGEX = re.compile(
|
||
|
"""[\U0001F600-\U0001F64F
|
||
|
\U0001F300-\U0001F5FF
|
||
|
\U0001F680-\U0001F6FF
|
||
|
\U0001F1E0-\U0001F1FF
|
||
|
\U00002700-\U000027BF
|
||
|
\U0001F900-\U0001F9FF
|
||
|
\U00002600-\U000026FF
|
||
|
\U00002300-\U000023FF
|
||
|
\U00002B00-\U00002BFF
|
||
|
\U0001FA70-\U0001FAFF
|
||
|
\U0001F700-\U0001F77F
|
||
|
\u2640-\u2642
|
||
|
\u2600-\u2B55
|
||
|
\u200d
|
||
|
\u23cf
|
||
|
\u23e9
|
||
|
\u231a
|
||
|
\ufe0f
|
||
|
\u3030
|
||
|
]+""",
|
||
|
flags=re.UNICODE
|
||
|
)
|
||
|
|
||
|
def find_emoji(text):
|
||
|
return [(m.start(), m.end(), m.group()) for m in EMOJI_REGEX.finditer(text)]
|
||
|
|
||
|
def emoji_tex(emoji):
|
||
|
if emoji not in _cache:
|
||
|
img = Image.new("RGBA", (128, 128), (0, 0, 0, 0))
|
||
|
draw = ImageDraw.Draw(img)
|
||
|
font = ImageFont.truetype("NotoColorEmoji", 109)
|
||
|
draw.text((0, 0), emoji, font=font, embedded_color=True)
|
||
|
buffer = io.BytesIO()
|
||
|
img.save(buffer, format="PNG")
|
||
|
l = buffer.tell()
|
||
|
buffer.seek(0)
|
||
|
_cache[emoji] = rl.load_texture_from_image(rl.load_image_from_memory(".png", buffer.getvalue(), l))
|
||
|
return _cache[emoji]
|