mirror of
https://github.com/pelgraine/Meck.git
synced 2026-08-10 02:32:44 +02:00
7df116b4f1
The repo has apparently only ever been built on case-insensitive
filesystems (macOS/Windows): every #include in the codebase uses
intended PascalCase/CamelCase header names (e.g. "SettingsScreen.h",
"WiFiMQTT.h"), but 28 of the actual files on disk were saved with
inconsistent casing (e.g. "Settingsscreen.h", "wifimqtt.h"). On a
case-sensitive filesystem (Linux) this is a hard compile failure, not
a cosmetic mismatch -- confirmed by running `pio run -e meck_audio_ble`
on Gentoo Linux, which failed immediately on "target.h: No such file
or directory" and a cascade of similar errors as each fix exposed the
next one.
Root causes, two flavors of the same underlying bug:
1. Header filename casing (29 files renamed via `git mv` to preserve
history): examples/companion_radio/ui-new/*, examples/simple_repeater/*,
and two variant-local headers (PCF85063Clock.h, TCA8418Keyboard.h x2).
Verified safe before renaming: every file has exactly one consistent
intended casing across all the places that #include it (checked via
a repo-wide scan comparing every #include against on-disk filenames,
zero conflicts found), so each rename is a pure no-op for behavior.
2. PlatformIO config paths using the wrong case for variant directories
that are actually lowercase on disk (variants/lilygo_tdeck_pro,
variants/lilygo_t5s3_epaper_pro):
- `-I variants/LilyGo_TDeck_Pro` / `-I variants/LilyGo_T5S3_EPaper_Pro`
in build_flags (3 occurrences, including lilygo_tdeck_max's
reference to TDeck Pro's shared headers) -- broke header resolution
for target.h and friends.
- `+<../variants/LilyGo_TDeck_Pro>` / `+<../variants/LilyGo_T5S3_EPaper_Pro>`
in build_src_filter (2 occurrences) -- silently excluded the board-init
.cpp files (TDeckBoard.cpp etc.) from compilation entirely, which
didn't fail until the *link* stage ("undefined reference to
radio_init()", `TDeckBoard::begin()`, etc.) since PlatformIO's glob
just matched nothing rather than erroring.
Verified fix: `pio run -e meck_audio_ble` now compiles, links, and
produces a firmware image cleanly (RAM 53.1%, Flash 49.6%).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
910 lines
43 KiB
C
910 lines
43 KiB
C
#pragma once
|
|
|
|
// Emoji sprites for e-ink display - dual size
|
|
// Large (12x12) for compose/picker, Small (10x10) for channel view
|
|
// MSB-first, 2 bytes per row
|
|
// 79 total emoji: joy/thumbsup/frown first, then 43 original, then 19 new, then 11 newest, then 1 latest, then 2 added (hundred_points, grinning)
|
|
|
|
#include <stdint.h>
|
|
#ifdef ESP32
|
|
#include <pgmspace.h>
|
|
#endif
|
|
|
|
#define EMOJI_LG_W 12
|
|
#define EMOJI_LG_H 12
|
|
#define EMOJI_SM_W 10
|
|
#define EMOJI_SM_H 10
|
|
|
|
#define EMOJI_COUNT 79
|
|
|
|
// Escape codes in 0x80+ range - safe from keyboard ASCII (32-126)
|
|
#define EMOJI_ESCAPE_START 0x80
|
|
#define EMOJI_ESCAPE_END 0xCE // 0x80 + 78
|
|
#define EMOJI_PAD_BYTE 0x7F // DEL, not typeable (key < 127 guard)
|
|
|
|
// ======== LARGE 12x12 SPRITES ========
|
|
|
|
// [0] joy (most common mesh emoji)
|
|
static const uint8_t emoji_lg_joy[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x59,0xA0, 0x59,0xA0, 0x80,0x10, 0xA0,0x50, 0x9F,0x90, 0x40,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [1] thumbsup
|
|
static const uint8_t emoji_lg_thumbsup[] PROGMEM = {
|
|
0x00,0x00, 0x70,0x00, 0x70,0x00, 0x70,0x00, 0x7F,0x80, 0xFF,0x80, 0xFF,0x80, 0x7F,0x80, 0x3F,0x80, 0x1F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [2] frown
|
|
static const uint8_t emoji_lg_frown[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x59,0xA0, 0x59,0xA0, 0x80,0x10, 0x9F,0x90, 0xA0,0x50, 0x40,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [65] loudly_crying 😭
|
|
static const uint8_t emoji_lg_loudly_crying[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x5B,0x40, 0x5B,0x20, 0x80,0x10, 0x9F,0x10, 0xA0,0x90, 0x60,0xC0, 0xA0,0xA0, 0x1F,0x00, 0x40,0x40, 0x00,0x00,
|
|
};
|
|
// [66] heart ♥️
|
|
static const uint8_t emoji_lg_heart[] PROGMEM = {
|
|
0x00,0x00, 0x73,0x80, 0xFF,0xC0, 0xFF,0xC0, 0xFF,0xC0, 0x7F,0x80, 0x3F,0x00, 0x1E,0x00, 0x0C,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [3] wireless
|
|
static const uint8_t emoji_lg_wireless[] PROGMEM = {
|
|
0x00,0x00, 0x3F,0xC0, 0x60,0x60, 0xC0,0x30, 0x0F,0x00, 0x19,0x80, 0x30,0xC0, 0x00,0x00, 0x06,0x00, 0x0F,0x00, 0x06,0x00, 0x00,0x00,
|
|
};
|
|
// [4] infinity
|
|
static const uint8_t emoji_lg_infinity[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x61,0x80, 0x92,0x40, 0x8C,0x40, 0x8C,0x40, 0x92,0x40, 0x61,0x80, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [5] trex
|
|
static const uint8_t emoji_lg_trex[] PROGMEM = {
|
|
0x03,0xE0, 0x06,0xA0, 0x07,0xE0, 0x0C,0x00, 0x5C,0x00, 0x7C,0x00, 0x3C,0x00, 0x38,0x00, 0x3C,0x00, 0x36,0x00, 0x22,0x00, 0x33,0x00,
|
|
};
|
|
// [6] skull
|
|
static const uint8_t emoji_lg_skull[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x59,0xA0, 0x59,0xA0, 0x40,0x20, 0x49,0x20, 0x2F,0x40, 0x1F,0x80, 0x96,0x90, 0x66,0x60, 0x36,0xC0, 0x96,0x90,
|
|
};
|
|
// [7] cross
|
|
static const uint8_t emoji_lg_cross[] PROGMEM = {
|
|
0x0F,0x00, 0x0F,0x00, 0x0F,0x00, 0x3F,0xC0, 0x3F,0xC0, 0x3F,0xC0, 0x0F,0x00, 0x0F,0x00, 0x0F,0x00, 0x0F,0x00, 0x0F,0x00, 0x0F,0x00,
|
|
};
|
|
// [8] lightning
|
|
static const uint8_t emoji_lg_lightning[] PROGMEM = {
|
|
0x03,0x00, 0x07,0x00, 0x0E,0x00, 0x1C,0x00, 0x3F,0x80, 0x01,0x80, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x00,0x00,
|
|
};
|
|
// [9] tophat
|
|
static const uint8_t emoji_lg_tophat[] PROGMEM = {
|
|
0x00,0x00, 0x1F,0x80, 0x3F,0xC0, 0x3F,0xC0, 0x3F,0xC0, 0x3F,0xC0, 0x3F,0xC0, 0x20,0x40, 0x7F,0xE0, 0xFF,0xF0, 0xFF,0xF0, 0x00,0x00,
|
|
};
|
|
// [10] motorcycle
|
|
static const uint8_t emoji_lg_motorcycle[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x0F,0x00, 0x1F,0x80, 0x7F,0xE0, 0xDF,0xB0, 0xDF,0xB0, 0xDF,0xB0, 0xDF,0xB0, 0x60,0x60, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [11] seedling
|
|
static const uint8_t emoji_lg_seedling[] PROGMEM = {
|
|
0x00,0x00, 0x30,0x00, 0x79,0x80, 0x7B,0xC0, 0x33,0xC0, 0x1F,0x80, 0x06,0x00, 0x06,0x00, 0x06,0x00, 0x06,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [12] flag_au
|
|
static const uint8_t emoji_lg_flag_au[] PROGMEM = {
|
|
0x00,0x00, 0x32,0x40, 0x4A,0x40, 0x4A,0x40, 0x7A,0x40, 0x4A,0x40, 0x49,0x80, 0x00,0x00, 0xFF,0xF0, 0x00,0x00, 0xFF,0xF0, 0x00,0x00,
|
|
};
|
|
// [13] umbrella
|
|
static const uint8_t emoji_lg_umbrella[] PROGMEM = {
|
|
0x06,0x00, 0x1F,0x80, 0x3F,0xC0, 0x7F,0xE0, 0xFF,0xF0, 0xDB,0x70, 0x06,0x00, 0x06,0x00, 0x06,0x00, 0x06,0x00, 0x46,0x00, 0x3C,0x00,
|
|
};
|
|
// [14] nazar
|
|
static const uint8_t emoji_lg_nazar[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x4F,0x20, 0x99,0x90, 0xB6,0xD0, 0xB6,0xD0, 0xB6,0xD0, 0x99,0x90, 0x4F,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [15] globe
|
|
static const uint8_t emoji_lg_globe[] PROGMEM = {
|
|
0x1F,0x80, 0x34,0xC0, 0x66,0x60, 0x4F,0x20, 0x8E,0x10, 0x86,0x10, 0x80,0x30, 0x46,0x60, 0x43,0xE0, 0x30,0xC0, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [16] radioactive
|
|
static const uint8_t emoji_lg_radioactive[] PROGMEM = {
|
|
0x00,0x00, 0x22,0x40, 0x32,0xC0, 0x32,0xC0, 0x1B,0x40, 0x00,0x00, 0x0F,0x00, 0x0F,0x00, 0x00,0x00, 0x60,0x20, 0x39,0xC0, 0x0F,0x00,
|
|
};
|
|
// [17] cow
|
|
static const uint8_t emoji_lg_cow[] PROGMEM = {
|
|
0x00,0x00, 0xC0,0x60, 0x6E,0xC0, 0x3F,0x80, 0x2A,0x80, 0x3F,0x80, 0x3F,0x80, 0x7F,0xC0, 0x5F,0x40, 0x5F,0x40, 0x11,0x00, 0x31,0x80,
|
|
};
|
|
// [18] alien
|
|
static const uint8_t emoji_lg_alien[] PROGMEM = {
|
|
0x1F,0x80, 0x3F,0xC0, 0x7F,0xE0, 0x76,0xE0, 0xF6,0xF0, 0x96,0x90, 0x7F,0xE0, 0x36,0xC0, 0x3F,0xC0, 0x16,0x80, 0x0F,0x00, 0x06,0x00,
|
|
};
|
|
// [19] invader
|
|
static const uint8_t emoji_lg_invader[] PROGMEM = {
|
|
0x10,0x80, 0x09,0x00, 0x1F,0x80, 0x36,0xC0, 0x7F,0xE0, 0x5F,0xA0, 0x50,0xA0, 0x50,0xA0, 0x19,0x80, 0x19,0x80, 0x30,0xC0, 0x00,0x00,
|
|
};
|
|
// [20] dagger
|
|
static const uint8_t emoji_lg_dagger[] PROGMEM = {
|
|
0x01,0x80, 0x01,0x40, 0x01,0xA0, 0x01,0xC0, 0x01,0x80, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x60,0x00, 0x40,0x00,
|
|
};
|
|
// [21] grimace
|
|
static const uint8_t emoji_lg_grimace[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x59,0xA0, 0x59,0xA0, 0x40,0x20, 0x40,0x20, 0x5F,0xA0, 0x55,0x40, 0x5F,0xA0, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [22] mountain
|
|
static const uint8_t emoji_lg_mountain[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x06,0x00, 0x0F,0x00, 0x19,0x80, 0x30,0xC0, 0x66,0x60, 0xCF,0x30, 0x9F,0x90, 0xFF,0xF0, 0xFF,0xF0, 0x00,0x00,
|
|
};
|
|
// [23] end_arrow
|
|
static const uint8_t emoji_lg_end_arrow[] PROGMEM = {
|
|
0x00,0x00, 0x7B,0x60, 0x43,0x60, 0x42,0xA0, 0x72,0xA0, 0x43,0x60, 0x43,0x60, 0x7B,0x60, 0x00,0x00, 0x06,0x00, 0x0F,0x00, 0x06,0x00,
|
|
};
|
|
// [24] hollow_circle
|
|
static const uint8_t emoji_lg_hollow_circle[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x40,0x20, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x40,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [25] dragon
|
|
static const uint8_t emoji_lg_dragon[] PROGMEM = {
|
|
0x60,0x00, 0xF0,0x00, 0x76,0x00, 0x3F,0x00, 0x1F,0x00, 0x0F,0x00, 0x1F,0x80, 0x3F,0xC0, 0x79,0xE0, 0x30,0xC0, 0x20,0x40, 0x30,0xC0,
|
|
};
|
|
// [26] globe_meridians
|
|
static const uint8_t emoji_lg_globe_meridians[] PROGMEM = {
|
|
0x1F,0x80, 0x26,0x40, 0x46,0x20, 0x86,0x10, 0xFF,0xF0, 0x86,0x10, 0x86,0x10, 0x46,0x20, 0x26,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [27] eggplant
|
|
static const uint8_t emoji_lg_eggplant[] PROGMEM = {
|
|
0x01,0x80, 0x03,0x00, 0x07,0x00, 0x0F,0x00, 0x1F,0x00, 0x3F,0x00, 0x3F,0x00, 0x7E,0x00, 0x7C,0x00, 0x78,0x00, 0x30,0x00, 0x00,0x00,
|
|
};
|
|
// [28] shield
|
|
static const uint8_t emoji_lg_shield[] PROGMEM = {
|
|
0x00,0x00, 0x7F,0xE0, 0x7F,0xE0, 0x6F,0x60, 0x6F,0x60, 0x6F,0x60, 0x36,0xC0, 0x3F,0xC0, 0x1F,0x80, 0x0F,0x00, 0x06,0x00, 0x00,0x00,
|
|
};
|
|
// [29] goggles
|
|
static const uint8_t emoji_lg_goggles[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x00,0x00, 0x79,0xE0, 0xCF,0x30, 0x86,0x10, 0x86,0x10, 0xCF,0x30, 0x79,0xE0, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [30] lizard
|
|
static const uint8_t emoji_lg_lizard[] PROGMEM = {
|
|
0x00,0x00, 0x03,0x80, 0x07,0xC0, 0x8F,0x00, 0x7F,0x00, 0x3E,0x00, 0x3F,0x80, 0x23,0xC0, 0x41,0xC0, 0x00,0xC0, 0x00,0x60, 0x00,0x20,
|
|
};
|
|
// [31] zany_face
|
|
static const uint8_t emoji_lg_zany_face[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x59,0x20, 0x58,0xA0, 0x40,0x20, 0x40,0x20, 0x4F,0x20, 0x50,0xA0, 0x20,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [NEW] hundred_points 💯
|
|
static const uint8_t emoji_lg_hundred_points[] PROGMEM = {
|
|
0x00,0x00, 0x5D,0xC0, 0xD5,0x40, 0x55,0x40, 0x55,0x40, 0x5D,0xC0, 0x00,0x00, 0x00,0x00, 0xFF,0xE0, 0x00,0x00, 0xFF,0xE0, 0x00,0x00,
|
|
};
|
|
// [NEW] grinning 😁
|
|
static const uint8_t emoji_lg_grinning[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x48,0xA0, 0x55,0x60, 0x80,0x10, 0x9F,0x90, 0x90,0x90, 0x4F,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [32] kangaroo
|
|
static const uint8_t emoji_lg_kangaroo[] PROGMEM = {
|
|
0x0E,0x00, 0x1F,0x00, 0x1F,0x00, 0x0E,0x00, 0x0F,0x00, 0x07,0x80, 0x47,0x80, 0x65,0x80, 0x3C,0x80, 0x18,0x80, 0x10,0xC0, 0x18,0xF0,
|
|
};
|
|
// [33] feather
|
|
static const uint8_t emoji_lg_feather[] PROGMEM = {
|
|
0x00,0x20, 0x00,0x60, 0x00,0xC0, 0x01,0x80, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x60,0x00, 0x70,0x00, 0x00,0x00,
|
|
};
|
|
// [34] bright
|
|
static const uint8_t emoji_lg_bright[] PROGMEM = {
|
|
0x06,0x00, 0x26,0x40, 0x16,0x80, 0x0F,0x00, 0x6F,0x60, 0x6F,0x60, 0x0F,0x00, 0x16,0x80, 0x26,0x40, 0x06,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [35] part_alt
|
|
static const uint8_t emoji_lg_part_alt[] PROGMEM = {
|
|
0xC0,0xC0, 0xE1,0xC0, 0xF3,0xC0, 0xDE,0xC0, 0xCC,0xC0, 0xCC,0xC0, 0xC0,0xC0, 0xC0,0xC0, 0xC0,0xC0, 0xC0,0xC0, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [36] motorboat
|
|
static const uint8_t emoji_lg_motorboat[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x02,0x00, 0x07,0x00, 0x0F,0x80, 0x1F,0xC0, 0xFF,0xF0, 0x7F,0xE0, 0x3F,0xC0, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [37] domino
|
|
static const uint8_t emoji_lg_domino[] PROGMEM = {
|
|
0xFF,0xF0, 0x99,0x90, 0x80,0x10, 0x99,0x90, 0x80,0x10, 0x99,0x90, 0xFF,0xF0, 0x80,0x10, 0x80,0x10, 0x86,0x10, 0x80,0x10, 0xFF,0xF0,
|
|
};
|
|
// [38] satellite
|
|
static const uint8_t emoji_lg_satellite[] PROGMEM = {
|
|
0x78,0x00, 0xCC,0x00, 0x84,0x00, 0xCD,0x00, 0x7B,0x00, 0x03,0x80, 0x01,0xC0, 0x00,0xE0, 0x00,0x60, 0x00,0x20, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [39] customs
|
|
static const uint8_t emoji_lg_customs[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x40,0x20, 0x4F,0x20, 0x50,0xA0, 0x50,0xA0, 0x4F,0x20, 0x42,0x20, 0x22,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [40] cowboy
|
|
static const uint8_t emoji_lg_cowboy[] PROGMEM = {
|
|
0x0F,0x00, 0x0F,0x00, 0x7F,0xE0, 0xFF,0xF0, 0x00,0x00, 0x3F,0xC0, 0x59,0xA0, 0x40,0x20, 0x4F,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [41] wheel
|
|
static const uint8_t emoji_lg_wheel[] PROGMEM = {
|
|
0x1F,0x80, 0x26,0x40, 0x46,0x20, 0x9F,0x90, 0xB6,0xD0, 0xFF,0xF0, 0xB6,0xD0, 0x9F,0x90, 0x46,0x20, 0x26,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [42] koala
|
|
static const uint8_t emoji_lg_koala[] PROGMEM = {
|
|
0x60,0x60, 0xF0,0xF0, 0xF0,0xF0, 0x76,0xE0, 0x26,0x40, 0x2F,0x40, 0x26,0x40, 0x30,0xC0, 0x1F,0x80, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [43] control_knobs
|
|
static const uint8_t emoji_lg_control_knobs[] PROGMEM = {
|
|
0x00,0x00, 0x33,0x30, 0x33,0x30, 0x33,0x30, 0x33,0x30, 0x33,0x30, 0x33,0x30, 0x7B,0x30, 0x37,0xB0, 0x33,0x70, 0x33,0x30, 0x00,0x00,
|
|
};
|
|
// [44] peach
|
|
static const uint8_t emoji_lg_peach[] PROGMEM = {
|
|
0x06,0x00, 0x0C,0x00, 0x1E,0x00, 0x3F,0x00, 0x7F,0x80, 0x7B,0xC0, 0x7B,0xC0, 0x7B,0xC0, 0x3F,0xC0, 0x1F,0x80, 0x0F,0x00, 0x00,0x00,
|
|
};
|
|
// [45] racing_car
|
|
static const uint8_t emoji_lg_racing_car[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x00,0x00, 0x07,0x80, 0x0F,0xC0, 0x7F,0xE0, 0xFF,0xF0, 0xFF,0xF0, 0x6F,0x60, 0x49,0x20, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [46] mouse 🐭
|
|
static const uint8_t emoji_lg_mouse[] PROGMEM = {
|
|
0x30,0xC0, 0x79,0xE0, 0x79,0xE0, 0x3F,0xC0, 0x49,0x20, 0x80,0x10, 0x86,0x10, 0x89,0x10, 0x40,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [47] mushroom 🍄
|
|
static const uint8_t emoji_lg_mushroom[] PROGMEM = {
|
|
0x1F,0x80, 0x3F,0xC0, 0x7F,0xE0, 0xE6,0x70, 0xE6,0x70, 0x7F,0xE0, 0x3F,0xC0, 0x0F,0x00, 0x0F,0x00, 0x0F,0x00, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [48] biohazard ☣️
|
|
static const uint8_t emoji_lg_biohazard[] PROGMEM = {
|
|
0x0F,0x00, 0x1F,0x80, 0x3F,0xC0, 0x1F,0x80, 0x0F,0x00, 0x66,0x60, 0x76,0xE0, 0x70,0xE0, 0x79,0xE0, 0x39,0xC0, 0x19,0x80, 0x00,0x00,
|
|
};
|
|
// [49] panda 🐼
|
|
static const uint8_t emoji_lg_panda[] PROGMEM = {
|
|
0x00,0x00, 0x60,0x60, 0xF0,0xF0, 0xF0,0xF0, 0x7F,0xE0, 0x59,0xA0, 0x59,0xA0, 0x40,0x20, 0x46,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [50] anger 💢
|
|
static const uint8_t emoji_lg_anger[] PROGMEM = {
|
|
0x00,0x00, 0x3C,0xC0, 0x3C,0xC0, 0x30,0xC0, 0x30,0x00, 0x00,0x00, 0x00,0x00, 0x00,0xC0, 0x30,0xC0, 0x33,0xC0, 0x33,0xC0, 0x00,0x00,
|
|
};
|
|
// [51] dragon_face 🐲
|
|
static const uint8_t emoji_lg_dragon_face[] PROGMEM = {
|
|
0xC0,0x30, 0xE0,0x70, 0x76,0xE0, 0x3F,0xC0, 0x69,0x60, 0x40,0x20, 0x4F,0x20, 0x29,0x40, 0x30,0xC0, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [52] pager 📟
|
|
static const uint8_t emoji_lg_pager[] PROGMEM = {
|
|
0x00,0x00, 0x7F,0xE0, 0x40,0x20, 0x5F,0xA0, 0x5F,0xA0, 0x40,0x20, 0x5B,0x20, 0x5B,0x20, 0x40,0x20, 0x7F,0xE0, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [53] bee 🐝
|
|
static const uint8_t emoji_lg_bee[] PROGMEM = {
|
|
0x00,0x00, 0x19,0x80, 0x19,0x80, 0x3F,0x80, 0x7F,0xC0, 0x7F,0xE0, 0x7F,0xE0, 0x7F,0xC0, 0x3F,0x80, 0x1F,0x40, 0x0A,0x00, 0x00,0x00,
|
|
};
|
|
// [54] bulb 💡
|
|
static const uint8_t emoji_lg_bulb[] PROGMEM = {
|
|
0x1F,0x80, 0x20,0x40, 0x40,0x20, 0x40,0x20, 0x40,0x20, 0x20,0x40, 0x30,0xC0, 0x1F,0x80, 0x16,0x80, 0x1F,0x80, 0x0F,0x00, 0x00,0x00,
|
|
};
|
|
// [55] cat 🐱
|
|
static const uint8_t emoji_lg_cat[] PROGMEM = {
|
|
0x40,0x20, 0x60,0x60, 0x70,0xE0, 0x3F,0xC0, 0x59,0xA0, 0x40,0x20, 0x40,0x20, 0x46,0x20, 0x29,0x40, 0x30,0xC0, 0x1F,0x80, 0x00,0x00,
|
|
};
|
|
// [56] fleur ⚜️
|
|
static const uint8_t emoji_lg_fleur[] PROGMEM = {
|
|
0x06,0x00, 0x06,0x00, 0x0F,0x00, 0x6F,0x60, 0xF6,0xF0, 0xF6,0xF0, 0x76,0xE0, 0x3F,0xC0, 0x1F,0x80, 0x0F,0x00, 0x19,0x80, 0x00,0x00,
|
|
};
|
|
// [57] moon 🌔
|
|
static const uint8_t emoji_lg_moon[] PROGMEM = {
|
|
0x1F,0x80, 0x3F,0xC0, 0x7F,0xE0, 0x7F,0x80, 0xFF,0x80, 0xFF,0x00, 0xFF,0x00, 0xFF,0x80, 0x7F,0x80, 0x7F,0xE0, 0x3F,0xC0, 0x1F,0x80,
|
|
};
|
|
// [58] coffee ☕
|
|
static const uint8_t emoji_lg_coffee[] PROGMEM = {
|
|
0x24,0x80, 0x12,0x40, 0x00,0x00, 0x7F,0xC0, 0x40,0x70, 0x40,0x50, 0x40,0x50, 0x40,0x70, 0x7F,0xC0, 0x00,0x00, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
// [59] tooth 🦷
|
|
static const uint8_t emoji_lg_tooth[] PROGMEM = {
|
|
0x3F,0xC0, 0x7F,0xE0, 0xFF,0xF0, 0xFF,0xF0, 0xFF,0xF0, 0x7F,0xE0, 0x3F,0xC0, 0x3F,0xC0, 0x39,0xC0, 0x39,0xC0, 0x30,0xC0, 0x20,0x40,
|
|
};
|
|
// [60] pretzel 🥨
|
|
static const uint8_t emoji_lg_pretzel[] PROGMEM = {
|
|
0x39,0xC0, 0x46,0x20, 0x80,0x20, 0x86,0x10, 0x49,0x20, 0x30,0xC0, 0x30,0xC0, 0x49,0x20, 0x86,0x10, 0x80,0x10, 0x46,0x20, 0x39,0xC0,
|
|
};
|
|
// [61] abacus 🧮
|
|
static const uint8_t emoji_lg_abacus[] PROGMEM = {
|
|
0xFF,0xF0, 0x80,0x10, 0xB6,0x50, 0x80,0x10, 0xA6,0x90, 0x80,0x10, 0x94,0xD0, 0x80,0x10, 0xB2,0x50, 0x80,0x10, 0xFF,0xF0, 0x00,0x00,
|
|
};
|
|
// [62] moai 🗿
|
|
static const uint8_t emoji_lg_moai[] PROGMEM = {
|
|
0x3F,0xC0, 0x7F,0xC0, 0x7F,0xC0, 0x39,0xC0, 0x39,0xC0, 0x3F,0xC0, 0x27,0x40, 0x3F,0x80, 0x2F,0x00, 0x3F,0x00, 0x3F,0x00, 0x1E,0x00,
|
|
};
|
|
// [63] tipping 💁
|
|
static const uint8_t emoji_lg_tipping[] PROGMEM = {
|
|
0x1E,0x00, 0x3F,0x00, 0x3F,0x00, 0x1E,0x00, 0x0C,0x00, 0x1E,0x00, 0x3F,0x00, 0x7F,0x80, 0x0C,0xE0, 0x0D,0xE0, 0x12,0xE0, 0x33,0x00,
|
|
};
|
|
// [64] hedgehog 🦔
|
|
static const uint8_t emoji_lg_hedgehog[] PROGMEM = {
|
|
0x00,0x00, 0x0A,0x80, 0x15,0x40, 0x2A,0xA0, 0x55,0x60, 0x7E,0xF0, 0xDB,0x90, 0xFF,0xD0, 0x7F,0xE0, 0x3F,0xC0, 0x24,0x80, 0x00,0x00,
|
|
};
|
|
// [67] diamond_suit ♦️
|
|
static const uint8_t emoji_lg_diamond_suit[] PROGMEM = {
|
|
0x00,0x00, 0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x3F,0x80, 0x7F,0xC0, 0x3F,0x80, 0x1F,0x00, 0x0E,0x00, 0x04,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [68] spade_suit ♠️
|
|
static const uint8_t emoji_lg_spade_suit[] PROGMEM = {
|
|
0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x3F,0x80, 0x7F,0xC0, 0xFF,0xE0, 0xFF,0xE0, 0x7F,0xC0, 0x15,0x00, 0x04,0x00, 0x0E,0x00, 0x00,0x00,
|
|
};
|
|
// [69] pizza 🍕
|
|
static const uint8_t emoji_lg_pizza[] PROGMEM = {
|
|
0x02,0x00, 0x06,0x00, 0x0F,0x00, 0x0B,0x00, 0x1F,0x80, 0x1D,0x80, 0x3F,0xC0, 0x2F,0x40, 0x7F,0xE0, 0x7F,0xE0, 0xFF,0xF0, 0x00,0x00,
|
|
};
|
|
// [70] four_leaf_clover 🍀
|
|
static const uint8_t emoji_lg_four_leaf_clover[] PROGMEM = {
|
|
0x0C,0x00, 0x1E,0x00, 0x1E,0x00, 0x6D,0x80, 0xF3,0xC0, 0xF3,0xC0, 0x6D,0x80, 0x1E,0x00, 0x1E,0x00, 0x0C,0x00, 0x06,0x00, 0x00,0x00,
|
|
};
|
|
// [71] cloud ☁️
|
|
static const uint8_t emoji_lg_cloud[] PROGMEM = {
|
|
0x00,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x80, 0xFF,0xC0, 0xFF,0xE0, 0xFF,0xE0, 0x7F,0xC0, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [72] rocket 🚀
|
|
static const uint8_t emoji_lg_rocket[] PROGMEM = {
|
|
0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x1B,0x00, 0x1B,0x00, 0x3F,0x80, 0x7F,0xC0, 0x5F,0x40, 0x9F,0x20, 0x0E,0x00, 0x15,0x00, 0x00,0x00,
|
|
};
|
|
// [73] passport_control 🛂
|
|
static const uint8_t emoji_lg_passport_control[] PROGMEM = {
|
|
0x3F,0xC0, 0x40,0x20, 0x46,0x20, 0x4F,0x20, 0x46,0x20, 0x40,0x20, 0x44,0x20, 0x4E,0x20, 0x5F,0x20, 0x40,0x20, 0x3F,0xC0, 0x00,0x00,
|
|
};
|
|
// [74] eight_spoked_asterisk ✳️
|
|
static const uint8_t emoji_lg_eight_spoked_asterisk[] PROGMEM = {
|
|
0x7F,0xE0, 0x84,0x10, 0xA4,0x90, 0x95,0x10, 0x8E,0x10, 0xFF,0xD0, 0x8E,0x10, 0x95,0x10, 0xA4,0x90, 0x84,0x10, 0x7F,0xE0, 0x00,0x00,
|
|
};
|
|
// [75] signal_strength 📶
|
|
static const uint8_t emoji_lg_signal_strength[] PROGMEM = {
|
|
0x00,0x20, 0x00,0x20, 0x00,0xA0, 0x00,0xA0, 0x02,0xA0, 0x02,0xA0, 0x0A,0xA0, 0x0A,0xA0, 0x2A,0xA0, 0x2A,0xA0, 0xAA,0xA0, 0xAA,0xA0,
|
|
};
|
|
// [76] beer 🍺
|
|
static const uint8_t emoji_lg_beer[] PROGMEM = {
|
|
0x24,0x80, 0x77,0x60, 0xFF,0x80, 0x7F,0xC0, 0x40,0x70, 0x5F,0x50, 0x5F,0x50, 0x5F,0x50, 0x40,0x70, 0x7F,0xC0, 0xFF,0xE0, 0x00,0x00,
|
|
};
|
|
|
|
|
|
static const uint8_t* const EMOJI_SPRITES_LG[] PROGMEM = {
|
|
// Faces/emotion first
|
|
emoji_lg_joy, emoji_lg_frown, emoji_lg_loudly_crying,
|
|
emoji_lg_grimace, emoji_lg_zany_face, emoji_lg_hundred_points,
|
|
emoji_lg_grinning, emoji_lg_cowboy,
|
|
// Thumbsup + heart
|
|
emoji_lg_thumbsup, emoji_lg_heart,
|
|
// Everything else in original relative order
|
|
emoji_lg_wireless, emoji_lg_infinity, emoji_lg_trex, emoji_lg_skull, emoji_lg_cross,
|
|
emoji_lg_lightning, emoji_lg_tophat, emoji_lg_motorcycle, emoji_lg_seedling, emoji_lg_flag_au,
|
|
emoji_lg_umbrella, emoji_lg_nazar, emoji_lg_globe, emoji_lg_radioactive, emoji_lg_cow,
|
|
emoji_lg_alien, emoji_lg_invader, emoji_lg_dagger,
|
|
emoji_lg_mountain, emoji_lg_end_arrow, emoji_lg_hollow_circle, emoji_lg_dragon, emoji_lg_globe_meridians,
|
|
emoji_lg_eggplant, emoji_lg_shield, emoji_lg_goggles, emoji_lg_lizard,
|
|
emoji_lg_kangaroo, emoji_lg_feather, emoji_lg_bright, emoji_lg_part_alt, emoji_lg_motorboat,
|
|
emoji_lg_domino, emoji_lg_satellite, emoji_lg_customs, emoji_lg_wheel,
|
|
emoji_lg_koala, emoji_lg_control_knobs, emoji_lg_peach, emoji_lg_racing_car,
|
|
emoji_lg_mouse, emoji_lg_mushroom, emoji_lg_biohazard, emoji_lg_panda,
|
|
emoji_lg_anger, emoji_lg_dragon_face, emoji_lg_pager, emoji_lg_bee,
|
|
emoji_lg_bulb, emoji_lg_cat, emoji_lg_fleur, emoji_lg_moon,
|
|
emoji_lg_coffee, emoji_lg_tooth, emoji_lg_pretzel, emoji_lg_abacus,
|
|
emoji_lg_moai, emoji_lg_tipping, emoji_lg_hedgehog,
|
|
emoji_lg_diamond_suit, emoji_lg_spade_suit, emoji_lg_pizza, emoji_lg_four_leaf_clover,
|
|
emoji_lg_cloud, emoji_lg_rocket, emoji_lg_passport_control,
|
|
emoji_lg_eight_spoked_asterisk, emoji_lg_signal_strength,
|
|
emoji_lg_beer,
|
|
};
|
|
|
|
// ======== SMALL 10x10 SPRITES ========
|
|
|
|
static const uint8_t emoji_sm_joy[] PROGMEM = {
|
|
0x3F,0x00, 0x61,0x80, 0xF3,0xC0, 0x80,0x40, 0xA1,0x40, 0x9E,0x40, 0x40,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_thumbsup[] PROGMEM = {
|
|
0x70,0x00, 0x70,0x00, 0x70,0x00, 0x7F,0x00, 0xFF,0x00, 0xFF,0x00, 0x7F,0x00, 0x3E,0x00, 0x1C,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_frown[] PROGMEM = {
|
|
0x3F,0x00, 0x61,0x80, 0xF3,0xC0, 0x80,0x40, 0x9E,0x40, 0xA1,0x40, 0x40,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_wireless[] PROGMEM = {
|
|
0x00,0x00, 0x7F,0x80, 0xC0,0xC0, 0x1E,0x00, 0x33,0x00, 0x21,0x00, 0x00,0x00, 0x0C,0x00, 0x0C,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_infinity[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0xE7,0x00, 0x99,0x00, 0x99,0x00, 0xA5,0x00, 0x42,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_trex[] PROGMEM = {
|
|
0x07,0x80, 0x0F,0x80, 0x0F,0x80, 0x58,0x00, 0x78,0x00, 0x38,0x00, 0x38,0x00, 0x3C,0x00, 0x24,0x00, 0x26,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_skull[] PROGMEM = {
|
|
0x3F,0x00, 0x61,0x80, 0x73,0x80, 0x40,0x80, 0x52,0x80, 0x3F,0x00, 0x3F,0x00, 0xED,0xC0, 0x6D,0x80, 0xAD,0x40,
|
|
};
|
|
static const uint8_t emoji_sm_cross[] PROGMEM = {
|
|
0x1E,0x00, 0x1E,0x00, 0x3F,0x00, 0x3F,0x00, 0x3F,0x00, 0x1E,0x00, 0x1E,0x00, 0x1E,0x00, 0x1E,0x00, 0x1E,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_lightning[] PROGMEM = {
|
|
0x06,0x00, 0x0E,0x00, 0x1C,0x00, 0x3E,0x00, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_tophat[] PROGMEM = {
|
|
0x00,0x00, 0x3F,0x00, 0x3F,0x00, 0x3F,0x00, 0x3F,0x00, 0x21,0x00, 0x7F,0x80, 0xFF,0xC0, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_motorcycle[] PROGMEM = {
|
|
0x00,0x00, 0x1E,0x00, 0x7F,0x80, 0xDE,0xC0, 0xDE,0xC0, 0xDE,0xC0, 0xDE,0xC0, 0x61,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_seedling[] PROGMEM = {
|
|
0x00,0x00, 0x70,0x00, 0x77,0x00, 0x77,0x00, 0x3F,0x00, 0x0C,0x00, 0x0C,0x00, 0x0C,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_flag_au[] PROGMEM = {
|
|
0x00,0x00, 0x75,0x00, 0x55,0x00, 0x75,0x00, 0x55,0x00, 0x53,0x00, 0x00,0x00, 0xFF,0xC0, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_umbrella[] PROGMEM = {
|
|
0x0C,0x00, 0x3F,0x00, 0x7F,0x80, 0xFF,0xC0, 0xF7,0xC0, 0x0C,0x00, 0x0C,0x00, 0x0C,0x00, 0x4C,0x00, 0x78,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_nazar[] PROGMEM = {
|
|
0x3F,0x00, 0x40,0x80, 0x9E,0x40, 0xBF,0x40, 0xAD,0x40, 0xBF,0x40, 0x9E,0x40, 0x4C,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_globe[] PROGMEM = {
|
|
0x3F,0x00, 0x69,0x80, 0x4C,0x80, 0x9C,0x40, 0x8C,0x40, 0x80,0xC0, 0x4D,0x80, 0x67,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_radioactive[] PROGMEM = {
|
|
0x00,0x00, 0x25,0x00, 0x25,0x00, 0x37,0x00, 0x00,0x00, 0x1E,0x00, 0x1E,0x00, 0x40,0x00, 0x73,0x80, 0x1E,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_cow[] PROGMEM = {
|
|
0x00,0x00, 0xC1,0x80, 0x7F,0x00, 0x3F,0x00, 0x3F,0x00, 0x7F,0x00, 0x7F,0x00, 0x7F,0x00, 0x36,0x00, 0x23,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_alien[] PROGMEM = {
|
|
0x3F,0x00, 0x7F,0x80, 0x7F,0x80, 0xED,0xC0, 0xAD,0x40, 0x7F,0x80, 0x3F,0x00, 0x3F,0x00, 0x1E,0x00, 0x0C,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_invader[] PROGMEM = {
|
|
0x33,0x00, 0x1E,0x00, 0x3F,0x00, 0x7F,0x80, 0x7F,0x80, 0x61,0x80, 0x73,0x80, 0x33,0x00, 0x33,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_dagger[] PROGMEM = {
|
|
0x03,0x00, 0x03,0x80, 0x03,0x80, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x60,0x00, 0x40,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_grimace[] PROGMEM = {
|
|
0x3F,0x00, 0x61,0x80, 0x73,0x80, 0x40,0x80, 0x40,0x80, 0x7F,0x80, 0x55,0x00, 0x7F,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_mountain[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x0C,0x00, 0x1E,0x00, 0x33,0x00, 0x6D,0x80, 0xDE,0xC0, 0xFF,0xC0, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_end_arrow[] PROGMEM = {
|
|
0x00,0x00, 0x77,0x80, 0x47,0x80, 0x65,0x80, 0x47,0x80, 0x47,0x80, 0x76,0x80, 0x0C,0x00, 0x1E,0x00, 0x0C,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_hollow_circle[] PROGMEM = {
|
|
0x3F,0x00, 0x40,0x80, 0x80,0x40, 0x80,0x40, 0x80,0x40, 0x80,0x40, 0x80,0x40, 0x40,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_dragon[] PROGMEM = {
|
|
0x60,0x00, 0xE0,0x00, 0x7C,0x00, 0x3E,0x00, 0x1E,0x00, 0x3F,0x00, 0x7F,0x80, 0x73,0x80, 0x21,0x00, 0x21,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_globe_meridians[] PROGMEM = {
|
|
0x3F,0x00, 0x4C,0x80, 0x8C,0x40, 0xFF,0xC0, 0x8C,0x40, 0x8C,0x40, 0x4C,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_eggplant[] PROGMEM = {
|
|
0x03,0x00, 0x06,0x00, 0x0E,0x00, 0x1E,0x00, 0x3E,0x00, 0x7E,0x00, 0x7C,0x00, 0x78,0x00, 0x70,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_shield[] PROGMEM = {
|
|
0x00,0x00, 0xFF,0xC0, 0xFF,0xC0, 0xDE,0xC0, 0xDE,0xC0, 0x6D,0x80, 0x7F,0x80, 0x3F,0x00, 0x1E,0x00, 0x0C,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_goggles[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x73,0x80, 0xDE,0xC0, 0x8C,0x40, 0x8C,0x40, 0xDE,0xC0, 0x73,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_lizard[] PROGMEM = {
|
|
0x00,0x00, 0x07,0x00, 0x9E,0x00, 0x7E,0x00, 0x3E,0x00, 0x27,0x80, 0x43,0x00, 0x01,0x80, 0x00,0x80, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_zany_face[] PROGMEM = {
|
|
0x3F,0x00, 0x60,0x80, 0x72,0x80, 0x40,0x80, 0x40,0x80, 0x5E,0x80, 0x61,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_hundred_points[] PROGMEM = {
|
|
0xDD,0xC0, 0x55,0x40, 0x55,0x40, 0x5D,0xC0, 0x00,0x00, 0x00,0x00, 0xFF,0x80, 0x00,0x00, 0xFF,0x80, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_grinning[] PROGMEM = {
|
|
0x3F,0x00, 0x61,0x80, 0xF3,0xC0, 0x80,0x40, 0xBF,0x40, 0x9E,0x40, 0x40,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_kangaroo[] PROGMEM = {
|
|
0x1C,0x00, 0x3E,0x00, 0x1C,0x00, 0x1E,0x00, 0x0F,0x00, 0x4F,0x00, 0x6B,0x00, 0x39,0x00, 0x31,0x00, 0x31,0xC0,
|
|
};
|
|
static const uint8_t emoji_sm_feather[] PROGMEM = {
|
|
0x00,0x80, 0x01,0x80, 0x03,0x00, 0x06,0x00, 0x0C,0x00, 0x18,0x00, 0x30,0x00, 0x60,0x00, 0x60,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_bright[] PROGMEM = {
|
|
0x0C,0x00, 0x2D,0x00, 0x1E,0x00, 0x5E,0x80, 0x7F,0x80, 0x1E,0x00, 0x2D,0x00, 0x0C,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_part_alt[] PROGMEM = {
|
|
0xC3,0x00, 0xE7,0x00, 0xDB,0x00, 0xDB,0x00, 0xC3,0x00, 0xC3,0x00, 0xC3,0x00, 0xC3,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_motorboat[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x0C,0x00, 0x1E,0x00, 0x3F,0x00, 0xFF,0xC0, 0x7F,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_domino[] PROGMEM = {
|
|
0xFF,0xC0, 0xB6,0x40, 0xB6,0x40, 0xB6,0x40, 0xFF,0xC0, 0x80,0x40, 0x8C,0x40, 0x80,0x40, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_satellite[] PROGMEM = {
|
|
0x70,0x00, 0xD8,0x00, 0x88,0x00, 0xFE,0x00, 0x07,0x00, 0x03,0x80, 0x01,0x80, 0x00,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_customs[] PROGMEM = {
|
|
0x3F,0x00, 0x40,0x80, 0x4C,0x80, 0x52,0x80, 0x61,0x80, 0x5E,0x80, 0x44,0x80, 0x3F,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_cowboy[] PROGMEM = {
|
|
0x1E,0x00, 0x1E,0x00, 0xFF,0xC0, 0x00,0x00, 0x3F,0x00, 0x73,0x80, 0x40,0x80, 0x4C,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_wheel[] PROGMEM = {
|
|
0x3F,0x00, 0x4C,0x80, 0x9E,0x40, 0xBF,0x40, 0xFF,0xC0, 0xBF,0x40, 0x9E,0x40, 0x4C,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_koala[] PROGMEM = {
|
|
0x61,0x80, 0xE1,0xC0, 0xED,0xC0, 0x6D,0x80, 0x3F,0x00, 0x2D,0x00, 0x33,0x00, 0x1E,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_control_knobs[] PROGMEM = {
|
|
0x00,0x00, 0x26,0xC0, 0x26,0xC0, 0x26,0xC0, 0x26,0xC0, 0x76,0xC0, 0x7E,0xC0, 0x2F,0xC0, 0x26,0xC0, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_peach[] PROGMEM = {
|
|
0x0C,0x00, 0x18,0x00, 0x3C,0x00, 0x7E,0x00, 0x77,0x00, 0x77,0x00, 0x7F,0x00, 0x3F,0x00, 0x1E,0x00, 0x00,0x00,
|
|
};
|
|
static const uint8_t emoji_sm_racing_car[] PROGMEM = {
|
|
0x00,0x00, 0x00,0x00, 0x0E,0x00, 0x1F,0x00, 0x7F,0x80, 0xFF,0xC0, 0xFF,0xC0, 0x5E,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [46] mouse 🐭
|
|
static const uint8_t emoji_sm_mouse[] PROGMEM = {
|
|
0x61,0x80, 0xF3,0xC0, 0x7F,0x80, 0x92,0x40, 0x80,0x40, 0x8C,0x40, 0x52,0x80, 0x40,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
// [47] mushroom 🍄
|
|
static const uint8_t emoji_sm_mushroom[] PROGMEM = {
|
|
0x3F,0x00, 0x7F,0x80, 0xED,0xC0, 0xED,0xC0, 0x7F,0x80, 0x3F,0x00, 0x1E,0x00, 0x1E,0x00, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
// [48] biohazard ☣️
|
|
static const uint8_t emoji_sm_biohazard[] PROGMEM = {
|
|
0x1E,0x00, 0x3F,0x00, 0x3F,0x00, 0x1E,0x00, 0x6D,0x80, 0x73,0x80, 0x73,0x80, 0x7B,0x80, 0x33,0x00, 0x00,0x00,
|
|
};
|
|
// [49] panda 🐼
|
|
static const uint8_t emoji_sm_panda[] PROGMEM = {
|
|
0xC0,0xC0, 0xF3,0xC0, 0x7F,0x80, 0xB3,0x40, 0xB3,0x40, 0x80,0x40, 0x4C,0x80, 0x21,0x00, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
// [50] anger 💢
|
|
static const uint8_t emoji_sm_anger[] PROGMEM = {
|
|
0x00,0x00, 0x73,0x00, 0x73,0x00, 0x63,0x00, 0x60,0x00, 0x01,0x80, 0x63,0x00, 0x67,0x00, 0x67,0x00, 0x00,0x00,
|
|
};
|
|
// [51] dragon_face 🐲
|
|
static const uint8_t emoji_sm_dragon_face[] PROGMEM = {
|
|
0xC0,0xC0, 0xED,0xC0, 0x7F,0x80, 0x52,0x80, 0x40,0x80, 0x4C,0x80, 0x33,0x00, 0x2D,0x00, 0x1E,0x00, 0x00,0x00,
|
|
};
|
|
// [52] pager 📟
|
|
static const uint8_t emoji_sm_pager[] PROGMEM = {
|
|
0x00,0x00, 0x7F,0x80, 0x40,0x80, 0x5E,0x80, 0x40,0x80, 0x5A,0x80, 0x5A,0x80, 0x40,0x80, 0x7F,0x80, 0x00,0x00,
|
|
};
|
|
// [53] bee 🐝
|
|
static const uint8_t emoji_sm_bee[] PROGMEM = {
|
|
0x33,0x00, 0x33,0x00, 0x7F,0x00, 0xFF,0x80, 0xFF,0xC0, 0xFF,0x80, 0x7F,0x00, 0x3E,0x80, 0x14,0x00, 0x00,0x00,
|
|
};
|
|
// [54] bulb 💡
|
|
static const uint8_t emoji_sm_bulb[] PROGMEM = {
|
|
0x3F,0x00, 0x40,0x80, 0x80,0x40, 0x80,0x40, 0x40,0x80, 0x33,0x00, 0x3F,0x00, 0x1E,0x00, 0x1E,0x00, 0x00,0x00,
|
|
};
|
|
// [55] cat 🐱
|
|
static const uint8_t emoji_sm_cat[] PROGMEM = {
|
|
0x80,0x40, 0xC0,0xC0, 0x7F,0x80, 0xB3,0x40, 0x80,0x40, 0x8C,0x40, 0x52,0x80, 0x61,0x80, 0x3F,0x00, 0x00,0x00,
|
|
};
|
|
// [56] fleur ⚜️
|
|
static const uint8_t emoji_sm_fleur[] PROGMEM = {
|
|
0x0C,0x00, 0x0C,0x00, 0x6D,0x80, 0xED,0xC0, 0xED,0xC0, 0x6D,0x80, 0x3F,0x00, 0x1E,0x00, 0x33,0x00, 0x00,0x00,
|
|
};
|
|
// [57] moon 🌔
|
|
static const uint8_t emoji_sm_moon[] PROGMEM = {
|
|
0x3F,0x00, 0x7F,0x80, 0xFF,0x80, 0xFE,0x00, 0xFE,0x00, 0xFE,0x00, 0xFE,0x00, 0xFF,0x80, 0x7F,0x80, 0x3F,0x00,
|
|
};
|
|
// [58] coffee ☕
|
|
static const uint8_t emoji_sm_coffee[] PROGMEM = {
|
|
0x49,0x00, 0x24,0x80, 0x00,0x00, 0xFF,0x00, 0x81,0xC0, 0x81,0x40, 0x81,0xC0, 0xFF,0x00, 0x00,0x00, 0xFE,0x00,
|
|
};
|
|
// [59] tooth 🦷
|
|
static const uint8_t emoji_sm_tooth[] PROGMEM = {
|
|
0x7F,0x80, 0xFF,0xC0, 0xFF,0xC0, 0xFF,0xC0, 0x7F,0x80, 0x3F,0x00, 0x3B,0x80, 0x31,0x80, 0x20,0x80, 0x00,0x00,
|
|
};
|
|
// [60] pretzel 🥨
|
|
static const uint8_t emoji_sm_pretzel[] PROGMEM = {
|
|
0x73,0x80, 0x9E,0x40, 0x8C,0x40, 0x52,0x80, 0x33,0x00, 0x33,0x00, 0x52,0x80, 0x8C,0x40, 0x9E,0x40, 0x73,0x80,
|
|
};
|
|
// [61] abacus 🧮
|
|
static const uint8_t emoji_sm_abacus[] PROGMEM = {
|
|
0xFF,0xC0, 0x80,0x40, 0xB5,0x40, 0x80,0x40, 0xAD,0x40, 0x80,0x40, 0xAB,0x40, 0x80,0x40, 0xFF,0xC0, 0x00,0x00,
|
|
};
|
|
// [62] moai 🗿
|
|
static const uint8_t emoji_sm_moai[] PROGMEM = {
|
|
0x7F,0x00, 0x7F,0x00, 0x33,0x00, 0x33,0x00, 0x3F,0x00, 0x2E,0x00, 0x3E,0x00, 0x3E,0x00, 0x3E,0x00, 0x1C,0x00,
|
|
};
|
|
// [63] tipping 💁
|
|
static const uint8_t emoji_sm_tipping[] PROGMEM = {
|
|
0x3C,0x00, 0x7E,0x00, 0x7E,0x00, 0x3C,0x00, 0x18,0x00, 0x3C,0x00, 0x7E,0x00, 0x1B,0x80, 0x1B,0x80, 0x36,0x00,
|
|
};
|
|
// [64] hedgehog 🦔
|
|
static const uint8_t emoji_sm_hedgehog[] PROGMEM = {
|
|
0x15,0x00, 0x2A,0x80, 0x55,0x40, 0xFF,0xC0, 0xDB,0x40, 0xFF,0x80, 0x7F,0x80, 0x3F,0x00, 0x24,0x00, 0x00,0x00,
|
|
};
|
|
// [65] loudly_crying 😭
|
|
static const uint8_t emoji_sm_loudly_crying[] PROGMEM = {
|
|
0x3E,0x00, 0x41,0x00, 0xB6,0x80, 0x80,0x40, 0xBE,0x40, 0x81,0x40, 0x63,0x00, 0x9C,0x80, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [66] heart ♥️
|
|
static const uint8_t emoji_sm_heart[] PROGMEM = {
|
|
0x00,0x00, 0x6C,0x00, 0xFE,0x00, 0xFE,0x00, 0x7C,0x00, 0x38,0x00, 0x10,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [67] diamond_suit ♦️
|
|
static const uint8_t emoji_sm_diamond_suit[] PROGMEM = {
|
|
0x00,0x00, 0x08,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x00, 0x3E,0x00, 0x1C,0x00, 0x08,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [68] spade_suit ♠️
|
|
static const uint8_t emoji_sm_spade_suit[] PROGMEM = {
|
|
0x08,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x00, 0xFF,0x80, 0xFF,0x80, 0x2A,0x00, 0x08,0x00, 0x1C,0x00, 0x00,0x00,
|
|
};
|
|
// [69] pizza 🍕
|
|
static const uint8_t emoji_sm_pizza[] PROGMEM = {
|
|
0x08,0x00, 0x1C,0x00, 0x14,0x00, 0x3E,0x00, 0x36,0x00, 0x6D,0x00, 0x7F,0x00, 0xFF,0x80, 0xFF,0x80, 0x00,0x00,
|
|
};
|
|
// [70] four_leaf_clover 🍀
|
|
static const uint8_t emoji_sm_four_leaf_clover[] PROGMEM = {
|
|
0x18,0x00, 0x3C,0x00, 0xDB,0x00, 0xE7,0x00, 0xE7,0x00, 0xDB,0x00, 0x3C,0x00, 0x18,0x00, 0x0C,0x00, 0x00,0x00,
|
|
};
|
|
// [71] cloud ☁️
|
|
static const uint8_t emoji_sm_cloud[] PROGMEM = {
|
|
0x00,0x00, 0x38,0x00, 0x7E,0x00, 0xFF,0x00, 0xFF,0x80, 0xFF,0x80, 0x7F,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
|
};
|
|
// [72] rocket 🚀
|
|
static const uint8_t emoji_sm_rocket[] PROGMEM = {
|
|
0x08,0x00, 0x1C,0x00, 0x36,0x00, 0x36,0x00, 0x7F,0x00, 0xBE,0x80, 0x3E,0x00, 0x1C,0x00, 0x2A,0x00, 0x00,0x00,
|
|
};
|
|
// [73] passport_control 🛂
|
|
static const uint8_t emoji_sm_passport_control[] PROGMEM = {
|
|
0x7F,0x80, 0x80,0x40, 0x8C,0x40, 0x9E,0x40, 0x8C,0x40, 0x80,0x40, 0x9C,0x40, 0xBE,0x40, 0x80,0x40, 0x7F,0x80,
|
|
};
|
|
// [74] eight_spoked_asterisk ✳️
|
|
static const uint8_t emoji_sm_eight_spoked_asterisk[] PROGMEM = {
|
|
0x7F,0x80, 0x84,0x40, 0xA5,0x40, 0x9E,0x40, 0xFF,0xC0, 0x9E,0x40, 0xA5,0x40, 0x84,0x40, 0x7F,0x80, 0x00,0x00,
|
|
};
|
|
// [75] signal_strength 📶
|
|
static const uint8_t emoji_sm_signal_strength[] PROGMEM = {
|
|
0x00,0x80, 0x00,0x80, 0x02,0x80, 0x02,0x80, 0x0A,0x80, 0x0A,0x80, 0x2A,0x80, 0x2A,0x80, 0xAA,0x80, 0xAA,0x80,
|
|
};
|
|
// [76] beer 🍺
|
|
static const uint8_t emoji_sm_beer[] PROGMEM = {
|
|
0x54,0x00, 0x6E,0xC0, 0xFF,0x80, 0x80,0xC0, 0xBE,0x40, 0xBE,0x40, 0x80,0xC0, 0xFF,0x80, 0x00,0x00, 0xFF,0x80,
|
|
};
|
|
|
|
static const uint8_t* const EMOJI_SPRITES_SM[] PROGMEM = {
|
|
// Faces/emotion first
|
|
emoji_sm_joy, emoji_sm_frown, emoji_sm_loudly_crying,
|
|
emoji_sm_grimace, emoji_sm_zany_face, emoji_sm_hundred_points,
|
|
emoji_sm_grinning, emoji_sm_cowboy,
|
|
// Thumbsup + heart
|
|
emoji_sm_thumbsup, emoji_sm_heart,
|
|
// Everything else in original relative order
|
|
emoji_sm_wireless, emoji_sm_infinity, emoji_sm_trex, emoji_sm_skull, emoji_sm_cross,
|
|
emoji_sm_lightning, emoji_sm_tophat, emoji_sm_motorcycle, emoji_sm_seedling, emoji_sm_flag_au,
|
|
emoji_sm_umbrella, emoji_sm_nazar, emoji_sm_globe, emoji_sm_radioactive, emoji_sm_cow,
|
|
emoji_sm_alien, emoji_sm_invader, emoji_sm_dagger,
|
|
emoji_sm_mountain, emoji_sm_end_arrow, emoji_sm_hollow_circle, emoji_sm_dragon, emoji_sm_globe_meridians,
|
|
emoji_sm_eggplant, emoji_sm_shield, emoji_sm_goggles, emoji_sm_lizard,
|
|
emoji_sm_kangaroo, emoji_sm_feather, emoji_sm_bright, emoji_sm_part_alt, emoji_sm_motorboat,
|
|
emoji_sm_domino, emoji_sm_satellite, emoji_sm_customs, emoji_sm_wheel,
|
|
emoji_sm_koala, emoji_sm_control_knobs, emoji_sm_peach, emoji_sm_racing_car,
|
|
emoji_sm_mouse, emoji_sm_mushroom, emoji_sm_biohazard, emoji_sm_panda,
|
|
emoji_sm_anger, emoji_sm_dragon_face, emoji_sm_pager, emoji_sm_bee,
|
|
emoji_sm_bulb, emoji_sm_cat, emoji_sm_fleur, emoji_sm_moon,
|
|
emoji_sm_coffee, emoji_sm_tooth, emoji_sm_pretzel, emoji_sm_abacus,
|
|
emoji_sm_moai, emoji_sm_tipping, emoji_sm_hedgehog,
|
|
emoji_sm_diamond_suit, emoji_sm_spade_suit, emoji_sm_pizza, emoji_sm_four_leaf_clover,
|
|
emoji_sm_cloud, emoji_sm_rocket, emoji_sm_passport_control,
|
|
emoji_sm_eight_spoked_asterisk, emoji_sm_signal_strength,
|
|
emoji_sm_beer,
|
|
};
|
|
|
|
// ---- Codepoint lookup for UTF-8 conversion ----
|
|
struct EmojiCodepoint { uint32_t cp; uint32_t cp2; uint8_t escape; };
|
|
|
|
static const EmojiCodepoint EMOJI_CODEPOINTS[EMOJI_COUNT] = {
|
|
// Faces/emotion first
|
|
{ 0x1F602, 0x0000, 0x80 }, // joy
|
|
{ 0x2639, 0x0000, 0x81 }, // frown
|
|
{ 0x1F62D, 0x0000, 0x82 }, // loudly_crying
|
|
{ 0x1F62C, 0x0000, 0x83 }, // grimace
|
|
{ 0x1F92A, 0x0000, 0x84 }, // zany_face
|
|
{ 0x1F4AF, 0x0000, 0x85 }, // hundred_points
|
|
{ 0x1F601, 0x0000, 0x86 }, // grinning
|
|
{ 0x1F920, 0x0000, 0x87 }, // cowboy
|
|
// Thumbsup + heart
|
|
{ 0x1F44D, 0x0000, 0x88 }, // thumbsup
|
|
{ 0x2665, 0x0000, 0x89 }, // heart
|
|
// Everything else in original relative order
|
|
{ 0x1F6DC, 0x0000, 0x8A }, // wireless
|
|
{ 0x267E, 0x0000, 0x8B }, // infinity
|
|
{ 0x1F996, 0x0000, 0x8C }, // trex
|
|
{ 0x2620, 0x0000, 0x8D }, // skull
|
|
{ 0x271D, 0x0000, 0x8E }, // cross
|
|
{ 0x26A1, 0x0000, 0x8F }, // lightning
|
|
{ 0x1F3A9, 0x0000, 0x90 }, // tophat
|
|
{ 0x1F3CD, 0x0000, 0x91 }, // motorcycle
|
|
{ 0x1F331, 0x0000, 0x92 }, // seedling
|
|
{ 0x1F1E6, 0x1F1FA, 0x93 }, // flag_au
|
|
{ 0x2602, 0x0000, 0x94 }, // umbrella
|
|
{ 0x1F9FF, 0x0000, 0x95 }, // nazar
|
|
{ 0x1F30F, 0x0000, 0x96 }, // globe
|
|
{ 0x2622, 0x0000, 0x97 }, // radioactive
|
|
{ 0x1F404, 0x0000, 0x98 }, // cow
|
|
{ 0x1F47D, 0x0000, 0x99 }, // alien
|
|
{ 0x1F47E, 0x0000, 0x9A }, // invader
|
|
{ 0x1F5E1, 0x0000, 0x9B }, // dagger
|
|
{ 0x26F0, 0x0000, 0x9C }, // mountain
|
|
{ 0x1F51A, 0x0000, 0x9D }, // end_arrow
|
|
{ 0x2B55, 0x0000, 0x9E }, // hollow_circle
|
|
{ 0x1F409, 0x0000, 0x9F }, // dragon
|
|
{ 0x1F310, 0x0000, 0xA0 }, // globe_meridians
|
|
{ 0x1F346, 0x0000, 0xA1 }, // eggplant
|
|
{ 0x1F6E1, 0x0000, 0xA2 }, // shield
|
|
{ 0x1F97D, 0x0000, 0xA3 }, // goggles
|
|
{ 0x1F98E, 0x0000, 0xA4 }, // lizard
|
|
{ 0x1F998, 0x0000, 0xA5 }, // kangaroo
|
|
{ 0x1FAB6, 0x0000, 0xA6 }, // feather
|
|
{ 0x1F506, 0x0000, 0xA7 }, // bright
|
|
{ 0x303D, 0x0000, 0xA8 }, // part_alt
|
|
{ 0x1F6E5, 0x0000, 0xA9 }, // motorboat
|
|
{ 0x1F030, 0x0000, 0xAA }, // domino
|
|
{ 0x1F4E1, 0x0000, 0xAB }, // satellite
|
|
{ 0x1F6C3, 0x0000, 0xAC }, // customs
|
|
{ 0x1F6DE, 0x0000, 0xAD }, // wheel
|
|
{ 0x1F428, 0x0000, 0xAE }, // koala
|
|
{ 0x1F39B, 0x0000, 0xAF }, // control_knobs
|
|
{ 0x1F351, 0x0000, 0xB0 }, // peach
|
|
{ 0x1F3CE, 0x0000, 0xB1 }, // racing_car
|
|
{ 0x1F42D, 0x0000, 0xB2 }, // mouse
|
|
{ 0x1F344, 0x0000, 0xB3 }, // mushroom
|
|
{ 0x2623, 0x0000, 0xB4 }, // biohazard
|
|
{ 0x1F43C, 0x0000, 0xB5 }, // panda
|
|
{ 0x1F4A2, 0x0000, 0xB6 }, // anger
|
|
{ 0x1F432, 0x0000, 0xB7 }, // dragon_face
|
|
{ 0x1F4DF, 0x0000, 0xB8 }, // pager
|
|
{ 0x1F41D, 0x0000, 0xB9 }, // bee
|
|
{ 0x1F4A1, 0x0000, 0xBA }, // bulb
|
|
{ 0x1F431, 0x0000, 0xBB }, // cat
|
|
{ 0x269C, 0x0000, 0xBC }, // fleur
|
|
{ 0x1F314, 0x0000, 0xBD }, // moon
|
|
{ 0x2615, 0x0000, 0xBE }, // coffee
|
|
{ 0x1F9B7, 0x0000, 0xBF }, // tooth
|
|
{ 0x1F968, 0x0000, 0xC0 }, // pretzel
|
|
{ 0x1F9EE, 0x0000, 0xC1 }, // abacus
|
|
{ 0x1F5FF, 0x0000, 0xC2 }, // moai
|
|
{ 0x1F481, 0x0000, 0xC3 }, // tipping
|
|
{ 0x1F994, 0x0000, 0xC4 }, // hedgehog
|
|
{ 0x2666, 0x0000, 0xC5 }, // diamond_suit
|
|
{ 0x2660, 0x0000, 0xC6 }, // spade_suit
|
|
{ 0x1F355, 0x0000, 0xC7 }, // pizza
|
|
{ 0x1F340, 0x0000, 0xC8 }, // four_leaf_clover
|
|
{ 0x2601, 0x0000, 0xC9 }, // cloud
|
|
{ 0x1F680, 0x0000, 0xCA }, // rocket
|
|
{ 0x1F6C2, 0x0000, 0xCB }, // passport_control
|
|
{ 0x2733, 0x0000, 0xCC }, // eight_spoked_asterisk
|
|
{ 0x1F4F6, 0x0000, 0xCD }, // signal_strength
|
|
{ 0x1F37A, 0x0000, 0xCE }, // beer
|
|
};
|
|
|
|
// ---- Helper functions ----
|
|
|
|
// Alias table: extra codepoints that map to existing emoji escape bytes.
|
|
// Used for variant codepoints (e.g. MWD node identifier 🂎 U+1F08E -> domino sprite)
|
|
struct EmojiAlias { uint32_t cp; uint8_t escape; };
|
|
#define EMOJI_ALIAS_COUNT 1
|
|
static const EmojiAlias EMOJI_ALIASES[EMOJI_ALIAS_COUNT] = {
|
|
{ 0x1F08E, 0xAA }, // domino tile (MWD node signifier) -> domino sprite
|
|
};
|
|
|
|
static uint32_t emojiDecodeUtf8(const uint8_t* s, int remaining, int* bytes_consumed) {
|
|
uint8_t b0 = s[0];
|
|
if (b0 < 0x80) { *bytes_consumed = 1; return b0; }
|
|
if ((b0 & 0xE0) == 0xC0 && remaining >= 2) {
|
|
*bytes_consumed = 2;
|
|
return ((uint32_t)(b0 & 0x1F) << 6) | (s[1] & 0x3F);
|
|
}
|
|
if ((b0 & 0xF0) == 0xE0 && remaining >= 3) {
|
|
*bytes_consumed = 3;
|
|
return ((uint32_t)(b0 & 0x0F) << 12) | ((uint32_t)(s[1] & 0x3F) << 6) | (s[2] & 0x3F);
|
|
}
|
|
if ((b0 & 0xF8) == 0xF0 && remaining >= 4) {
|
|
*bytes_consumed = 4;
|
|
return ((uint32_t)(b0 & 0x07) << 18) | ((uint32_t)(s[1] & 0x3F) << 12) | ((uint32_t)(s[2] & 0x3F) << 6) | (s[3] & 0x3F);
|
|
}
|
|
*bytes_consumed = 1;
|
|
return 0xFFFD;
|
|
}
|
|
|
|
// Convert UTF-8 text to internal format (emoji codepoints -> escape bytes)
|
|
// Now handles ALL multi-byte UTF-8 (>= 0x80) to prevent raw high bytes in buffer
|
|
static void emojiSanitize(const char* src, char* dst, int dstLen) {
|
|
const uint8_t* s = (const uint8_t*)src;
|
|
int si = 0, di = 0;
|
|
int srcLen = strlen(src);
|
|
while (si < srcLen && di < dstLen - 1) {
|
|
uint8_t b = s[si];
|
|
if (b >= 0x80) {
|
|
int consumed;
|
|
uint32_t cp = emojiDecodeUtf8(s + si, srcLen - si, &consumed);
|
|
if (cp == 0xFE0F) { si += consumed; continue; }
|
|
if (cp == 0xFFFD) { si += consumed; continue; } // Invalid UTF-8 — skip stray bytes safely
|
|
bool found = false;
|
|
for (int e = 0; e < EMOJI_COUNT; e++) {
|
|
if (EMOJI_CODEPOINTS[e].cp == cp) {
|
|
if (EMOJI_CODEPOINTS[e].cp2 != 0) {
|
|
int consumed2;
|
|
if (si + consumed < srcLen) {
|
|
uint32_t cp2 = emojiDecodeUtf8(s + si + consumed, srcLen - si - consumed, &consumed2);
|
|
if (cp2 == EMOJI_CODEPOINTS[e].cp2) {
|
|
dst[di++] = EMOJI_CODEPOINTS[e].escape;
|
|
si += consumed + consumed2;
|
|
found = true; break;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
dst[di++] = EMOJI_CODEPOINTS[e].escape;
|
|
si += consumed;
|
|
// Skip trailing variation selector U+FE0F
|
|
if (si + 2 < srcLen && s[si] == 0xEF && s[si+1] == 0xB8 && s[si+2] == 0x8F) si += 3;
|
|
found = true; break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
// Check alias table for variant codepoints
|
|
for (int a = 0; a < EMOJI_ALIAS_COUNT; a++) {
|
|
if (EMOJI_ALIASES[a].cp == cp) {
|
|
dst[di++] = EMOJI_ALIASES[a].escape;
|
|
si += consumed;
|
|
// Skip trailing variation selector U+FE0F
|
|
if (si + 2 < srcLen && s[si] == 0xEF && s[si+1] == 0xB8 && s[si+2] == 0x8F) si += 3;
|
|
found = true; break;
|
|
}
|
|
}
|
|
}
|
|
if (!found) {
|
|
// Preserve non-emoji UTF-8 (accented letters, Cyrillic, Greek, etc.) by
|
|
// copying original bytes through to dst. UTF-8-aware render paths handle
|
|
// them downstream. Emoji-escape disambiguation remains unambiguous because
|
|
// emoji escapes (0x80-0xCC) only appear standalone — never as a continuation
|
|
// byte following a UTF-8 lead byte (0xC2-0xF7), so the decoder can tell them
|
|
// apart by tracking lead-byte state.
|
|
if (di + consumed < dstLen) {
|
|
for (int k = 0; k < consumed; k++) dst[di++] = (char)s[si + k];
|
|
si += consumed;
|
|
} else {
|
|
break; // Not enough room for full UTF-8 sequence — stop cleanly
|
|
}
|
|
}
|
|
} else {
|
|
dst[di++] = (char)b;
|
|
si++;
|
|
}
|
|
}
|
|
dst[di] = '\0';
|
|
}
|
|
|
|
static inline bool isEmojiEscape(uint8_t b) {
|
|
return b >= EMOJI_ESCAPE_START && b <= EMOJI_ESCAPE_END;
|
|
}
|
|
|
|
static int emojiEncodeUtf8(uint32_t cp, uint8_t* dst) {
|
|
if (cp < 0x80) { dst[0] = (uint8_t)cp; return 1; }
|
|
if (cp < 0x800) { dst[0] = 0xC0|(cp>>6); dst[1] = 0x80|(cp&0x3F); return 2; }
|
|
if (cp < 0x10000) { dst[0] = 0xE0|(cp>>12); dst[1] = 0x80|((cp>>6)&0x3F); dst[2] = 0x80|(cp&0x3F); return 3; }
|
|
dst[0] = 0xF0|(cp>>18); dst[1] = 0x80|((cp>>12)&0x3F); dst[2] = 0x80|((cp>>6)&0x3F); dst[3] = 0x80|(cp&0x3F); return 4;
|
|
}
|
|
|
|
static void emojiUnescape(const char* src, char* dst, int dstLen) {
|
|
int si = 0, di = 0;
|
|
int srcLen = strlen(src);
|
|
while (si < srcLen && di < dstLen - 1) {
|
|
uint8_t b = (uint8_t)src[si];
|
|
if (b == EMOJI_PAD_BYTE) { si++; continue; }
|
|
if (isEmojiEscape(b)) {
|
|
int idx = b - EMOJI_ESCAPE_START;
|
|
if (idx < EMOJI_COUNT) {
|
|
uint8_t utf8[8];
|
|
int len = emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp, utf8);
|
|
if (EMOJI_CODEPOINTS[idx].cp2 != 0)
|
|
len += emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp2, utf8 + len);
|
|
if (di + len < dstLen) { memcpy(dst + di, utf8, len); di += len; } else break;
|
|
}
|
|
si++;
|
|
} else { dst[di++] = src[si++]; }
|
|
}
|
|
dst[di] = '\0';
|
|
}
|
|
|
|
static inline const uint8_t* getEmojiSpriteLg(uint8_t escape_byte) {
|
|
if (!isEmojiEscape(escape_byte)) return nullptr;
|
|
return (const uint8_t*)pgm_read_ptr(&EMOJI_SPRITES_LG[escape_byte - EMOJI_ESCAPE_START]);
|
|
}
|
|
|
|
static inline const uint8_t* getEmojiSpriteSm(uint8_t escape_byte) {
|
|
if (!isEmojiEscape(escape_byte)) return nullptr;
|
|
return (const uint8_t*)pgm_read_ptr(&EMOJI_SPRITES_SM[escape_byte - EMOJI_ESCAPE_START]);
|
|
}
|
|
|
|
static inline int emojiUtf8Cost(uint8_t escape_byte) {
|
|
if (!isEmojiEscape(escape_byte)) return 1;
|
|
int idx = escape_byte - EMOJI_ESCAPE_START;
|
|
uint32_t cp = EMOJI_CODEPOINTS[idx].cp;
|
|
int cost = (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4;
|
|
if (EMOJI_CODEPOINTS[idx].cp2 != 0) {
|
|
uint32_t cp2 = EMOJI_CODEPOINTS[idx].cp2;
|
|
cost += (cp2 < 0x80) ? 1 : (cp2 < 0x800) ? 2 : (cp2 < 0x10000) ? 3 : 4;
|
|
}
|
|
return cost;
|
|
} |