Various improvements (#673)

Graphics & rendering

- Implement `binfont-module` to generate bitmap fonts on the device itself
- Remove lodepng support from LVGL library and create `Modules/lodepng-module` to make the feature re-usable in non-LVGL apps too. Add binding functions for LVGL support.
- Implement large icons for boot screen (Tactility and USB logos)
- Remove unused asset files in `Data/`

Boot

- Split up `Tactility.cpp` and its `run()` function into various `Init*.cpp` files.
- Re-implement `Boot.cpp` app as non-LVGL app
- Boot app now has a `BootSequence.cpp` for the init code.
- LVGL is now started when the Boot app finishes
- Move more init logic into Boot app

BLE

- Don't allocate scan result buffers unless BLE is on
- Allocate scan results in external memory if possible

UX & UI

- USB Settings app: remove border from the button container
This commit is contained in:
Ken Van Hoeylandt 2026-10-04 18:09:21 +02:00 committed by GitHub
parent 0d451e8863
commit 7ea8c346b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
146 changed files with 19651 additions and 16200 deletions

View File

@ -36,7 +36,7 @@ CONFIG_LV_USE_FS_STDIO=y
CONFIG_LV_FS_STDIO_LETTER=65
CONFIG_LV_FS_STDIO_PATH=""
CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_LODEPNG=n
CONFIG_LV_USE_BUILTIN_MALLOC=n
# Routes lv_malloc/realloc/free through Modules/lvgl-module/source/lv_mem_custom.c, which prefers
# PSRAM (falls back to internal RAM automatically) instead of a fixed-size pool or plain malloc.

View File

@ -170,6 +170,8 @@ if (NOT DEFINED ENV{ESP_IDF_VERSION})
add_subdirectory(Libraries/minmea)
add_subdirectory(Modules/lvgl-module)
add_subdirectory(Modules/audio-decoder-module)
add_subdirectory(Modules/binfont-module)
add_subdirectory(Modules/lodepng-module)
add_subdirectory(Modules/c-symbols-module)
add_subdirectory(Modules/cjson-module)
add_subdirectory(Modules/cpp-symbols-module)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 B

View File

@ -0,0 +1,69 @@
add e145
app_registration ef40
apps e5c3
area_chart e770
battery_android_frame_1 f257
battery_android_frame_2 f256
battery_android_frame_3 f255
battery_android_frame_4 f254
battery_android_frame_5 f253
battery_android_frame_6 f252
battery_android_frame_bolt f250
battery_android_frame_full f24f
bluetooth e1a7
bluetooth_connected e1a8
bluetooth_disabled e1a9
bluetooth_searching e60f
cable efe6
calendar_month ebcc
camera e3af
check e668
circle ef4a
close e5cd
cloud f15c
delete e92e
deployed_code f720
devices e326
display_settings eb97
download f090
edit_note e745
electric_bolt ec1c
folder e2c7
forum e8af
gamepad e30f
help e8fd
hub e9f4
image e3f4
keyboard_alt f028
keyboard_arrow_up e316
language ea07
lightbulb e90f
lightstrip fff75
lists e9b9
location_on f1db
logo_dev ead6
mail e159
memory e322
menu e5d2
mop e28d
more_vert e5d4
music_note e405
navigation e55d
network_wifi_1_bar ebe4
network_wifi_2_bar ebd6
network_wifi_3_bar ebe1
note_add e89c
power_settings_new f8c7
refresh e5d5
sd_card e623
sd_card_alert f057
search ef7a
settings e8b8
signal_wifi_0_bar f0b0
signal_wifi_4_bar f065
signal_wifi_bad f064
signal_wifi_off e1da
terminal eb8e
toolbar e9f7
usb e1e0
wifi e63e

Binary file not shown.

View File

@ -1,306 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
viewBox="0 0 512 512"
version="1.1"
id="svg11"
sodipodi:docname="Desktop Icons.svg"
xml:space="preserve"
inkscape:export-filename="../assets/app_icon_i2c.png"
inkscape:export-xdpi="3"
inkscape:export-ydpi="3"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><style
id="style1"><![CDATA[
#keylines circle, #keylines rect {
vector-effect: non-scaling-stroke;
fill: none;
stroke: #0000FF;
}
#mask path, #mask rect, #mask circle, #hatching path {
vector-effect: non-scaling-stroke;
fill: none;
stroke: #FF0000;
}
#keylines, #mask {
opacity: 0.5;
}
]]></style><inkscape:_templateinfo><inkscape:_name>Android O icon template</inkscape:_name><inkscape:author>Venceslas DUET</inkscape:author><inkscape:_shortdesc>A collection of keylines and guides used to make adaptive icons for android O</inkscape:_shortdesc><inkscape:date>2021-02-14</inkscape:date><inkscape:_keywords>Android Icon Adaptive Keylines</inkscape:_keywords></inkscape:_templateinfo><defs
id="defs1"><inkscape:path-effect
effect="bspline"
id="path-effect3"
is_visible="true"
lpeversion="1.3"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false"
uniform="false" /><clipPath
clipPathUnits="userSpaceOnUse"
id="clipHatching"><rect
width="8"
height="8"
x="0"
y="0"
id="rect1" /></clipPath><pattern
patternUnits="userSpaceOnUse"
width="8"
height="8"
id="hatching"><path
d="M 1,-1 -1,1 M 9,7 7,9 M 9,-1 -1,9"
clip-path="url(#clipHatching)"
id="path1" /></pattern><clipPath
clipPathUnits="userSpaceOnUse"
id="clipHatching-2"><rect
width="8"
height="8"
x="0"
y="0"
id="rect1-7" /></clipPath><pattern
patternUnits="userSpaceOnUse"
width="8"
height="8"
id="hatching-0"><path
d="M 1,-1 -1,1 M 9,7 7,9 M 9,-1 -1,9"
clip-path="url(#clipHatching-2)"
id="path1-9" /></pattern><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath17"><rect
width="512"
height="512"
x="0.0081919599"
y="0.01246433"
ry="128"
id="rect17"
style="display:inline" /></clipPath><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter41"
x="-0.04317569"
y="-0.040927102"
width="1.1013429"
height="1.096065"><feFlood
result="flood"
in="SourceGraphic"
flood-opacity="0.29915108267716534"
flood-color="rgb(0,0,0)"
id="feFlood40" /><feGaussianBlur
result="blur"
in="SourceGraphic"
stdDeviation="6"
id="feGaussianBlur40" /><feOffset
result="offset"
in="blur"
dx="5"
dy="5"
id="feOffset40" /><feComposite
result="comp1"
operator="in"
in="flood"
in2="offset"
id="feComposite40" /><feComposite
result="comp2"
operator="over"
in="SourceGraphic"
in2="comp1"
id="feComposite41" /></filter></defs><sodipodi:namedview
id="base"
inkscape:current-layer="g6"
showgrid="true"
units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-units="px"
inkscape:cx="211.14908"
inkscape:cy="264.49672"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1153257"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"><inkscape:grid
type="xygrid"
empspacing="8"
id="grid1"
visible="true"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" /><sodipodi:guide
position="256,256"
orientation="0,1"
inkscape:locked="false"
id="guide1" /><sodipodi:guide
position="256,200"
orientation="0,1"
inkscape:locked="false"
id="guide2" /><sodipodi:guide
position="256,312"
orientation="0,1"
inkscape:locked="false"
id="guide3" /><sodipodi:guide
position="256,256"
orientation="1,0"
inkscape:locked="false"
id="guide4" /><sodipodi:guide
position="200,256"
orientation="1,0"
inkscape:locked="false"
id="guide5" /><sodipodi:guide
position="312,256"
orientation="1,0"
inkscape:locked="false"
id="guide6" /><sodipodi:guide
position="256,256"
orientation="1,1"
inkscape:locked="false"
id="guide7" /><sodipodi:guide
position="256,256"
orientation="1,-1"
inkscape:locked="false"
id="guide8" /></sodipodi:namedview><rect
style="display:none;opacity:1;fill:#9e9e9e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-opacity:1;paint-order:stroke fill markers"
id="Background"
width="512"
height="512"
x="0.02173974"
y="0.030385898"
clip-path="url(#clipPath17)" /><g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Icons"><path
d="m 212.48429,510.5 h 84.3951 l 18.4617,-74.4906 c 12.30779,-4.1402 23.95604,-9.07563 34.9447,-14.80628 10.98912,-5.73277 21.31888,-13.00885 30.98932,-21.82812 l 72.527,21.16643 L 496,347.78125 441.93403,296.82377 c 1.75966,-11.88934 3.07831,-25.11001 3.95602,-39.66212 0.8777,-14.55209 -0.003,-27.56091 -2.63946,-39.02647 l 52.74749,-50.2704 -42.19787,-72.760837 -71.20854,19.843727 C 372.92125,106.1284 362.3718,98.631997 350.94345,92.458553 339.51504,86.284646 327.64696,80.99297 315.33917,76.583523 L 298.19662,2.5 H 212.4824 l -15.82412,74.083523 c -12.30736,4.409447 -24.17545,9.701123 -35.60426,15.87503 -11.42839,6.173444 -21.97781,13.669847 -31.64825,22.489117 L 58.197238,93.781248 16,167.86478 l 54.0653,50.2704 c -2.637344,12.34739 -3.956016,25.35618 -3.956016,39.02647 0,13.66984 1.318672,26.67847 3.956016,39.02583 L 16,347.78125 58.197238,421.86476 130.72486,399.375 c 9.67003,7.93749 19.9996,14.99297 30.9887,21.16643 10.98911,6.17392 22.63736,11.46556 34.94472,15.87501 z m 43.2372,-158.75 c -26.18744,0 -48.51191,-9.35395 -66.97336,-28.06191 -18.46149,-18.70839 -27.69222,-41.19798 -27.69222,-67.46879 0,-26.27119 9.32399,-48.66724 27.97199,-67.18805 18.64883,-18.52082 41.06634,-27.78125 67.25251,-27.78125 26.18701,0 48.51126,9.35395 66.97272,28.0619 18.4615,18.70836 27.69223,41.19795 27.69223,67.46876 0,26.27122 -9.32399,48.66722 -27.97198,67.18809 C 304.32494,342.48958 281.90766,351.75 255.72149,351.75 Z"
id="Settings"
style="display:none;fill:#333333;fill-opacity:1;stroke:none;stroke-width:1.3208;stroke-opacity:1"
sodipodi:nodetypes="ccccccccsccccccccccccccscccccccscscscscs" /><path
d="M 51.047467,512 Q 28.952485,512 14.476063,497.52393 0,483.0475 0,460.95253 V 51.047462 Q 0,28.190328 14.476063,14.095334 28.952485,0 51.047467,0 H 460.95253 Q 483.80967,0 497.90466,14.095334 512,28.190328 512,51.047462 V 460.95253 q 0,22.09497 -14.09534,36.5714 Q 483.80967,512 460.95253,512 Z M 54.857141,127.99998 H 457.14285 V 54.857136 H 54.857141 Z M 457.14285,182.85714 H 54.857141 V 457.14285 H 457.14285 Z M 54.857141,127.99998 v 54.85716 z m 0,0 V 54.857136 Z m 0,54.85716 v 274.28571 z"
id="Fallback"
style="display:none;fill:#333333;fill-opacity:1;stroke-width:0.761904" /><g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="System Info"
style="display:none"><path
d="m 207.3461,368.61149 c 4.24475,0 8.2964,-1.10767 12.15495,-3.323 3.85898,-2.21507 6.79308,-5.34536 8.80231,-9.39085 l 74.74094,-136.81458 26.5827,49.17833 c 1.7715,4.4304 4.54058,7.64247 8.30725,9.63617 3.76584,1.9937 8.08555,2.99055 12.95914,2.99055 H 510.3904 V 233.03904 H 365.51384 L 324.31067,157.9424 c -2.21531,-4.43039 -5.25245,-7.64244 -9.11143,-9.63616 -3.85853,-1.99263 -7.91018,-2.98895 -12.15494,-2.98895 -4.24475,0 -8.2964,0.99632 -12.15496,2.98895 -3.85897,1.99266 -6.8961,5.20471 -9.11139,9.63616 L 207.3461,294.84409 180.49221,245.81347 c -2.03515,-4.0859 -4.9819,-7.23639 -8.84026,-9.45148 -3.85856,-2.2153 -7.9102,-3.32295 -12.15494,-3.32295 H 0 v 47.84907 h 144.87656 l 41.5177,75.09183 c 2.00541,3.99063 4.93771,7.09348 8.7969,9.30855 3.85853,2.21533 7.91018,3.323 12.15494,3.323 z"
style="fill:#0d00be;fill-opacity:1;stroke-width:0.664569"
id="path1-8" /><path
d="m 0.48281402,192.83596 v -79.74848 c 0,-14.177585 4.99842408,-25.696778 14.99527098,-34.557575 C 25.47472,69.668868 37.492176,65.238358 51.530467,65.238358 H 459.91073 c 14.03785,0 26.04106,4.43051 36.00962,13.291547 9.96858,8.860797 14.95286,20.37999 14.95286,34.557575 v 79.74848 H 463.02408 V 113.08748 H 48.331914 v 79.74848 z M 51.445288,448.03116 c -14.037857,0 -26.041069,-4.43051 -36.009631,-13.29154 -9.9685626,-8.8608 -14.95284298,-20.38 -14.95284298,-34.55758 V 320.43356 H 48.331914 v 79.74848 H 463.02408 v -79.74848 h 47.84913 v 79.74848 c 0,14.17758 -4.99842,25.69678 -14.99528,34.55758 -9.99707,8.86103 -22.01453,13.29154 -36.0524,13.29154 z"
id="System_Info"
style="display:inline;fill:#333333;fill-opacity:1;stroke-width:0.664569"
sodipodi:nodetypes="cscsscsccccccscsccccccssss" /></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Power_Settings"
style="display:none"><rect
style="display:inline;fill:#000000;fill-opacity:1;stroke-width:0.8862;paint-order:stroke fill markers"
id="rect4"
width="346.68829"
height="197.63705"
x="65.055527"
y="164.69754"
inkscape:label="Power_at_100" /><rect
style="display:none;fill:#000000;fill-opacity:1;stroke-width:0.8862;paint-order:stroke fill markers"
id="rect16"
width="277"
height="197.63705"
x="65.055527"
y="164.69754"
inkscape:label="Power_at_080" /><rect
style="display:none;fill:#000000;fill-opacity:1;stroke-width:0.8862;paint-order:stroke fill markers"
id="rect18"
width="208"
height="197.63705"
x="65.055527"
y="164.69754"
inkscape:label="Power_at_060" /><rect
style="display:none;fill:#000000;fill-opacity:1;stroke-width:0.8862;paint-order:stroke fill markers"
id="rect19"
width="139"
height="197.63705"
x="65.055527"
y="164.69754"
inkscape:label="Power_at_040" /><rect
style="display:none;fill:#000000;fill-opacity:1;stroke-width:0.8862;paint-order:stroke fill markers"
id="rect20"
width="70"
height="197.63705"
x="65.055527"
y="164.69754"
inkscape:label="Power_at_020" /><g
id="g3"
inkscape:label="Shared"
transform="translate(0.41209841,0.82986943)"><path
id="rect15"
style="fill:#000000;paint-order:stroke fill markers"
d="M 1.6464844,104.58203 V 417.50781 H 475.15234 V 104.58203 Z M 23.880859,125.99414 H 451.27148 v 269.2793 H 23.880859 Z"
transform="translate(-0.41209841,-0.82986943)" /><rect
style="display:inline;fill:#000000;paint-order:stroke fill markers"
id="rect2-7"
width="39.527409"
height="113.6413"
x="471.03497"
y="201.28403" /></g></g><path
d="m 128.42457,319.70188 h 31.96224 V 223.81515 H 128.42457 V 255.7774 H 96.462329 v 31.96225 h 31.962241 z m 63.92449,-31.96223 H 416.08475 V 255.7774 H 192.34906 Z m 159.81121,-63.9245 h 31.96224 v -31.96223 h 31.96224 V 159.89067 H 384.12251 V 127.92843 H 352.16027 Z M 96.462329,191.85292 H 320.19802 V 159.89067 H 96.462329 Z m 63.924481,287.66019 v -63.9245 H 48.518961 q -19.776638,0 -33.860161,-14.09119 Q 0.575596,387.40591 0.575596,367.61871 V 79.796797 q 0,-19.788137 14.083204,-33.77162 Q 28.742323,32.041695 48.518961,32.041695 H 464.02812 q 19.77663,0 33.85984,14.091514 14.08352,14.091196 14.08352,33.878376 V 367.83383 q 0,19.78783 -14.08352,33.7713 -14.08321,13.98348 -33.85984,13.98348 H 352.16027 v 63.9245 z M 48.518961,367.64525 H 464.02812 V 79.98506 H 48.518961 Z m 0,0 V 79.98506 Z"
id="Display_Settings"
style="display:none;fill:#333333;fill-opacity:1;stroke-width:0.665879" /><path
d="m 47.867683,447.55649 q -19.326766,0 -33.654939,-14.32849 Q -0.1157482,418.89983 -0.1157482,399.57306 V 111.67248 q 0,-19.793166 14.3284922,-33.888136 Q 28.540917,63.689052 47.867683,63.689052 H 191.81797 l 63.97791,63.977908 h 207.9282 q 19.79316,0 33.88814,14.09529 14.09529,14.09497 14.09529,33.88814 v 223.92267 q 0,19.32677 -14.09529,33.65494 -14.09498,14.32849 -33.88814,14.32849 z m 0,-47.98343 H 463.72408 V 175.65039 h -227.9213 l -63.9779,-63.97791 H 47.867683 Z m 0,0 V 111.67248 Z"
id="Files"
style="display:none;fill:#333333;fill-opacity:1;stroke-width:0.666435" /><g
id="g6"
inkscape:label="I2C"><path
style="fill:#333333;stroke-width:1.10895;paint-order:stroke fill markers"
d="M 1.1034012,386.61813 V 121.14457 H 512.16486 V 388.6067 H 406.77087 v -75.56551 h 27.83993 v 44.74274 h 51.70271 V 146.99592 H 28.943326 V 360.76677 H 82.634608 V 313.04119 H 106.4974 v 75.56551 z"
id="path4"
inkscape:label="housing" /><circle
style="fill:#1a1a1a;stroke-width:1.68907;paint-order:stroke fill markers"
id="path5"
cx="416.15726"
cy="233.15318"
inkscape:label="pin4"
r="36.346325" /><circle
style="fill:#800000;stroke-width:1.68909;paint-order:stroke fill markers"
id="path5-62"
cx="311.80624"
cy="232.68082"
inkscape:label="pin3"
r="36.346325" /><circle
style="fill:#aa8800;stroke-width:1.68907;paint-order:stroke fill markers"
id="path5-6"
cx="201.49115"
cy="232.88933"
inkscape:label="pin2"
r="36.346325" /><circle
style="fill:#000080;stroke-width:1.68907;paint-order:stroke fill markers"
id="path5-9"
cx="94.05365"
cy="233.18108"
inkscape:label="pin1"
r="36.346325" /></g></g><style
id="style1-9"><![CDATA[
#keylines circle, #keylines rect {
vector-effect: non-scaling-stroke;
fill: none;
stroke: #0000FF;
}
#mask path, #mask rect, #mask circle, #hatching path {
vector-effect: non-scaling-stroke;
fill: none;
stroke: #FF0000;
}
#keylines, #mask {
opacity: 0.5;
}
]]></style></svg>

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="apps.svg"
inkscape:export-filename="icon_apps.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="17.088414"
inkscape:cx="14.600536"
inkscape:cy="18.960215"
inkscape:window-width="1503"
inkscape:window-height="933"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 122.37644,-3.1685927 q -49.173234,0 -84.190541,-35.0173063 -35.0173063,-35.017307 -35.0173063,-84.190541 0,-49.17324 35.0173063,-84.19055 35.017307,-35.01731 84.190541,-35.01731 49.17324,0 84.19055,35.01731 35.01731,35.01731 35.01731,84.19055 0,49.173234 -35.01731,84.190541 -35.01731,35.0173063 -84.19055,35.0173063 z m 357.62356,0 q -49.17324,0 -84.19055,-35.0173063 -35.0173,-35.017307 -35.0173,-84.190541 0,-49.17324 35.0173,-84.19055 35.01731,-35.01731 84.19055,-35.01731 49.17324,0 84.19055,35.01731 35.0173,35.01731 35.0173,84.19055 0,49.173234 -35.0173,84.190541 Q 529.17324,-3.1685927 480,-3.1685927 Z m 357.62356,0 q -49.17324,0 -84.19055,-35.0173063 -35.01731,-35.017307 -35.01731,-84.190541 0,-49.17324 35.01731,-84.19055 35.01731,-35.01731 84.19055,-35.01731 49.17323,0 84.19054,35.01731 35.01731,35.01731 35.01731,84.19055 0,49.173234 -35.01731,84.190541 -35.01731,35.0173063 -84.19054,35.0173063 z M 122.37644,-360.79215 q -49.173234,0 -84.190541,-35.0173 Q 3.1685927,-430.82676 3.1685927,-480 q 0,-49.17324 35.0173063,-84.19055 35.017307,-35.0173 84.190541,-35.0173 49.17324,0 84.19055,35.0173 35.01731,35.01731 35.01731,84.19055 0,49.17324 -35.01731,84.19055 -35.01731,35.0173 -84.19055,35.0173 z m 357.62356,0 q -49.17324,0 -84.19055,-35.0173 -35.0173,-35.01731 -35.0173,-84.19055 0,-49.17324 35.0173,-84.19055 35.01731,-35.0173 84.19055,-35.0173 49.17324,0 84.19055,35.0173 35.0173,35.01731 35.0173,84.19055 0,49.17324 -35.0173,84.19055 -35.01731,35.0173 -84.19055,35.0173 z m 357.62356,0 q -49.17324,0 -84.19055,-35.0173 Q 718.4157,-430.82676 718.4157,-480 q 0,-49.17324 35.01731,-84.19055 35.01731,-35.0173 84.19055,-35.0173 49.17323,0 84.19054,35.0173 35.01731,35.01731 35.01731,84.19055 0,49.17324 -35.01731,84.19055 -35.01731,35.0173 -84.19054,35.0173 z M 122.37644,-718.4157 q -49.173234,0 -84.190541,-35.01731 -35.0173063,-35.01731 -35.0173063,-84.19055 0,-49.17323 35.0173063,-84.19054 35.017307,-35.01731 84.190541,-35.01731 49.17324,0 84.19055,35.01731 35.01731,35.01731 35.01731,84.19054 0,49.17324 -35.01731,84.19055 -35.01731,35.01731 -84.19055,35.01731 z m 357.62356,0 q -49.17324,0 -84.19055,-35.01731 -35.0173,-35.01731 -35.0173,-84.19055 0,-49.17323 35.0173,-84.19054 35.01731,-35.01731 84.19055,-35.01731 49.17324,0 84.19055,35.01731 35.0173,35.01731 35.0173,84.19054 0,49.17324 -35.0173,84.19055 Q 529.17324,-718.4157 480,-718.4157 Z m 357.62356,0 q -49.17324,0 -84.19055,-35.01731 -35.01731,-35.01731 -35.01731,-84.19055 0,-49.17323 35.01731,-84.19054 35.01731,-35.01731 84.19055,-35.01731 49.17323,0 84.19054,35.01731 35.01731,35.01731 35.01731,84.19054 0,49.17324 -35.01731,84.19055 -35.01731,35.01731 -84.19054,35.01731 z"
id="path1"
style="stroke-width:1.4901" />
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="folder.svg"
inkscape:export-filename="icon_files.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="48.333333"
inkscape:cx="11.989655"
inkscape:cy="12"
inkscape:window-width="1503"
inkscape:window-height="933"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 96.441379,-96.441379 q -39.554482,0 -67.722069,-28.167591 -28.16758586,-28.16758 -28.16758586,-67.72206 v -575.33794 q 0,-39.55448 28.16758586,-67.72206 28.167587,-28.16759 67.722069,-28.16759 H 384.11034 L 480,-767.66897 h 383.55862 q 39.55448,0 67.72207,28.16759 28.16759,28.16759 28.16759,67.72207 v 479.44828 q 0,39.55448 -28.16759,67.72206 -28.16759,28.167591 -67.72207,28.167591 z m 0,-95.889651 H 863.55862 v -479.44828 h -423.1131 l -95.88966,-95.88966 H 96.441379 Z m 0,0 v -575.33794 z"
id="path1"
style="stroke-width:1.19862" />
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="settings.svg"
inkscape:export-filename="icon_settings.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="48.333333"
inkscape:cx="11.989655"
inkscape:cy="12"
inkscape:window-width="1503"
inkscape:window-height="933"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M 347.80751,0.69994853 328.57952,-153.12403 q -15.62275,-6.00875 -29.44288,-14.421 -13.82012,-8.41225 -27.03937,-18.02625 L 129.08904,-125.48379 -3.1034483,-353.81626 120.67679,-447.55275 q -1.20175,-8.41225 -1.20175,-16.22363 v -32.44724 q 0,-7.81138 1.20175,-16.22363 L -3.1034483,-606.18374 129.08904,-834.51621 l 143.00823,60.08749 q 13.21925,-9.614 27.64025,-18.02625 14.421,-8.41225 28.842,-14.421 l 19.22799,-153.82398 h 264.38498 l 19.22799,153.82398 q 15.62275,6.00875 29.44288,14.421 13.82012,8.41225 27.03937,18.02625 l 143.00823,-60.08749 132.19249,228.33247 -123.78024,93.73649 q 1.20175,8.41225 1.20175,16.22363 v 32.44724 q 0,7.81138 -2.4035,16.22363 l 123.78024,93.73649 -132.19249,228.33247 -141.80648,-60.08749 q -13.21925,9.614 -27.64025,18.02625 -14.421,8.41225 -28.842,14.421 L 612.19249,0.69994853 Z m 84.1225,-96.13998953 h 94.93823 l 16.8245,-127.385489 q 37.25425,-9.614 69.10062,-28.24112 31.84637,-18.62712 58.28487,-45.06562 l 118.97324,49.27175 46.86824,-81.719 -103.35049,-78.11374 q 6.00875,-16.8245 8.41225,-35.45162 2.4035,-18.62712 2.4035,-37.85512 0,-19.228 -2.4035,-37.85512 -2.4035,-18.62712 -8.41225,-35.45162 l 103.35049,-78.11374 -46.86824,-81.719 -118.97324,50.4735 q -26.4385,-27.64025 -58.28487,-46.26737 -31.84637,-18.62712 -69.10062,-28.24112 l -15.62275,-127.38549 h -94.93823 l -16.8245,127.38549 q -37.25425,9.614 -69.10062,28.24112 -31.84637,18.62712 -58.28487,45.06562 l -118.97324,-49.27175 -46.86824,81.719 103.35049,76.91199 q -6.00875,18.02625 -8.41225,36.05249 -2.4035,18.02625 -2.4035,38.456 0,19.228 2.4035,37.25425 2.4035,18.02624 8.41225,36.05249 l -103.35049,78.11374 46.86824,81.719 118.97324,-50.4735 q 26.4385,27.64025 58.28487,46.26737 31.84637,18.62712 69.10062,28.24112 z M 482.4035,-311.75502 q 69.70149,0 118.97324,-49.27174 49.27174,-49.27175 49.27174,-118.97324 0,-69.70149 -49.27174,-118.97324 -49.27175,-49.27174 -118.97324,-49.27174 -70.90324,0 -119.57411,49.27174 -48.67087,49.27175 -48.67087,118.97324 0,69.70149 48.67087,118.97324 48.67087,49.27174 119.57411,49.27174 z M 480,-480 Z"
id="path1"
style="stroke-width:1.20175" />
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="search.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="search.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="47.5"
inkscape:cx="12"
inkscape:cy="10.989474"
inkscape:window-width="2560"
inkscape:window-height="1368"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M 884.20117,0.42105034 548.79064,-334.98948 q -39.92982,31.94386 -91.8386,50.57778 -51.90877,18.63392 -110.47251,18.63392 -145.07836,0 -245.56842,-100.49006 Q 0.42105263,-466.7579 0.42105263,-611.83626 q 0,-145.07836 100.49005737,-245.56842 100.49006,-100.49006 245.56842,-100.49006 145.07836,0 245.56842,100.49006 100.49006,100.49006 100.49006,245.56842 0,58.56374 -18.63392,110.47251 -18.63392,51.90878 -50.57778,91.8386 L 958.73684,-74.114622 Z M 346.47953,-372.25731 q 99.82456,0 169.70175,-69.8772 69.8772,-69.87719 69.8772,-169.70175 0,-99.82456 -69.8772,-169.70175 -69.87719,-69.8772 -169.70175,-69.8772 -99.82456,0 -169.70176,69.8772 -69.87718,69.87719 -69.87718,169.70175 0,99.82456 69.87718,169.70175 69.8772,69.8772 169.70176,69.8772 z"
id="path1"
style="stroke-width:1.33099" />
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_lock_black.svg"
inkscape:export-filename="wifi_lock_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="12.054545"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M240-80q-33 0-56.5-23.5T160-160v-400q0-33 23.5-56.5T240-640h40v-80q0-83 58.5-141.5T480-920q83 0 141.5 58.5T680-720v80h40q33 0 56.5 23.5T800-560v400q0 33-23.5 56.5T720-80H240Zm0-80h480v-400H240v400Zm240-120q33 0 56.5-23.5T560-360q0-33-23.5-56.5T480-440q-33 0-56.5 23.5T400-360q0 33 23.5 56.5T480-280ZM360-640h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM240-160v-400 400Z"
id="path1"
style="fill:#000000" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_medium_black.svg"
inkscape:export-filename="../assets/wifi_signal_medium_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#000000" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#b3b3b3" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_strong_black.svg"
inkscape:export-filename="wifi_signal_full_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#000000" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#000000" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_weak_black.svg"
inkscape:export-filename="../assets/wifi_signal_weak_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#b3b3b3" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#b3b3b3" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- License: Apache. Made by Iconscout: https://github.com/Iconscout/unicons -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" data-name="Layer 1"><path d="M12.71,17.29a1,1,0,0,0-.16-.12.56.56,0,0,0-.17-.09.6.6,0,0,0-.19-.06.93.93,0,0,0-.57.06.9.9,0,0,0-.54.54A.84.84,0,0,0,11,18a1,1,0,0,0,.07.38,1.46,1.46,0,0,0,.22.33A1,1,0,0,0,12,19a.84.84,0,0,0,.38-.08,1.15,1.15,0,0,0,.33-.21A1,1,0,0,0,13,18a1,1,0,0,0-.08-.38A1,1,0,0,0,12.71,17.29ZM8.55,13.17a.56.56,0,0,0-.17-.09A.6.6,0,0,0,8.19,13a.86.86,0,0,0-.39,0l-.18.06-.18.09-.15.12A1.05,1.05,0,0,0,7,14a1,1,0,0,0,.29.71,1.15,1.15,0,0,0,.33.21A1,1,0,0,0,9,14a1.05,1.05,0,0,0-.29-.71Zm.16,4.12a1,1,0,0,0-.33-.21A1,1,0,0,0,7.8,17l-.18.06a.76.76,0,0,0-.18.09,1.58,1.58,0,0,0-.15.12,1,1,0,0,0-.21.33.94.94,0,0,0,0,.76,1.15,1.15,0,0,0,.21.33A1,1,0,0,0,8,19a.84.84,0,0,0,.38-.08,1.15,1.15,0,0,0,.33-.21,1.15,1.15,0,0,0,.21-.33.94.94,0,0,0,0-.76A1,1,0,0,0,8.71,17.29Zm2.91-4.21a1,1,0,0,0-.33.21A1.05,1.05,0,0,0,11,14a1,1,0,0,0,1.38.92,1.15,1.15,0,0,0,.33-.21A1,1,0,0,0,13,14a1.05,1.05,0,0,0-.29-.71A1,1,0,0,0,11.62,13.08Zm5.09,4.21a1.15,1.15,0,0,0-.33-.21,1,1,0,0,0-1.09.21,1,1,0,0,0-.21.33.94.94,0,0,0,0,.76,1.15,1.15,0,0,0,.21.33A1,1,0,0,0,16,19a.84.84,0,0,0,.38-.08,1.15,1.15,0,0,0,.33-.21,1,1,0,0,0,.21-1.09A1,1,0,0,0,16.71,17.29ZM16,5H8A1,1,0,0,0,7,6v4a1,1,0,0,0,1,1h8a1,1,0,0,0,1-1V6A1,1,0,0,0,16,5ZM15,9H9V7h6Zm3-8H6A3,3,0,0,0,3,4V20a3,3,0,0,0,3,3H18a3,3,0,0,0,3-3V4A3,3,0,0,0,18,1Zm1,19a1,1,0,0,1-1,1H6a1,1,0,0,1-1-1V4A1,1,0,0,1,6,3H18a1,1,0,0,1,1,1Zm-2.45-6.83a.56.56,0,0,0-.17-.09.6.6,0,0,0-.19-.06.86.86,0,0,0-.39,0l-.18.06-.18.09-.15.12A1.05,1.05,0,0,0,15,14a1,1,0,0,0,1.38.92,1.15,1.15,0,0,0,.33-.21A1,1,0,0,0,17,14a1.05,1.05,0,0,0-.29-.71Z"/></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- License: PD. Made by Mary Akveo: https://maryakveo.com/ -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" id="chat" data-name="Line Color" xmlns="http://www.w3.org/2000/svg" class="icon line-color"><path id="primary" d="M18.81,16.23,20,21l-4.95-2.48A9.84,9.84,0,0,1,12,19c-5,0-9-3.58-9-8s4-8,9-8,9,3.58,9,8A7.49,7.49,0,0,1,18.81,16.23Z" style="fill: none; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2;"></path></svg>

Before

Width:  |  Height:  |  Size: 518 B

View File

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- License: PD. Made by Mary Akveo: https://maryakveo.com/ -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" id="chip" data-name="Flat Line" xmlns="http://www.w3.org/2000/svg" class="icon flat-line"><rect id="secondary" x="6" y="6" width="12" height="12" rx="1" style="fill: none; stroke-width: 2;"></rect><path id="primary" d="M12,6V3m4,3V4M8,6V4m10,8h3m-3,4h2M18,8h2M12,18v3M8,18v2m8-2v2M6,12H3M6,8H4m2,8H4m14,1V7a1,1,0,0,0-1-1H7A1,1,0,0,0,6,7V17a1,1,0,0,0,1,1H17A1,1,0,0,0,18,17Z" style="fill: none; stroke: #333333; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2;"></path></svg>

Before

Width:  |  Height:  |  Size: 662 B

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- License: MIT. Made by vmware: https://github.com/vmware/clarity-assets -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 36 36" version="1.1" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>note-line</title>
<path d="M28,30H6V8H19.22l2-2H6A2,2,0,0,0,4,8V30a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V15l-2,2Z" class="clr-i-outline clr-i-outline-path-1"></path><path d="M33.53,5.84,30.16,2.47a1.61,1.61,0,0,0-2.28,0L14.17,16.26l-1.11,4.81A1.61,1.61,0,0,0,14.63,23,1.69,1.69,0,0,0,15,23l4.85-1.07L33.53,8.12A1.61,1.61,0,0,0,33.53,5.84ZM18.81,20.08l-3.66.81L16,17.26,26.32,6.87l2.82,2.82ZM30.27,8.56,27.45,5.74,29,4.16,31.84,7Z" class="clr-i-outline clr-i-outline-path-2"></path>
<rect x="0" y="0" width="36" height="36" fill-opacity="0"/>
</svg>

Before

Width:  |  Height:  |  Size: 878 B

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 -960 640 640"
width="16"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg"
inkscape:export-filename="calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.png"
inkscape:export-xdpi="96.18351"
inkscape:export-ydpi="96.18351"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="47.5"
inkscape:cx="10.842105"
inkscape:cy="10.821053"
inkscape:window-width="2560"
inkscape:window-height="1368"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M 61.257143,-775.80752 H 487.10977 v -60.83609 H 61.257143 Z m 0,0 v -60.83609 z m 0,425.85263 q -25.094888,0 -42.965489,-17.8706 -17.870601,-17.8706 -17.870601,-42.96549 v -425.85263 q 0,-25.09489 17.870601,-42.96549 17.870601,-17.8706 42.965489,-17.8706 H 91.67518 v -60.83609 h 60.83609 v 60.83609 h 243.34437 v -60.83609 h 60.83609 v 60.83609 h 30.41804 q 25.09489,0 42.96549,17.8706 17.8706,17.8706 17.8706,42.96549 v 172.62241 q -14.44857,-6.84406 -29.6576,-11.40677 -15.20901,-4.56271 -31.17849,-6.84406 v -32.6994 H 61.257143 v 304.18045 H 252.89083 q 5.32315,16.72993 12.54744,31.93895 7.22428,15.20902 17.11015,28.89714 z m 395.434587,30.41805 q -63.11745,0 -107.60384,-44.48639 -44.48639,-44.4864 -44.48639,-107.60384 0,-63.11744 44.48639,-107.60384 44.48639,-44.48638 107.60384,-44.48638 63.11744,0 107.60383,44.48638 44.48639,44.4864 44.48639,107.60384 0,63.11744 -44.48639,107.60384 -44.48639,44.48639 -107.60383,44.48639 z m 50.95022,-79.84737 21.29264,-21.29263 -57.03384,-57.03384 V -562.8812 H 441.4827 v 97.33774 z"
id="path1"
style="stroke-width:0.760454;fill:#000000" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 -960 640 640"
width="16"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="location.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="location.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="47.5"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-width="2560"
inkscape:window-height="1368"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M 347.36841,-361.6842 259.36842,-579.36842 41.684211,-667.36841 V -710.5965 L 597.47368,-917.47368 390.59649,-361.6842 Z m 20.07018,-114.24563 125.05263,-336.5614 -336.5614,125.05264 151.29825,60.21052 z m -60.21052,-151.29824 z"
id="path1"
style="stroke-width:0.771924" />
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="20"
viewBox="0 -960 960 960"
width="20"
version="1.1"
id="svg1"
sodipodi:docname="wifi_off_white.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="../assets/wifi_off_white.png"
inkscape:export-xdpi="76.800003"
inkscape:export-ydpi="76.800003"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="33"
inkscape:cx="10.045455"
inkscape:cy="10"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m699-363-51-51 206-205q-81-61-176-93t-198-32q-36.667 0-73.333 4.5Q370-735 335-727l-59-59q48-15 99.241-22.5T480-816q140 0 263 51t217 141L699-363ZM480-246l66-66-359-359q-21 11-41 24.5T106-619l374 373ZM813-45 597-261 480-144 0-624q30-29 63.533-54.224Q97.065-703.447 134-724l-89-89 51-51L864-96l-51 51ZM492-571Zm-125 79Z"
id="path1"
style="fill:#ffffff" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="20"
viewBox="0 -960 960 960"
width="20"
version="1.1"
id="svg1"
sodipodi:docname="wifi_scan_white.svg"
inkscape:export-filename="../assets/wifi_scan_white.png"
inkscape:export-xdpi="76.800003"
inkscape:export-ydpi="76.800003"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="33"
inkscape:cx="10.015152"
inkscape:cy="10"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M480-144 0-624q97-94 221-143t259-49q135 0 259 49t221 143l-51 52q-86-85-197-128.5T480-744q-102 0-197.5 32T106-619l427 422-53 53Zm381-48L745-308q-17 10-35 15t-38 5q-60 0-102-42t-42-102q0-60 42-102t102-42q60 0 102 42t42 102q0 20-4.5 38.5T796-359l116 116-51 51ZM672-360q30 0 51-21t21-51q0-30-21-51t-51-21q-30 0-51 21t-21 51q0 30 21 51t51 21ZM480-196Z"
id="path1"
style="fill:#ffffff" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_medium_white.svg"
inkscape:export-filename="../assets/wifi_signal_medium_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#666666" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_strong_white.svg"
inkscape:export-filename="../assets/wifi_signal_strong_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.036364"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_weak_white.svg"
inkscape:export-filename="../assets/wifi_signal_weak_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#666666" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#666666" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -67,7 +67,7 @@
i2c_internal: i2c0 {
compatible = "espressif,esp32-i2c-master";
port = <I2C_NUM_0>;
clock-frequency = <100000>;
clock-frequency = <400000>;
pin-sda = <&gpio0 31 GPIO_FLAG_PULL_UP>;
pin-scl = <&gpio0 32 GPIO_FLAG_PULL_UP>;

View File

@ -32,7 +32,7 @@
- Improve Setup: Show "Step done" screen
- Make it more clear to end-users that an SD card is required to run Tactility
- Warn if file operations are done from prohibited tasks (e.g. lvgl task)
- stopAppFromToolbar() in Tactility.cpp stops the top-most app. Change it so the toolbar knows for which app id it is created, so it can rely on that.
- stopAppFromToolbar() in lvgl/Lvgl.cpp stops the top-most app. Change it so the toolbar knows for which app id it is created, so it can rely on that.
- Consider not unpacking `.app` files and executing them directly. Might want to cache file offsets. Cache file must be pinned to app version.
- lvgl-module's spinner relies on hard-coded spinner asset from Tactility main project.
- esp_lvgl_port settings has a large stack size (~9kB) to fix stackoverflow when LVGL events (e.g. button click) do actions like file operations do actions like file operations. Can we reduce the callstack?

View File

@ -5,7 +5,7 @@ if (DEFINED ENV{ESP_IDF_VERSION})
SRC_DIRS "Source/"
INCLUDE_DIRS "Source/"
PRIV_INCLUDE_DIRS "Private/"
REQUIRES lvgl
REQUIRES lvgl lodepng-module
)
else()
@ -25,6 +25,6 @@ else()
)
target_link_libraries(lv_screenshot
PUBLIC lvgl
PUBLIC lvgl lodepng-module
)
endif()

View File

@ -1,11 +1,32 @@
#include "src/libs/lodepng/lodepng.h"
#include "save_png.h"
#include <lodepng/lodepng.h>
#include <lvgl.h>
bool lv_screenshot_save_png_file(const uint8_t* image, uint32_t w, uint32_t h, uint32_t bpp, const char* filename) {
unsigned char* png = NULL;
size_t png_size = 0;
unsigned error;
if (bpp == 32) {
return lodepng_encode32_file(filename, image, w, h) == 0;
error = lodepng_encode32(&png, &png_size, image, w, h);
} else if (bpp == 24) {
return lodepng_encode24_file(filename, image, w, h) == 0;
error = lodepng_encode24(&png, &png_size, image, w, h);
} else {
return false;
}
if (error) {
lodepng_free(png);
return false;
}
// Written through lv_fs, so LVGL drive letter paths ("A:...") work
bool success = false;
lv_fs_file_t file;
if (lv_fs_open(&file, filename, LV_FS_MODE_WR) == LV_FS_RES_OK) {
uint32_t written = 0;
success = lv_fs_write(&file, png, png_size, &written) == LV_FS_RES_OK && written == png_size;
lv_fs_close(&file);
}
lodepng_free(png);
return success;
}

View File

@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.20)
include("${CMAKE_CURRENT_LIST_DIR}/../../Buildscripts/module.cmake")
file(GLOB_RECURSE SOURCE_FILES "source/*.c*")
list(APPEND REQUIRES_LIST
TactilityKernel
graphics-module
)
tactility_add_module(binfont-module
SRCS ${SOURCE_FILES}
INCLUDE_DIRS include/
PRIV_INCLUDE_DIRS private/
REQUIRES ${REQUIRES_LIST}
)

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,14 @@
# binfont-module
Bitmap fonts in the [lv_font_conv](https://github.com/lvgl/lv_font_conv) binary format (`--format bin`), usable with and without LVGL.
- `<binfont/binfont.h>`: load fonts and decode glyphs
- `<binfont/generator.h>`: rasterize a TTF into the binary format on device
- `<binfont/render.h>`: draw glyphs and text into a `PixelBuffer`
For LVGL, see `lvgl_binfont_create()` in lvgl-module's `<lvgl/binfont.h>`.
## License
This module is licensed under the [Apache v2.0](LICENSE-Apache-2.0.md) license.
Uses [stb_truetype](https://github.com/nothings/stb) (public domain).

View File

@ -0,0 +1,118 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <tactility/error.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* A bitmap font in the lv_font_conv binary format (lv_font_conv --format bin).
* Thread-safe: a font can be used from multiple tasks at the same time.
*/
struct BinFont;
typedef struct BinFontMetrics {
/** Font size in pixels, as passed to the converter */
uint16_t size;
/** Pixels above the baseline */
int16_t ascent;
/** Pixels below the baseline (negative) */
int16_t descent;
/** ascent - descent */
uint16_t line_height;
/** Distance from the bottom of the line to the baseline (-descent) */
int16_t base_line;
int16_t underline_position;
uint16_t underline_thickness;
/** Bits per pixel of the stored bitmaps (1-4) */
uint8_t bpp;
} BinFontMetrics;
typedef struct BinFontGlyph {
uint32_t glyph_id;
/** Horizontal advance in 1/16th pixels */
uint32_t advance_x16;
/** Bounding box left, relative to the pen position */
int16_t x;
/** Bounding box bottom, relative to the baseline (positive is up) */
int16_t y;
uint16_t width;
uint16_t height;
} BinFontGlyph;
/**
* @brief Opens a font file.
* The whole file is loaded into external memory (PSRAM) when available, otherwise into internal memory.
* When that allocation fails, only the lookup tables are loaded and glyph data is read from the file
* on demand: the file is opened and closed for every glyph lookup, unless it's kept open with
* binfont_begin()/binfont_end().
* @param[in] path the file path
* @param[out] out the opened font
* @retval ERROR_NONE on success
* @retval ERROR_NOT_FOUND when the file can't be opened
* @retval ERROR_NOT_SUPPORTED when the file is not a valid or supported font
* @retval ERROR_OUT_OF_MEMORY when memory allocation failed
*/
error_t binfont_open_file(const char* path, struct BinFont** out);
/**
* @brief Opens a font from memory.
* @param[in] data the font file contents, which must stay valid until binfont_close()
* @param[in] size the size of data in bytes
* @param[in] take_ownership when true, data is released with memory_free() by binfont_close() (also on failure)
* @param[out] out the opened font
* @retval ERROR_NONE on success
* @retval ERROR_NOT_SUPPORTED when the data is not a valid or supported font
* @retval ERROR_OUT_OF_MEMORY when memory allocation failed
*/
error_t binfont_open_memory(const void* data, size_t size, bool take_ownership, struct BinFont** out);
/** Releases the font and all its resources. */
void binfont_close(struct BinFont* font);
/**
* @brief Keeps the font file open until the matching binfont_end(), so rendering many glyphs
* doesn't open and close the file for each of them. Calls can be nested and used from multiple tasks.
* Does nothing for fonts that are fully loaded in memory.
* @retval ERROR_NONE on success
* @retval ERROR_NOT_FOUND when the file can't be opened
*/
error_t binfont_begin(struct BinFont* font);
/** Ends a binfont_begin() session. The file is closed when no sessions remain. */
void binfont_end(struct BinFont* font);
void binfont_get_metrics(const struct BinFont* font, BinFontMetrics* out);
/**
* @param[in] font the font
* @param[in] codepoint the Unicode codepoint
* @param[out] out the glyph info
* @return false when the font has no glyph for this codepoint
*/
bool binfont_get_glyph(struct BinFont* font, uint32_t codepoint, BinFontGlyph* out);
/** @return the kerning adjustment for a glyph pair in 1/16th pixels, or 0 when there is none */
int32_t binfont_get_kerning_x16(struct BinFont* font, uint32_t left_glyph_id, uint32_t right_glyph_id);
/**
* @brief Decodes a glyph bitmap as 8-bit alpha (0 = transparent, 255 = opaque).
* @param[in] font the font
* @param[in] glyph a glyph from binfont_get_glyph()
* @param[out] out the destination: glyph->height rows of glyph->width bytes
* @param[in] stride bytes per row in out (at least glyph->width)
* @retval ERROR_NONE on success
* @retval ERROR_INVALID_ARGUMENT when stride is too small
* @retval ERROR_RESOURCE when the glyph data can't be read
*/
error_t binfont_get_glyph_bitmap(struct BinFont* font, const BinFontGlyph* glyph, uint8_t* out, size_t stride);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,40 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <tactility/error.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct BinFontGeneratorConfig {
/** Path to a TrueType (.ttf) file */
const char* ttf_path;
/** Font size in pixels (em height) */
uint16_t size;
/** Bits per pixel: 1, 2, 3 or 4 */
uint8_t bpp;
/** Codepoints to include. Codepoints that the TTF doesn't contain are skipped. */
const uint32_t* codepoints;
size_t codepoint_count;
} BinFontGeneratorConfig;
/**
* @brief Rasterizes a TrueType font into the lv_font_conv binary format.
* @param[in] config the generator configuration
* @param[out] out_data the generated font file contents, to be released with memory_free()
* @param[out] out_size the size of out_data in bytes
* @retval ERROR_NONE on success
* @retval ERROR_INVALID_ARGUMENT when the configuration is invalid
* @retval ERROR_NOT_FOUND when the TTF file can't be read
* @retval ERROR_NOT_SUPPORTED when the TTF file can't be parsed or contains none of the codepoints
* @retval ERROR_OUT_OF_MEMORY when memory allocation failed
*/
error_t binfont_generate(const BinFontGeneratorConfig* config, uint8_t** out_data, size_t* out_size);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <tactility/module.h>
#ifdef __cplusplus
extern "C" {
#endif
extern struct Module binfont_module;
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,57 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <binfont/binfont.h>
#include <graphics/pixel_buffer.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Alpha-blends one glyph over the existing pixels of a PixelBuffer.
* @param[out] buffer destination, in any pixel format
* @param[in] x pen position x
* @param[in] baseline_y pen position y (the baseline)
* @param[in] font the font
* @param[in] codepoint the Unicode codepoint
* @param[in] color glyph colour as RGB565
* @param[in] conversion how colours reduce into the buffer's native format (see PixelBufferConversion)
* @return the horizontal advance in pixels, or 0 when the font has no glyph for the codepoint
*/
int binfont_draw_glyph_rgb565(
struct PixelBuffer* buffer,
int x,
int baseline_y,
struct BinFont* font,
uint32_t codepoint,
uint16_t color,
enum PixelBufferConversion conversion
);
/**
* @brief Alpha-blends a UTF-8 string over the existing pixels of a PixelBuffer, applying kerning.
* @param[out] buffer destination, in any pixel format
* @param[in] x pen position x
* @param[in] baseline_y pen position y (the baseline)
* @param[in] font the font
* @param[in] text UTF-8 encoded, null-terminated text
* @param[in] color glyph colour as RGB565
* @param[in] conversion how colours reduce into the buffer's native format (see PixelBufferConversion)
* @return the total advance in pixels
*/
int binfont_draw_text_rgb565(
struct PixelBuffer* buffer,
int x,
int baseline_y,
struct BinFont* font,
const char* text,
uint16_t color,
enum PixelBufferConversion conversion
);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,19 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <binfont/binfont.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Opens a font file without loading it into memory: only the lookup tables are loaded and
* glyph data is read from the file on demand. binfont_open_file() falls back to this when the file
* doesn't fit in memory.
*/
error_t binfont_open_file_streaming(const char* path, struct BinFont** out);
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,803 @@
// SPDX-License-Identifier: Apache-2.0
#include <binfont/binfont.h>
#include <binfont_private.h>
#include <tactility/concurrent/mutex.h>
#include <tactility/memory.h>
#include <cstdint>
#include <cstdio>
#include <cstring>
#include <initializer_list>
namespace {
constexpr size_t RECORD_HEADER_SIZE = 8;
constexpr size_t HEAD_MIN_SIZE = 48;
constexpr size_t CMAP_SUBTABLE_HEADER_SIZE = 16;
constexpr size_t GLYPH_HEADER_MAX_BYTES = 16;
enum CmapFormat : uint8_t {
CMAP_FORMAT_0 = 0,
CMAP_FORMAT_SPARSE = 1,
CMAP_FORMAT_0_TINY = 2,
CMAP_FORMAT_SPARSE_TINY = 3,
};
enum Compression : uint8_t {
COMPRESSION_NONE = 0,
COMPRESSION_RLE_PREFILTER = 1,
COMPRESSION_RLE = 2,
};
uint16_t read_u16(const uint8_t* p) {
return static_cast<uint16_t>(p[0] | (p[1] << 8));
}
int16_t read_i16(const uint8_t* p) {
return static_cast<int16_t>(read_u16(p));
}
uint32_t read_u32(const uint8_t* p) {
return static_cast<uint32_t>(p[0]) | (static_cast<uint32_t>(p[1]) << 8) | (static_cast<uint32_t>(p[2]) << 16) | (static_cast<uint32_t>(p[3]) << 24);
}
bool has_marker(const uint8_t* record, const char* marker) {
return memcmp(record + 4, marker, 4) == 0;
}
/** MSB-first bit reader. Bits past the end read as 0. */
class BitReader {
const uint8_t* data;
size_t sizeBits;
size_t position;
public:
BitReader(const uint8_t* data, size_t size, size_t bitOffset = 0) : data(data), sizeBits(size * 8), position(bitOffset) {}
uint32_t read(uint8_t bits) {
uint32_t value = 0;
for (uint8_t i = 0; i < bits; i++) {
value <<= 1;
if (position < sizeBits) {
value |= (data[position >> 3] >> (7 - (position & 7))) & 1U;
}
position++;
}
return value;
}
int32_t readSigned(uint8_t bits) {
if (bits == 0) {
return 0;
}
const uint32_t value = read(bits);
if (value & (1U << (bits - 1))) {
return static_cast<int32_t>(value | (~0U << bits));
}
return static_cast<int32_t>(value);
}
};
/** Decoder for the modified I3BN RLE stream of lv_font_conv. */
class RleReader {
enum class State { Single, Repeated, Counter };
BitReader& bits;
uint8_t bpp;
State state = State::Single;
bool first = true;
uint8_t previous = 0;
uint32_t count = 0;
uint8_t readSingle() {
previous = static_cast<uint8_t>(bits.read(bpp));
state = State::Single;
return previous;
}
public:
RleReader(BitReader& bits, uint8_t bpp) : bits(bits), bpp(bpp) {}
uint8_t next() {
switch (state) {
case State::Single: {
const auto value = static_cast<uint8_t>(bits.read(bpp));
if (!first && value == previous) {
count = 0;
state = State::Repeated;
}
first = false;
previous = value;
return value;
}
case State::Repeated: {
count++;
if (bits.read(1) == 0) {
return readSingle();
}
if (count == 11) {
count = bits.read(6);
if (count != 0) {
state = State::Counter;
} else {
return readSingle();
}
}
return previous;
}
case State::Counter:
count--;
if (count == 0) {
return readSingle();
}
return previous;
}
return 0;
}
};
struct Header {
uint16_t fontSize;
int16_t ascent;
int16_t descent;
uint16_t defaultAdvanceWidth;
uint16_t kerningScale;
uint8_t indexToLocFormat;
uint8_t glyphIdFormat;
uint8_t advanceWidthFormat;
uint8_t bpp;
uint8_t xyBits;
uint8_t whBits;
uint8_t advanceWidthBits;
uint8_t compression;
uint8_t subpixelMode;
int16_t underlinePosition;
uint16_t underlineThickness;
};
} // namespace
struct BinFont {
Header header;
/** The whole file in memory mode, nullptr in stream mode */
const uint8_t* data;
bool ownsData;
/** Stream mode only: the file path, and the file while it's open (guarded by mutex) */
char* path;
FILE* file;
uint32_t sessionCount;
Mutex mutex;
/** Owned copy of the cmap/loca/kern records in stream mode */
uint8_t* tables;
/** Each record pointer includes its 8-byte record header */
const uint8_t* cmap;
size_t cmapSize;
const uint8_t* loca;
size_t locaSize;
uint32_t locaCount;
const uint8_t* kern;
size_t kernSize;
size_t glyfOffset;
size_t glyfSize;
};
namespace {
bool read_at(BinFont* font, size_t offset, uint8_t* out, size_t size) {
if (fseek(font->file, static_cast<long>(offset), SEEK_SET) != 0) {
return false;
}
return fread(out, 1, size, font->file) == size;
}
bool parse_header(const uint8_t* record, size_t size, Header& header) {
if (size < HEAD_MIN_SIZE || !has_marker(record, "head")) {
return false;
}
header.fontSize = read_u16(record + 14);
header.ascent = read_i16(record + 16);
header.descent = read_i16(record + 18);
header.defaultAdvanceWidth = read_u16(record + 30);
header.kerningScale = read_u16(record + 32);
header.indexToLocFormat = record[34];
header.glyphIdFormat = record[35];
header.advanceWidthFormat = record[36];
header.bpp = record[37];
header.xyBits = record[38];
header.whBits = record[39];
header.advanceWidthBits = record[40];
header.compression = record[41];
header.subpixelMode = record[42];
header.underlinePosition = read_i16(record + 44);
header.underlineThickness = read_u16(record + 46);
return header.bpp >= 1 && header.bpp <= 4 &&
header.compression <= COMPRESSION_RLE &&
header.subpixelMode == 0 &&
header.indexToLocFormat <= 1 &&
header.xyBits <= 16 && header.whBits <= 16 && header.advanceWidthBits <= 32;
}
bool validate_cmap(const uint8_t* cmap, size_t size) {
if (size < 12) {
return false;
}
const uint32_t count = read_u32(cmap + 8);
if (count > (size - 12) / CMAP_SUBTABLE_HEADER_SIZE) {
return false;
}
for (uint32_t i = 0; i < count; i++) {
const uint8_t* subtable = cmap + 12 + i * CMAP_SUBTABLE_HEADER_SIZE;
const size_t data_offset = read_u32(subtable);
const size_t range_length = read_u16(subtable + 8);
const size_t entries = read_u16(subtable + 12);
size_t data_size;
switch (subtable[14]) {
case CMAP_FORMAT_0: data_size = range_length; break;
case CMAP_FORMAT_SPARSE: data_size = entries * 4; break;
case CMAP_FORMAT_0_TINY: data_size = 0; break;
case CMAP_FORMAT_SPARSE_TINY: data_size = entries * 2; break;
default: return false;
}
if (data_size > 0 && (data_offset > size || data_size > size - data_offset)) {
return false;
}
}
return true;
}
bool validate_kern(const uint8_t* kern, size_t size, uint8_t glyphIdFormat) {
if (size < 16) {
return false;
}
const uint8_t format = kern[8];
if (format == 0) {
const size_t count = read_u32(kern + 12);
const size_t entry_size = (glyphIdFormat ? 4 : 2) + 1;
return count <= (size - 16) / entry_size;
} else if (format == 3) {
const size_t glyph_count = read_u16(kern + 12);
const size_t left_count = kern[14];
const size_t right_count = kern[15];
return 16 + glyph_count * 2 + left_count * right_count <= size;
}
return false;
}
/**
* Locates all tables. In memory mode the table pointers point into font->data, in stream mode
* the lookup tables are copied into font->tables.
*/
error_t parse_layout(BinFont* font, size_t fileSize) {
uint8_t record_header[RECORD_HEADER_SIZE];
uint8_t head[64];
auto read = [font](size_t offset, uint8_t* out, size_t size) {
if (font->data != nullptr) {
memcpy(out, font->data + offset, size);
return true;
}
return read_at(font, offset, out, size);
};
// head
if (fileSize < RECORD_HEADER_SIZE || !read(0, record_header, RECORD_HEADER_SIZE)) {
return ERROR_NOT_SUPPORTED;
}
const size_t head_size = read_u32(record_header);
if (head_size < HEAD_MIN_SIZE || head_size > fileSize) {
return ERROR_NOT_SUPPORTED;
}
if (!read(0, head, HEAD_MIN_SIZE) || !parse_header(head, HEAD_MIN_SIZE, font->header)) {
return ERROR_NOT_SUPPORTED;
}
// cmap, loca, glyf and optionally kern follow each other
size_t offsets[4] = {};
size_t sizes[4] = {};
const char* markers[4] = { "cmap", "loca", "glyf", "kern" };
size_t offset = head_size;
for (int i = 0; i < 4; i++) {
if (offset > fileSize || fileSize - offset < RECORD_HEADER_SIZE || !read(offset, record_header, RECORD_HEADER_SIZE)) {
if (i == 3) {
break; // kern is optional
}
return ERROR_NOT_SUPPORTED;
}
const size_t size = read_u32(record_header);
if (!has_marker(record_header, markers[i]) || size < RECORD_HEADER_SIZE || size > fileSize - offset) {
if (i == 3) {
break;
}
return ERROR_NOT_SUPPORTED;
}
offsets[i] = offset;
sizes[i] = size;
offset += size;
}
font->glyfOffset = offsets[2];
font->glyfSize = sizes[2];
if (font->data != nullptr) {
font->cmap = font->data + offsets[0];
font->loca = font->data + offsets[1];
font->kern = sizes[3] ? font->data + offsets[3] : nullptr;
} else {
font->tables = static_cast<uint8_t*>(memory_alloc(sizes[0] + sizes[1] + sizes[3]));
if (font->tables == nullptr) {
return ERROR_OUT_OF_MEMORY;
}
uint8_t* cursor = font->tables;
for (int i : { 0, 1, 3 }) {
if (sizes[i] > 0 && !read_at(font, offsets[i], cursor, sizes[i])) {
return ERROR_NOT_SUPPORTED;
}
cursor += sizes[i];
}
font->cmap = font->tables;
font->loca = font->tables + sizes[0];
font->kern = sizes[3] ? font->tables + sizes[0] + sizes[1] : nullptr;
}
font->cmapSize = sizes[0];
font->locaSize = sizes[1];
font->kernSize = sizes[3];
if (!validate_cmap(font->cmap, font->cmapSize)) {
return ERROR_NOT_SUPPORTED;
}
if (font->locaSize < 12) {
return ERROR_NOT_SUPPORTED;
}
font->locaCount = read_u32(font->loca + 8);
const size_t loca_entry_size = font->header.indexToLocFormat ? 4 : 2;
if (font->locaCount > (font->locaSize - 12) / loca_entry_size) {
return ERROR_NOT_SUPPORTED;
}
if (font->kern != nullptr && !validate_kern(font->kern, font->kernSize, font->header.glyphIdFormat)) {
font->kern = nullptr;
font->kernSize = 0;
}
return ERROR_NONE;
}
BinFont* create_font() {
auto* font = static_cast<BinFont*>(memory_calloc(1, sizeof(BinFont)));
if (font != nullptr) {
mutex_construct(&font->mutex);
}
return font;
}
uint32_t find_glyph_id(const BinFont* font, uint32_t codepoint) {
const uint8_t* cmap = font->cmap;
const uint32_t count = read_u32(cmap + 8);
// Find the last subtable that starts at or before the codepoint
uint32_t low = 0;
uint32_t high = count;
while (low < high) {
const uint32_t mid = (low + high) / 2;
if (read_u32(cmap + 12 + mid * CMAP_SUBTABLE_HEADER_SIZE + 4) <= codepoint) {
low = mid + 1;
} else {
high = mid;
}
}
if (low == 0) {
return 0;
}
const uint8_t* subtable = cmap + 12 + (low - 1) * CMAP_SUBTABLE_HEADER_SIZE;
const uint32_t data_offset = read_u32(subtable);
const uint32_t range_start = read_u32(subtable + 4);
const uint16_t range_length = read_u16(subtable + 8);
const uint16_t glyph_id_start = read_u16(subtable + 10);
const uint16_t entries = read_u16(subtable + 12);
const uint32_t relative = codepoint - range_start;
if (relative >= range_length) {
return 0;
}
switch (subtable[14]) {
case CMAP_FORMAT_0:
return glyph_id_start + cmap[data_offset + relative];
case CMAP_FORMAT_0_TINY:
return glyph_id_start + relative;
case CMAP_FORMAT_SPARSE:
case CMAP_FORMAT_SPARSE_TINY: {
const uint8_t* list = cmap + data_offset;
uint32_t list_low = 0;
uint32_t list_high = entries;
while (list_low < list_high) {
const uint32_t mid = (list_low + list_high) / 2;
const uint16_t value = read_u16(list + mid * 2);
if (value == relative) {
if (subtable[14] == CMAP_FORMAT_SPARSE_TINY) {
return glyph_id_start + mid;
}
return glyph_id_start + read_u16(list + entries * 2 + mid * 2);
} else if (value < relative) {
list_low = mid + 1;
} else {
list_high = mid;
}
}
return 0;
}
default:
return 0;
}
}
/** Gets the offset and size of a glyph record, relative to the glyf data (after its record header). */
bool get_glyph_location(const BinFont* font, uint32_t glyphId, size_t& offset, size_t& size) {
if (glyphId == 0 || glyphId >= font->locaCount) {
return false;
}
const uint8_t* entries = font->loca + 12;
auto entry = [&](uint32_t index) -> size_t {
return font->header.indexToLocFormat ? read_u32(entries + index * 4) : read_u16(entries + index * 2);
};
const size_t start = entry(glyphId);
const size_t end = (glyphId + 1 < font->locaCount) ? entry(glyphId + 1) : font->glyfSize;
if (start < RECORD_HEADER_SIZE || end < start || end > font->glyfSize) {
return false;
}
offset = start;
size = end - start;
return true;
}
/** Reads from the font file in stream mode. Outside of a session, the file is opened for this read only. */
bool read_glyph_data(BinFont* font, size_t offset, uint8_t* out, size_t size) {
mutex_lock(&font->mutex);
const bool temporary = font->file == nullptr;
if (temporary) {
font->file = fopen(font->path, "rb");
}
const bool success = font->file != nullptr && read_at(font, offset, out, size);
if (temporary && font->file != nullptr) {
fclose(font->file);
font->file = nullptr;
}
mutex_unlock(&font->mutex);
return success;
}
/**
* Provides the record of a glyph. In memory mode it points into the font data, in stream mode it
* is read into buffer (bufferSize bytes) or, when that is too small, into an allocation returned
* via allocated (to be freed by the caller).
*/
bool get_glyph_record(BinFont* font, uint32_t glyphId, size_t maxSize, uint8_t* buffer, size_t bufferSize, const uint8_t*& record, size_t& size, uint8_t*& allocated) {
size_t offset;
allocated = nullptr;
if (!get_glyph_location(font, glyphId, offset, size)) {
return false;
}
if (font->data != nullptr) {
record = font->data + font->glyfOffset + offset;
return true;
}
if (size > maxSize) {
size = maxSize;
}
uint8_t* target = buffer;
if (size > bufferSize) {
allocated = static_cast<uint8_t*>(memory_alloc(size));
if (allocated == nullptr) {
return false;
}
target = allocated;
}
const bool success = read_glyph_data(font, font->glyfOffset + offset, target, size);
if (!success) {
memory_free(allocated);
allocated = nullptr;
return false;
}
record = target;
return true;
}
void parse_glyph(const Header& header, BitReader& reader, uint32_t glyphId, BinFontGlyph* out) {
uint32_t advance = header.advanceWidthBits ? reader.read(header.advanceWidthBits) : header.defaultAdvanceWidth;
if (header.advanceWidthFormat == 0) {
advance *= 16;
}
out->glyph_id = glyphId;
out->advance_x16 = advance;
out->x = static_cast<int16_t>(reader.readSigned(header.xyBits));
out->y = static_cast<int16_t>(reader.readSigned(header.xyBits));
out->width = static_cast<uint16_t>(reader.read(header.whBits));
out->height = static_cast<uint16_t>(reader.read(header.whBits));
}
/** Opens a file for reading and determines its size */
error_t open_file(const char* path, FILE*& file, size_t& size) {
file = fopen(path, "rb");
if (file == nullptr) {
return ERROR_NOT_FOUND;
}
if (fseek(file, 0, SEEK_END) != 0) {
fclose(file);
return ERROR_NOT_SUPPORTED;
}
const long file_size = ftell(file);
if (file_size <= 0 || fseek(file, 0, SEEK_SET) != 0) {
fclose(file);
return ERROR_NOT_SUPPORTED;
}
size = static_cast<size_t>(file_size);
return ERROR_NONE;
}
/** Loads the lookup tables from an open file, then closes it. Glyph data is read on demand. */
error_t open_streaming(const char* path, FILE* file, size_t size, BinFont** out) {
BinFont* font = create_font();
if (font == nullptr) {
fclose(file);
return ERROR_OUT_OF_MEMORY;
}
font->file = file;
const size_t path_size = strlen(path) + 1;
font->path = static_cast<char*>(memory_alloc(path_size));
if (font->path == nullptr) {
binfont_close(font);
return ERROR_OUT_OF_MEMORY;
}
memcpy(font->path, path, path_size);
const error_t error = parse_layout(font, size);
fclose(font->file);
font->file = nullptr;
if (error != ERROR_NONE) {
binfont_close(font);
return error;
}
*out = font;
return ERROR_NONE;
}
} // namespace
extern "C" {
error_t binfont_open_memory(const void* data, size_t size, bool take_ownership, BinFont** out) {
BinFont* font = create_font();
if (font == nullptr) {
if (take_ownership) {
memory_free(const_cast<void*>(data));
}
return ERROR_OUT_OF_MEMORY;
}
font->data = static_cast<const uint8_t*>(data);
font->ownsData = take_ownership;
const error_t error = parse_layout(font, size);
if (error != ERROR_NONE) {
binfont_close(font);
return error;
}
*out = font;
return ERROR_NONE;
}
error_t binfont_open_file(const char* path, BinFont** out) {
FILE* file;
size_t size;
const error_t open_error = open_file(path, file, size);
if (open_error != ERROR_NONE) {
return open_error;
}
const uint16_t memory_capability = memory_external_total() > 0 ? MEMORY_CAPABILITY_EXTERNAL : MEMORY_CAPABILITY_INTERNAL;
const MemoryPolicy policy = { .required = memory_capability, .desired = 0, .alignment = 0 };
auto* data = static_cast<uint8_t*>(memory_alloc_with_policy(size, &policy));
if (data == nullptr) {
return open_streaming(path, file, size, out);
}
const bool success = fread(data, 1, size, file) == size;
fclose(file);
if (!success) {
memory_free(data);
return ERROR_NOT_SUPPORTED;
}
return binfont_open_memory(data, size, true, out);
}
error_t binfont_open_file_streaming(const char* path, BinFont** out) {
FILE* file;
size_t size;
const error_t open_error = open_file(path, file, size);
if (open_error != ERROR_NONE) {
return open_error;
}
return open_streaming(path, file, size, out);
}
error_t binfont_begin(BinFont* font) {
if (font->data != nullptr) {
return ERROR_NONE;
}
mutex_lock(&font->mutex);
if (font->sessionCount == 0) {
font->file = fopen(font->path, "rb");
if (font->file == nullptr) {
mutex_unlock(&font->mutex);
return ERROR_NOT_FOUND;
}
}
font->sessionCount++;
mutex_unlock(&font->mutex);
return ERROR_NONE;
}
void binfont_end(BinFont* font) {
if (font->data != nullptr) {
return;
}
mutex_lock(&font->mutex);
if (font->sessionCount > 0) {
font->sessionCount--;
if (font->sessionCount == 0) {
fclose(font->file);
font->file = nullptr;
}
}
mutex_unlock(&font->mutex);
}
void binfont_close(BinFont* font) {
if (font->ownsData) {
memory_free(const_cast<uint8_t*>(font->data));
}
if (font->file != nullptr) {
fclose(font->file);
}
memory_free(font->path);
memory_free(font->tables);
mutex_destruct(&font->mutex);
memory_free(font);
}
void binfont_get_metrics(const BinFont* font, BinFontMetrics* out) {
const Header& header = font->header;
out->size = header.fontSize;
out->ascent = header.ascent;
out->descent = header.descent;
out->line_height = static_cast<uint16_t>(header.ascent - header.descent);
out->base_line = static_cast<int16_t>(-header.descent);
out->underline_position = header.underlinePosition;
out->underline_thickness = header.underlineThickness;
out->bpp = header.bpp;
}
bool binfont_get_glyph(BinFont* font, uint32_t codepoint, BinFontGlyph* out) {
const uint32_t glyph_id = find_glyph_id(font, codepoint);
uint8_t buffer[GLYPH_HEADER_MAX_BYTES];
const uint8_t* record;
size_t size;
uint8_t* allocated;
if (!get_glyph_record(font, glyph_id, sizeof(buffer), buffer, sizeof(buffer), record, size, allocated)) {
return false;
}
BitReader reader(record, size);
parse_glyph(font->header, reader, glyph_id, out);
return true;
}
int32_t binfont_get_kerning_x16(BinFont* font, uint32_t left_glyph_id, uint32_t right_glyph_id) {
const uint8_t* kern = font->kern;
if (kern == nullptr) {
return 0;
}
int8_t value = 0;
if (kern[8] == 0) {
const uint32_t count = read_u32(kern + 12);
const uint8_t* pairs = kern + 16;
const bool wide = font->header.glyphIdFormat != 0;
const size_t pair_size = wide ? 4 : 2;
const uint32_t key = (left_glyph_id << 16) | right_glyph_id;
uint32_t low = 0;
uint32_t high = count;
while (low < high) {
const uint32_t mid = (low + high) / 2;
const uint8_t* pair = pairs + mid * pair_size;
const uint32_t left = wide ? read_u16(pair) : pair[0];
const uint32_t right = wide ? read_u16(pair + 2) : pair[1];
const uint32_t mid_key = (left << 16) | right;
if (mid_key == key) {
value = static_cast<int8_t>(pairs[count * pair_size + mid]);
break;
} else if (mid_key < key) {
low = mid + 1;
} else {
high = mid;
}
}
} else {
const uint16_t glyph_count = read_u16(kern + 12);
const uint8_t right_count = kern[15];
if (left_glyph_id >= glyph_count || right_glyph_id >= glyph_count) {
return 0;
}
const uint8_t* left_classes = kern + 16;
const uint8_t* right_classes = left_classes + glyph_count;
const uint8_t* values = right_classes + glyph_count;
const uint8_t left_class = left_classes[left_glyph_id];
const uint8_t right_class = right_classes[right_glyph_id];
if (left_class == 0 || right_class == 0 || left_class > kern[14] || right_class > right_count) {
return 0;
}
value = static_cast<int8_t>(values[(left_class - 1) * right_count + (right_class - 1)]);
}
return (static_cast<int32_t>(value) * font->header.kerningScale) >> 4;
}
error_t binfont_get_glyph_bitmap(BinFont* font, const BinFontGlyph* glyph, uint8_t* out, size_t stride) {
if (stride < glyph->width) {
return ERROR_INVALID_ARGUMENT;
}
if (glyph->width == 0 || glyph->height == 0) {
return ERROR_NONE;
}
const uint8_t* record;
size_t size;
uint8_t* allocated;
if (!get_glyph_record(font, glyph->glyph_id, SIZE_MAX, nullptr, 0, record, size, allocated)) {
return ERROR_RESOURCE;
}
const Header& header = font->header;
const uint8_t bpp = header.bpp;
const size_t header_bits = header.advanceWidthBits + 2U * header.xyBits + 2U * header.whBits;
BitReader reader(record, size, header_bits);
// Raw pixel values first, so the XOR prefilter can work on the previous line
if (header.compression == COMPRESSION_NONE) {
for (uint16_t y = 0; y < glyph->height; y++) {
uint8_t* line = out + y * stride;
for (uint16_t x = 0; x < glyph->width; x++) {
line[x] = static_cast<uint8_t>(reader.read(bpp));
}
}
} else {
RleReader rle(reader, bpp);
const bool prefilter = header.compression == COMPRESSION_RLE_PREFILTER;
for (uint16_t y = 0; y < glyph->height; y++) {
uint8_t* line = out + y * stride;
const uint8_t* previous = line - stride;
for (uint16_t x = 0; x < glyph->width; x++) {
const uint8_t value = rle.next();
line[x] = (prefilter && y > 0) ? (value ^ previous[x]) : value;
}
}
}
const uint32_t max_value = (1U << bpp) - 1;
for (uint16_t y = 0; y < glyph->height; y++) {
uint8_t* line = out + y * stride;
for (uint16_t x = 0; x < glyph->width; x++) {
line[x] = static_cast<uint8_t>(line[x] * 255U / max_value);
}
}
memory_free(allocated);
return ERROR_NONE;
}
}

View File

@ -0,0 +1,443 @@
// SPDX-License-Identifier: Apache-2.0
#include <binfont/generator.h>
#include <tactility/memory.h>
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstring>
#define STBTT_STATIC
#define STB_TRUETYPE_IMPLEMENTATION
#define STBTT_malloc(size, user) ((void)(user), memory_alloc(size))
#define STBTT_free(pointer, user) ((void)(user), memory_free(pointer))
#include "stb_truetype.h"
namespace {
constexpr size_t HEAD_SIZE = 48;
constexpr uint8_t CMAP_FORMAT_0_TINY = 2;
constexpr uint8_t CMAP_FORMAT_SPARSE_TINY = 3;
constexpr uint32_t CMAP_MAX_RANGE = 0xFFFF;
constexpr MemoryPolicy EXTERNAL_PREFERRED = { .required = 0, .desired = MEMORY_CAPABILITY_EXTERNAL, .alignment = 0 };
class ByteBuffer {
uint8_t* data = nullptr;
size_t size = 0;
size_t capacity = 0;
bool failed = false;
bool reserve(size_t required) {
if (failed) {
return false;
}
if (required <= capacity) {
return true;
}
size_t new_capacity = capacity ? capacity * 2 : 4096;
while (new_capacity < required) {
new_capacity *= 2;
}
auto* new_data = static_cast<uint8_t*>(memory_realloc_with_policy(data, new_capacity, &EXTERNAL_PREFERRED));
if (new_data == nullptr) {
failed = true;
return false;
}
data = new_data;
capacity = new_capacity;
return true;
}
public:
~ByteBuffer() { memory_free(data); }
size_t getSize() const { return size; }
bool hasFailed() const { return failed; }
void append(const void* bytes, size_t count) {
if (reserve(size + count)) {
memcpy(data + size, bytes, count);
size += count;
}
}
void appendZeros(size_t count) {
if (reserve(size + count)) {
memset(data + size, 0, count);
size += count;
}
}
void appendU8(uint8_t value) { append(&value, 1); }
void appendU16(uint16_t value) {
const uint8_t bytes[2] = { static_cast<uint8_t>(value), static_cast<uint8_t>(value >> 8) };
append(bytes, 2);
}
void appendU32(uint32_t value) {
const uint8_t bytes[4] = { static_cast<uint8_t>(value), static_cast<uint8_t>(value >> 8), static_cast<uint8_t>(value >> 16), static_cast<uint8_t>(value >> 24) };
append(bytes, 4);
}
void setU32(size_t offset, uint32_t value) {
if (!failed) {
data[offset] = static_cast<uint8_t>(value);
data[offset + 1] = static_cast<uint8_t>(value >> 8);
data[offset + 2] = static_cast<uint8_t>(value >> 16);
data[offset + 3] = static_cast<uint8_t>(value >> 24);
}
}
void alignTo4() { appendZeros((4 - size % 4) % 4); }
/** Starts a record and returns its offset, for endRecord(). */
size_t beginRecord(const char* marker) {
const size_t offset = size;
appendU32(0);
append(marker, 4);
return offset;
}
void endRecord(size_t offset) { setU32(offset, static_cast<uint32_t>(size - offset)); }
uint8_t* release() {
uint8_t* result = data;
data = nullptr;
size = 0;
capacity = 0;
return result;
}
};
/** MSB-first bit writer */
class BitWriter {
ByteBuffer& buffer;
uint8_t current = 0;
uint8_t used = 0;
public:
explicit BitWriter(ByteBuffer& buffer) : buffer(buffer) {}
void write(uint32_t value, uint8_t bits) {
while (bits > 0) {
bits--;
current = static_cast<uint8_t>((current << 1) | ((value >> bits) & 1U));
used++;
if (used == 8) {
buffer.appendU8(current);
current = 0;
used = 0;
}
}
}
void flush() {
if (used > 0) {
buffer.appendU8(static_cast<uint8_t>(current << (8 - used)));
current = 0;
used = 0;
}
}
};
struct GlyphInfo {
uint32_t codepoint;
int ttfIndex;
uint32_t advanceX16;
int x0, y0, x1, y1; // stb_truetype bitmap box: y points down
};
uint8_t bits_for_unsigned(uint32_t value) {
uint8_t bits = 1;
while (bits < 32 && (value >> bits) != 0) {
bits++;
}
return bits;
}
uint8_t bits_for_signed(int32_t min, int32_t max) {
uint8_t bits = 1;
while (bits < 32 && (min < -(1 << (bits - 1)) || max > (1 << (bits - 1)) - 1)) {
bits++;
}
return bits;
}
int16_t scale_metric(int value, float scale) {
return static_cast<int16_t>(std::lround(static_cast<float>(value) * scale));
}
uint8_t* read_file(const char* path, size_t& size) {
FILE* file = fopen(path, "rb");
if (file == nullptr) {
return nullptr;
}
uint8_t* data = nullptr;
long file_size = 0;
if (fseek(file, 0, SEEK_END) == 0 && (file_size = ftell(file)) > 0 && fseek(file, 0, SEEK_SET) == 0) {
data = static_cast<uint8_t*>(memory_alloc_with_policy(static_cast<size_t>(file_size), &EXTERNAL_PREFERRED));
if (data != nullptr && fread(data, 1, static_cast<size_t>(file_size), file) != static_cast<size_t>(file_size)) {
memory_free(data);
data = nullptr;
}
}
fclose(file);
size = static_cast<size_t>(file_size);
return data;
}
void write_cmap(ByteBuffer& out, const GlyphInfo* glyphs, size_t count) {
// Glyph ids are 1..count in codepoint order, so every subtable can be a "tiny" format
struct Range {
size_t first;
size_t count;
bool contiguous;
};
auto next_range = [&](size_t first) {
Range range = { first, 1, true };
while (first + range.count < count && range.count < CMAP_MAX_RANGE) {
const GlyphInfo& candidate = glyphs[first + range.count];
if (candidate.codepoint - glyphs[first].codepoint >= CMAP_MAX_RANGE) {
break;
}
if (candidate.codepoint != glyphs[first].codepoint + range.count) {
range.contiguous = false;
}
range.count++;
}
return range;
};
uint32_t range_count = 0;
for (size_t i = 0; i < count; i += next_range(i).count) {
range_count++;
}
const size_t record = out.beginRecord("cmap");
out.appendU32(range_count);
size_t data_offset = 12 + range_count * 16;
for (size_t i = 0; i < count;) {
const Range range = next_range(i);
const uint32_t range_start = glyphs[i].codepoint;
const uint32_t range_length = glyphs[i + range.count - 1].codepoint - range_start + 1;
out.appendU32(range.contiguous ? 0 : static_cast<uint32_t>(data_offset));
out.appendU32(range_start);
out.appendU16(static_cast<uint16_t>(range_length));
out.appendU16(static_cast<uint16_t>(i + 1));
out.appendU16(range.contiguous ? 0 : static_cast<uint16_t>(range.count));
out.appendU8(range.contiguous ? CMAP_FORMAT_0_TINY : CMAP_FORMAT_SPARSE_TINY);
out.appendU8(0);
if (!range.contiguous) {
data_offset += (range.count * 2 + 3) & ~static_cast<size_t>(3);
}
i += range.count;
}
for (size_t i = 0; i < count;) {
const Range range = next_range(i);
if (!range.contiguous) {
for (size_t j = 0; j < range.count; j++) {
out.appendU16(static_cast<uint16_t>(glyphs[i + j].codepoint - glyphs[i].codepoint));
}
out.alignTo4();
}
i += range.count;
}
out.endRecord(record);
}
error_t generate(const BinFontGeneratorConfig* config, const stbtt_fontinfo& info, GlyphInfo* glyphs, ByteBuffer& out) {
const float scale = stbtt_ScaleForMappingEmToPixels(&info, config->size);
// Collect glyphs, sorted by codepoint and without duplicates or missing glyphs
size_t count = 0;
for (size_t i = 0; i < config->codepoint_count; i++) {
const int index = stbtt_FindGlyphIndex(&info, static_cast<int>(config->codepoints[i]));
if (index != 0) {
glyphs[count].codepoint = config->codepoints[i];
glyphs[count].ttfIndex = index;
count++;
}
}
std::sort(glyphs, glyphs + count, [](const GlyphInfo& a, const GlyphInfo& b) { return a.codepoint < b.codepoint; });
count = std::unique(glyphs, glyphs + count, [](const GlyphInfo& a, const GlyphInfo& b) { return a.codepoint == b.codepoint; }) - glyphs;
if (count == 0 || count >= 0xFFFF) {
return ERROR_NOT_SUPPORTED;
}
int32_t min_xy = 0;
int32_t max_xy = 0;
uint32_t max_wh = 0;
uint32_t max_advance = 0;
// Like lv_font_conv, ascent and descent are the extents of the included glyphs
int32_t min_y = INT32_MAX;
int32_t max_y = INT32_MIN;
for (size_t i = 0; i < count; i++) {
GlyphInfo& glyph = glyphs[i];
int advance;
int left_side_bearing;
stbtt_GetGlyphHMetrics(&info, glyph.ttfIndex, &advance, &left_side_bearing);
glyph.advanceX16 = static_cast<uint32_t>(std::lround(static_cast<float>(advance) * scale * 16.0f));
stbtt_GetGlyphBitmapBox(&info, glyph.ttfIndex, scale, scale, &glyph.x0, &glyph.y0, &glyph.x1, &glyph.y1);
const int32_t bottom = -glyph.y1;
min_xy = std::min({ min_xy, static_cast<int32_t>(glyph.x0), bottom });
max_xy = std::max({ max_xy, static_cast<int32_t>(glyph.x0), bottom });
max_wh = std::max({ max_wh, static_cast<uint32_t>(glyph.x1 - glyph.x0), static_cast<uint32_t>(glyph.y1 - glyph.y0) });
max_advance = std::max(max_advance, glyph.advanceX16);
min_y = std::min(min_y, bottom);
max_y = std::max(max_y, static_cast<int32_t>(-glyph.y0));
}
const uint8_t xy_bits = bits_for_signed(min_xy, max_xy);
const uint8_t wh_bits = bits_for_unsigned(max_wh);
const uint8_t advance_bits = bits_for_unsigned(max_advance);
const uint32_t glyph_count = static_cast<uint32_t>(count) + 1;
int typo_ascent = 0;
int typo_descent = 0;
int typo_line_gap = 0;
stbtt_GetFontVMetricsOS2(&info, &typo_ascent, &typo_descent, &typo_line_gap);
int underline_position = 0;
int underline_thickness = 0;
const stbtt_uint32 post = stbtt__find_table(info.data, info.fontstart, "post");
if (post != 0) {
underline_position = ttSHORT(info.data + post + 8);
underline_thickness = ttSHORT(info.data + post + 10);
}
// head
const size_t head = out.beginRecord("head");
out.appendU32(1); // version
out.appendU16(3); // additional tables: cmap, loca, glyf
out.appendU16(config->size);
out.appendU16(static_cast<uint16_t>(max_y));
out.appendU16(static_cast<uint16_t>(min_y));
out.appendU16(static_cast<uint16_t>(scale_metric(typo_ascent, scale)));
out.appendU16(static_cast<uint16_t>(scale_metric(typo_descent, scale)));
out.appendU16(static_cast<uint16_t>(scale_metric(typo_line_gap, scale)));
out.appendU16(static_cast<uint16_t>(min_y));
out.appendU16(static_cast<uint16_t>(max_y));
out.appendU16(0); // default advance width
out.appendU16(16); // kerning scale 1.0 in FP12.4
out.appendU8(1); // loca: Offset32
out.appendU8(glyph_count > 256 ? 1 : 0);
out.appendU8(1); // advance width with 4 fractional bits
out.appendU8(config->bpp);
out.appendU8(xy_bits);
out.appendU8(wh_bits);
out.appendU8(advance_bits);
out.appendU8(0); // no compression
out.appendU8(0); // no subpixel rendering
out.appendU8(0);
out.appendU16(static_cast<uint16_t>(scale_metric(underline_position, scale)));
out.appendU16(static_cast<uint16_t>(scale_metric(underline_thickness, scale)));
out.endRecord(head);
write_cmap(out, glyphs, count);
const size_t loca = out.beginRecord("loca");
out.appendU32(glyph_count);
const size_t loca_entries = out.getSize();
out.appendZeros(glyph_count * 4);
out.endRecord(loca);
const size_t glyf = out.beginRecord("glyf");
uint8_t* bitmap = nullptr;
size_t bitmap_capacity = 0;
const uint32_t max_value = (1U << config->bpp) - 1;
for (uint32_t id = 0; id < glyph_count && !out.hasFailed(); id++) {
out.setU32(loca_entries + id * 4, static_cast<uint32_t>(out.getSize() - glyf));
BitWriter writer(out);
if (id == 0) {
writer.write(0, advance_bits);
writer.write(0, xy_bits);
writer.write(0, xy_bits);
writer.write(0, wh_bits);
writer.write(0, wh_bits);
writer.flush();
continue;
}
const GlyphInfo& glyph = glyphs[id - 1];
const int width = glyph.x1 - glyph.x0;
const int height = glyph.y1 - glyph.y0;
writer.write(glyph.advanceX16, advance_bits);
writer.write(static_cast<uint32_t>(glyph.x0), xy_bits);
writer.write(static_cast<uint32_t>(-glyph.y1), xy_bits);
writer.write(static_cast<uint32_t>(width), wh_bits);
writer.write(static_cast<uint32_t>(height), wh_bits);
const size_t pixel_count = static_cast<size_t>(width) * height;
if (pixel_count > 0) {
if (pixel_count > bitmap_capacity) {
memory_free(bitmap);
bitmap = static_cast<uint8_t*>(memory_alloc_with_policy(pixel_count, &EXTERNAL_PREFERRED));
if (bitmap == nullptr) {
return ERROR_OUT_OF_MEMORY;
}
bitmap_capacity = pixel_count;
}
stbtt_MakeGlyphBitmap(&info, bitmap, width, height, width, scale, scale, glyph.ttfIndex);
for (size_t i = 0; i < pixel_count; i++) {
writer.write((bitmap[i] * max_value + 127) / 255, config->bpp);
}
}
writer.flush();
}
memory_free(bitmap);
out.alignTo4();
out.endRecord(glyf);
return out.hasFailed() ? ERROR_OUT_OF_MEMORY : ERROR_NONE;
}
} // namespace
extern "C" {
error_t binfont_generate(const BinFontGeneratorConfig* config, uint8_t** out_data, size_t* out_size) {
if (config->ttf_path == nullptr || config->size == 0 || config->bpp < 1 || config->bpp > 4 || config->codepoint_count == 0) {
return ERROR_INVALID_ARGUMENT;
}
size_t ttf_size = 0;
uint8_t* ttf = read_file(config->ttf_path, ttf_size);
if (ttf == nullptr) {
return ERROR_NOT_FOUND;
}
stbtt_fontinfo info;
const int font_offset = stbtt_GetFontOffsetForIndex(ttf, 0);
if (font_offset < 0 || stbtt_InitFont(&info, ttf, font_offset) == 0) {
memory_free(ttf);
return ERROR_NOT_SUPPORTED;
}
auto* glyphs = static_cast<GlyphInfo*>(memory_alloc(config->codepoint_count * sizeof(GlyphInfo)));
if (glyphs == nullptr) {
memory_free(ttf);
return ERROR_OUT_OF_MEMORY;
}
ByteBuffer out;
const error_t error = generate(config, info, glyphs, out);
memory_free(glyphs);
memory_free(ttf);
if (error != ERROR_NONE) {
return error;
}
*out_size = out.getSize();
*out_data = out.release();
return ERROR_NONE;
}
}

View File

@ -0,0 +1,33 @@
// SPDX-License-Identifier: Apache-2.0
#include <binfont/binfont.h>
#include <binfont/generator.h>
#include <binfont/module.h>
#include <binfont/render.h>
static const struct ModuleSymbol SYMBOLS[] = {
// binfont
DEFINE_MODULE_SYMBOL(binfont_open_file),
DEFINE_MODULE_SYMBOL(binfont_open_memory),
DEFINE_MODULE_SYMBOL(binfont_close),
DEFINE_MODULE_SYMBOL(binfont_begin),
DEFINE_MODULE_SYMBOL(binfont_end),
DEFINE_MODULE_SYMBOL(binfont_get_metrics),
DEFINE_MODULE_SYMBOL(binfont_get_glyph),
DEFINE_MODULE_SYMBOL(binfont_get_kerning_x16),
DEFINE_MODULE_SYMBOL(binfont_get_glyph_bitmap),
// generator
DEFINE_MODULE_SYMBOL(binfont_generate),
// render
DEFINE_MODULE_SYMBOL(binfont_draw_glyph_rgb565),
DEFINE_MODULE_SYMBOL(binfont_draw_text_rgb565),
MODULE_SYMBOL_TERMINATOR,
};
struct Module binfont_module = {
.name = "binfont",
.start = NULL,
.stop = NULL,
.drivers = NULL,
.symbols = SYMBOLS,
.internal = NULL,
};

View File

@ -0,0 +1,126 @@
// SPDX-License-Identifier: Apache-2.0
#include <binfont/render.h>
#include <tactility/memory.h>
namespace {
constexpr size_t STACK_BITMAP_SIZE = 1024;
uint16_t blend_rgb565(uint16_t foreground, uint16_t background, uint8_t alpha) {
const uint32_t inverse = 255U - alpha;
const uint32_t r = (((foreground >> 11) & 0x1FU) * alpha + ((background >> 11) & 0x1FU) * inverse + 127U) / 255U;
const uint32_t g = (((foreground >> 5) & 0x3FU) * alpha + ((background >> 5) & 0x3FU) * inverse + 127U) / 255U;
const uint32_t b = ((foreground & 0x1FU) * alpha + (background & 0x1FU) * inverse + 127U) / 255U;
return static_cast<uint16_t>((r << 11) | (g << 5) | b);
}
void draw_glyph(PixelBuffer* buffer, int x, int baselineY, BinFont* font, const BinFontGlyph& glyph, uint16_t color, PixelBufferConversion conversion) {
const size_t pixel_count = static_cast<size_t>(glyph.width) * glyph.height;
if (pixel_count == 0) {
return;
}
uint8_t stack_bitmap[STACK_BITMAP_SIZE];
uint8_t* allocated = nullptr;
uint8_t* bitmap = stack_bitmap;
if (pixel_count > sizeof(stack_bitmap)) {
allocated = static_cast<uint8_t*>(memory_alloc(pixel_count));
if (allocated == nullptr) {
return;
}
bitmap = allocated;
}
if (binfont_get_glyph_bitmap(font, &glyph, bitmap, glyph.width) == ERROR_NONE) {
const int left = x + glyph.x;
const int top = baselineY - glyph.y - glyph.height;
for (int row = 0; row < glyph.height; row++) {
const uint8_t* line = bitmap + row * glyph.width;
for (int column = 0; column < glyph.width; column++) {
const uint8_t alpha = line[column];
if (alpha == 0) {
continue;
}
const int pixel_x = left + column;
const int pixel_y = top + row;
const uint16_t pixel = (alpha == 255) ? color : blend_rgb565(color, pixel_buffer_get_pixel_rgb565(buffer, pixel_x, pixel_y), alpha);
pixel_buffer_set_pixel_rgb565(buffer, pixel_x, pixel_y, pixel, conversion);
}
}
}
memory_free(allocated);
}
/** Decodes one UTF-8 codepoint and advances text. Invalid sequences decode as U+FFFD. */
uint32_t next_codepoint(const char*& text) {
const auto* bytes = reinterpret_cast<const uint8_t*>(text);
const uint8_t lead = bytes[0];
int length;
uint32_t codepoint;
if (lead < 0x80) {
length = 1;
codepoint = lead;
} else if ((lead & 0xE0) == 0xC0) {
length = 2;
codepoint = lead & 0x1FU;
} else if ((lead & 0xF0) == 0xE0) {
length = 3;
codepoint = lead & 0x0FU;
} else if ((lead & 0xF8) == 0xF0) {
length = 4;
codepoint = lead & 0x07U;
} else {
text++;
return 0xFFFD;
}
for (int i = 1; i < length; i++) {
if ((bytes[i] & 0xC0) != 0x80) {
text += i;
return 0xFFFD;
}
codepoint = (codepoint << 6) | (bytes[i] & 0x3FU);
}
text += length;
return codepoint;
}
} // namespace
extern "C" {
int binfont_draw_glyph_rgb565(PixelBuffer* buffer, int x, int baseline_y, BinFont* font, uint32_t codepoint, uint16_t color, PixelBufferConversion conversion) {
BinFontGlyph glyph;
if (!binfont_get_glyph(font, codepoint, &glyph)) {
return 0;
}
draw_glyph(buffer, x, baseline_y, font, glyph, color, conversion);
return static_cast<int>((glyph.advance_x16 + 8) >> 4);
}
int binfont_draw_text_rgb565(PixelBuffer* buffer, int x, int baseline_y, BinFont* font, const char* text, uint16_t color, PixelBufferConversion conversion) {
// When the file can't be kept open, every glyph lookup opens it by itself
const bool session = binfont_begin(font) == ERROR_NONE;
int32_t pen_x16 = 0;
uint32_t previous_glyph_id = 0;
while (*text != '\0') {
BinFontGlyph glyph;
if (!binfont_get_glyph(font, next_codepoint(text), &glyph)) {
previous_glyph_id = 0;
continue;
}
if (previous_glyph_id != 0) {
pen_x16 += binfont_get_kerning_x16(font, previous_glyph_id, glyph.glyph_id);
}
draw_glyph(buffer, x + ((pen_x16 + 8) >> 4), baseline_y, font, glyph, color, conversion);
pen_x16 += static_cast<int32_t>(glyph.advance_x16);
previous_glyph_id = glyph.glyph_id;
}
if (session) {
binfont_end(font);
}
return (pen_x16 + 8) >> 4;
}
}

View File

@ -0,0 +1,23 @@
project(BinFontModuleTests)
enable_language(C CXX ASM)
file(GLOB_RECURSE TEST_SOURCES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/source/*.cpp)
add_executable(BinFontModuleTests EXCLUDE_FROM_ALL ${TEST_SOURCES})
target_include_directories(BinFontModuleTests PRIVATE ${DOCTESTINC} ${PROJECT_SOURCE_DIR}/../private)
target_compile_definitions(BinFontModuleTests PRIVATE
"BINFONT_TEST_FIXTURES_DIR=\"${PROJECT_SOURCE_DIR}/fixtures\""
"BINFONT_TEST_TEMP_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\""
"BINFONT_TEST_ICON_TTF=\"${CMAKE_SOURCE_DIR}/Data/system/fonts/MaterialSymbolsRounded.ttf\""
)
add_test(NAME BinFontModuleTests COMMAND BinFontModuleTests)
target_link_libraries(BinFontModuleTests PUBLIC
binfont-module
graphics-module
TactilityKernel
freertos_kernel
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,340 @@
#include "doctest.h"
#include <binfont/binfont.h>
#include <binfont_private.h>
#include <binfont/generator.h>
#include <binfont/render.h>
#include <graphics/pixel_buffer.h>
#include <tactility/memory.h>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
namespace {
constexpr uint32_t ICON_CODEPOINTS[] = { 0xE5C3, 0xE8B8, 0xE2C7, 0xE63E, 0xE1A7 };
std::string fixture(const char* name) {
return std::string(BINFONT_TEST_FIXTURES_DIR) + "/" + name;
}
/** Loads a file into memory allocated with memory_alloc() */
uint8_t* load_file(const std::string& path, size_t& size) {
FILE* file = fopen(path.c_str(), "rb");
REQUIRE(file != nullptr);
fseek(file, 0, SEEK_END);
size = static_cast<size_t>(ftell(file));
fseek(file, 0, SEEK_SET);
auto* data = static_cast<uint8_t*>(memory_alloc(size));
REQUIRE(fread(data, 1, size, file) == size);
fclose(file);
return data;
}
BinFont* open_fixture_in_memory(const char* name) {
size_t size;
uint8_t* data = load_file(fixture(name), size);
BinFont* font = nullptr;
REQUIRE(binfont_open_memory(data, size, true, &font) == ERROR_NONE);
return font;
}
std::vector<uint8_t> decode(BinFont* font, const BinFontGlyph& glyph) {
std::vector<uint8_t> bitmap(static_cast<size_t>(glyph.width) * glyph.height);
REQUIRE(binfont_get_glyph_bitmap(font, &glyph, bitmap.data(), glyph.width) == ERROR_NONE);
return bitmap;
}
uint32_t sum(const std::vector<uint8_t>& bitmap) {
uint32_t total = 0;
for (uint8_t value : bitmap) {
total += value;
}
return total;
}
void check_same_glyph(const BinFontGlyph& a, const BinFontGlyph& b) {
CHECK_EQ(a.glyph_id, b.glyph_id);
CHECK_EQ(a.advance_x16, b.advance_x16);
CHECK_EQ(a.x, b.x);
CHECK_EQ(a.y, b.y);
CHECK_EQ(a.width, b.width);
CHECK_EQ(a.height, b.height);
}
} // namespace
TEST_CASE("binfont_open_file returns ERROR_NOT_FOUND for a missing file") {
BinFont* font = nullptr;
CHECK_EQ(binfont_open_file(fixture("missing.bin").c_str(), &font), ERROR_NOT_FOUND);
}
TEST_CASE("binfont_open_memory rejects data that is not a font") {
const uint8_t data[64] = { 1, 2, 3, 4 };
BinFont* font = nullptr;
CHECK_EQ(binfont_open_memory(data, sizeof(data), false, &font), ERROR_NOT_SUPPORTED);
}
TEST_CASE("binfont reads metrics, glyphs and bitmaps that match lv_font_conv's C output") {
BinFont* font = open_fixture_in_memory("text_kern_pairs.bin");
BinFontMetrics metrics;
binfont_get_metrics(font, &metrics);
CHECK_EQ(metrics.size, 20);
CHECK_EQ(metrics.line_height, 20);
CHECK_EQ(metrics.base_line, 5);
CHECK_EQ(metrics.ascent, 15);
CHECK_EQ(metrics.descent, -5);
CHECK_EQ(metrics.underline_position, 1);
CHECK_EQ(metrics.underline_thickness, 0);
CHECK_EQ(metrics.bpp, 4);
BinFontGlyph glyph;
REQUIRE(binfont_get_glyph(font, 'A', &glyph));
CHECK_EQ(glyph.glyph_id, 1);
CHECK_EQ(glyph.advance_x16, 195);
CHECK_EQ(glyph.x, 0);
CHECK_EQ(glyph.y, 0);
CHECK_EQ(glyph.width, 13);
CHECK_EQ(glyph.height, 14);
const auto bitmap = decode(font, glyph);
const std::vector<uint8_t> first_row = { 0, 0, 0, 0, 0, 238, 255, 17, 0, 0, 0, 0, 0 };
const std::vector<uint8_t> last_row = { 221, 255, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 0 };
CHECK(std::vector<uint8_t>(bitmap.begin(), bitmap.begin() + 13) == first_row);
CHECK(std::vector<uint8_t>(bitmap.end() - 13, bitmap.end()) == last_row);
CHECK_EQ(sum(bitmap), 13974);
REQUIRE(binfont_get_glyph(font, 'V', &glyph));
CHECK_EQ(glyph.glyph_id, 22);
REQUIRE(binfont_get_glyph(font, 'z', &glyph));
CHECK_EQ(glyph.glyph_id, 52);
CHECK_FALSE(binfont_get_glyph(font, '0', &glyph));
CHECK_FALSE(binfont_get_glyph(font, 0x5B, &glyph));
CHECK_FALSE(binfont_get_glyph(font, 0x10FFFF, &glyph));
binfont_close(font);
}
TEST_CASE("binfont kerning is the same for the pairs and the classes format") {
BinFont* pairs = open_fixture_in_memory("text_kern_pairs.bin");
BinFont* classes = open_fixture_in_memory("text_kern_classes.bin");
CHECK_EQ(binfont_get_kerning_x16(pairs, 1, 22), -10);
CHECK_EQ(binfont_get_kerning_x16(classes, 1, 22), -10);
int non_zero = 0;
for (uint32_t left = 1; left <= 52; left++) {
for (uint32_t right = 1; right <= 52; right++) {
const int32_t value = binfont_get_kerning_x16(pairs, left, right);
CHECK_EQ(value, binfont_get_kerning_x16(classes, left, right));
if (value != 0) {
non_zero++;
}
}
}
CHECK(non_zero > 0);
CHECK_EQ(binfont_get_kerning_x16(pairs, 1, 1000), 0);
CHECK_EQ(binfont_get_kerning_x16(classes, 1, 1000), 0);
binfont_close(pairs);
binfont_close(classes);
}
TEST_CASE("binfont decodes identical bitmaps for raw, RLE and RLE with prefilter") {
for (const char* bpp : { "2", "4" }) {
CAPTURE(bpp);
BinFont* raw = open_fixture_in_memory((std::string("icons_raw_") + bpp + ".bin").c_str());
BinFont* rle = open_fixture_in_memory((std::string("icons_rle_") + bpp + ".bin").c_str());
BinFont* prefiltered = open_fixture_in_memory((std::string("icons_rlepf_") + bpp + ".bin").c_str());
for (uint32_t codepoint : ICON_CODEPOINTS) {
CAPTURE(codepoint);
BinFontGlyph raw_glyph, rle_glyph, prefiltered_glyph;
REQUIRE(binfont_get_glyph(raw, codepoint, &raw_glyph));
REQUIRE(binfont_get_glyph(rle, codepoint, &rle_glyph));
REQUIRE(binfont_get_glyph(prefiltered, codepoint, &prefiltered_glyph));
check_same_glyph(raw_glyph, rle_glyph);
check_same_glyph(raw_glyph, prefiltered_glyph);
const auto raw_bitmap = decode(raw, raw_glyph);
CHECK(sum(raw_bitmap) > 0);
CHECK(decode(rle, rle_glyph) == raw_bitmap);
CHECK(decode(prefiltered, prefiltered_glyph) == raw_bitmap);
}
binfont_close(raw);
binfont_close(rle);
binfont_close(prefiltered);
}
}
TEST_CASE("binfont gives the same results when streaming from a file") {
BinFont* memory_font = open_fixture_in_memory("icons_rlepf_4.bin");
BinFont* file_font = nullptr;
REQUIRE(binfont_open_file_streaming(fixture("icons_rlepf_4.bin").c_str(), &file_font) == ERROR_NONE);
for (uint32_t codepoint : ICON_CODEPOINTS) {
BinFontGlyph memory_glyph, file_glyph;
REQUIRE(binfont_get_glyph(memory_font, codepoint, &memory_glyph));
REQUIRE(binfont_get_glyph(file_font, codepoint, &file_glyph));
check_same_glyph(memory_glyph, file_glyph);
CHECK(decode(memory_font, memory_glyph) == decode(file_font, file_glyph));
}
binfont_close(memory_font);
binfont_close(file_font);
}
TEST_CASE("binfont_open_file loads the font into memory") {
const std::string path = std::string(BINFONT_TEST_TEMP_DIR) + "/binfont_memory_test.bin";
size_t size;
uint8_t* data = load_file(fixture("icons_rlepf_4.bin"), size);
FILE* copy = fopen(path.c_str(), "wb");
REQUIRE(copy != nullptr);
REQUIRE(fwrite(data, 1, size, copy) == size);
fclose(copy);
memory_free(data);
BinFont* font = nullptr;
REQUIRE(binfont_open_file(path.c_str(), &font) == ERROR_NONE);
REQUIRE(remove(path.c_str()) == 0);
BinFontGlyph glyph;
CHECK(binfont_get_glyph(font, ICON_CODEPOINTS[0], &glyph));
CHECK(sum(decode(font, glyph)) > 0);
binfont_close(font);
}
TEST_CASE("binfont only keeps a streamed font file open during a session") {
// An open file stays readable after it's deleted, so deleting it shows whether it's kept open
const std::string path = std::string(BINFONT_TEST_TEMP_DIR) + "/binfont_session_test.bin";
size_t size;
uint8_t* data = load_file(fixture("icons_rlepf_4.bin"), size);
FILE* copy = fopen(path.c_str(), "wb");
REQUIRE(copy != nullptr);
REQUIRE(fwrite(data, 1, size, copy) == size);
fclose(copy);
memory_free(data);
BinFont* font = nullptr;
REQUIRE(binfont_open_file_streaming(path.c_str(), &font) == ERROR_NONE);
BinFontGlyph glyph;
REQUIRE(binfont_get_glyph(font, ICON_CODEPOINTS[0], &glyph));
REQUIRE(binfont_begin(font) == ERROR_NONE);
REQUIRE(binfont_begin(font) == ERROR_NONE);
REQUIRE(remove(path.c_str()) == 0);
binfont_end(font);
// Still open: one session remains
CHECK(binfont_get_glyph(font, ICON_CODEPOINTS[1], &glyph));
CHECK_FALSE(decode(font, glyph).empty());
binfont_end(font);
// Closed: the deleted file can't be opened again
CHECK_FALSE(binfont_get_glyph(font, ICON_CODEPOINTS[2], &glyph));
CHECK_EQ(binfont_begin(font), ERROR_NOT_FOUND);
binfont_close(font);
}
TEST_CASE("binfont_get_glyph_bitmap rejects a stride smaller than the glyph width") {
BinFont* font = open_fixture_in_memory("icons_raw_2.bin");
BinFontGlyph glyph;
REQUIRE(binfont_get_glyph(font, ICON_CODEPOINTS[0], &glyph));
std::vector<uint8_t> bitmap(static_cast<size_t>(glyph.width) * glyph.height);
CHECK_EQ(binfont_get_glyph_bitmap(font, &glyph, bitmap.data(), glyph.width - 1), ERROR_INVALID_ARGUMENT);
binfont_close(font);
}
TEST_CASE("binfont_generate rasterizes a TTF close to lv_font_conv") {
uint32_t codepoints[] = { 0xE8B8, 0xE5C3, 0x41, 0xE1A7, 0xE2C7, 0xE63E, 0xE5C3 }; // unsorted, duplicate and missing entries
const BinFontGeneratorConfig config = {
.ttf_path = BINFONT_TEST_ICON_TTF,
.size = 24,
.bpp = 4,
.codepoints = codepoints,
.codepoint_count = sizeof(codepoints) / sizeof(codepoints[0]),
};
uint8_t* data = nullptr;
size_t size = 0;
REQUIRE(binfont_generate(&config, &data, &size) == ERROR_NONE);
BinFont* generated = nullptr;
REQUIRE(binfont_open_memory(data, size, true, &generated) == ERROR_NONE);
BinFont* reference = open_fixture_in_memory("icons_raw_4.bin");
BinFontMetrics generated_metrics, reference_metrics;
binfont_get_metrics(generated, &generated_metrics);
binfont_get_metrics(reference, &reference_metrics);
CHECK_EQ(generated_metrics.size, 24);
CHECK_EQ(generated_metrics.bpp, 4);
CHECK_EQ(generated_metrics.ascent, reference_metrics.ascent);
CHECK_EQ(generated_metrics.descent, reference_metrics.descent);
BinFontGlyph glyph;
CHECK_FALSE(binfont_get_glyph(generated, 0x41, &glyph));
for (uint32_t codepoint : ICON_CODEPOINTS) {
CAPTURE(codepoint);
BinFontGlyph generated_glyph, reference_glyph;
REQUIRE(binfont_get_glyph(generated, codepoint, &generated_glyph));
REQUIRE(binfont_get_glyph(reference, codepoint, &reference_glyph));
CHECK(std::abs(static_cast<int>(generated_glyph.advance_x16) - static_cast<int>(reference_glyph.advance_x16)) <= 16);
CHECK(std::abs(generated_glyph.x - reference_glyph.x) <= 1);
CHECK(std::abs(generated_glyph.y - reference_glyph.y) <= 1);
CHECK(std::abs(generated_glyph.width - reference_glyph.width) <= 1);
CHECK(std::abs(generated_glyph.height - reference_glyph.height) <= 1);
const auto generated_sum = static_cast<double>(sum(decode(generated, generated_glyph)));
const auto reference_sum = static_cast<double>(sum(decode(reference, reference_glyph)));
CHECK(generated_sum > reference_sum * 0.9);
CHECK(generated_sum < reference_sum * 1.1);
}
binfont_close(generated);
binfont_close(reference);
}
TEST_CASE("binfont_generate fails for a missing TTF") {
const uint32_t codepoint = 0xE5C3;
const BinFontGeneratorConfig config = {
.ttf_path = BINFONT_TEST_FIXTURES_DIR "/missing.ttf",
.size = 24,
.bpp = 2,
.codepoints = &codepoint,
.codepoint_count = 1,
};
uint8_t* data = nullptr;
size_t size = 0;
CHECK_EQ(binfont_generate(&config, &data, &size), ERROR_NOT_FOUND);
}
TEST_CASE("binfont draws glyphs and text into a PixelBuffer") {
BinFont* font = open_fixture_in_memory("text_kern_pairs.bin");
PixelBuffer* buffer = pixel_buffer_create(DISPLAY_COLOR_FORMAT_RGB565, 64, 24);
REQUIRE(buffer != nullptr);
pixel_buffer_clear(buffer);
const int advance = binfont_draw_glyph_rgb565(buffer, 0, 18, font, 'A', 0xFFFF, PIXEL_BUFFER_CONVERSION_EXACT_BLACK);
CHECK_EQ(advance, (195 + 8) >> 4);
// Top of 'A' (row 0 of the glyph, column 6 is fully opaque) sits 14 rows above the baseline
CHECK_EQ(pixel_buffer_get_pixel_rgb565(buffer, 6, 18 - 14), 0xFFFF);
CHECK_EQ(pixel_buffer_get_pixel_rgb565(buffer, 0, 0), 0x0000);
CHECK_EQ(binfont_draw_glyph_rgb565(buffer, 0, 18, font, '0', 0xFFFF, PIXEL_BUFFER_CONVERSION_EXACT_BLACK), 0);
// "AV" is kerned: 195 - 10 + V's advance
BinFontGlyph v;
REQUIRE(binfont_get_glyph(font, 'V', &v));
pixel_buffer_clear(buffer);
const int width = binfont_draw_text_rgb565(buffer, 0, 18, font, "AV", 0xFFFF, PIXEL_BUFFER_CONVERSION_EXACT_BLACK);
CHECK_EQ(width, static_cast<int>((195 - 10 + v.advance_x16 + 8) >> 4));
pixel_buffer_free(buffer);
binfont_close(font);
}

View File

@ -0,0 +1,64 @@
#define DOCTEST_CONFIG_IMPLEMENT
#include "doctest.h"
#include <cstdio>
#include <cstdlib>
#include "FreeRTOS.h"
#include "task.h"
typedef struct {
int argc;
char** argv;
int result;
} TestTaskData;
void test_task(void* parameter) {
auto* data = (TestTaskData*)parameter;
doctest::Context context;
context.applyCommandLine(data->argc, data->argv);
// overrides
context.setOption("no-breaks", true); // don't break in the debugger when assertions fail
data->result = context.run();
vTaskEndScheduler();
vTaskDelete(nullptr);
}
int main(int argc, char** argv) {
TestTaskData data = {
.argc = argc,
.argv = argv,
.result = 0
};
BaseType_t task_result = xTaskCreate(
test_task,
"test_task",
8192,
&data,
1,
nullptr
);
if (task_result != pdPASS) {
return 1;
}
vTaskStartScheduler();
return data.result;
}
// NOTE: This is normally provided by the platform kernel module, but that's not loaded for binfont-module
extern "C" {
// Required for FreeRTOS
void vAssertCalled(unsigned long line, const char* const file) {
std::fprintf(stderr, "assert failed at %s:%lu\n", file, line);
std::abort();
}
}

View File

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.20)
include("${CMAKE_CURRENT_LIST_DIR}/../../Buildscripts/module.cmake")
file(GLOB_RECURSE SOURCE_FILES "source/*.c*")
list(APPEND REQUIRES_LIST
TactilityKernel
)
tactility_add_module(lodepng-module
SRCS ${SOURCE_FILES}
INCLUDE_DIRS include/
REQUIRES ${REQUIRES_LIST}
)

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,25 @@
/*
LodePNG version 20261001
Copyright (c) 2005-2026 Lode Vandevenne
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/

View File

@ -0,0 +1,10 @@
# lodepng-module
PNG decoding and encoding with [LodePNG](https://github.com/lvandeve/lodepng), usable with and without LVGL.
Include `<lodepng/lodepng.h>` and release decoded or encoded data with `lodepng_free()`.
## License
This module is licensed under the [Apache v2.0](LICENSE-Apache-2.0.md) license.
LodePNG is licensed under the [zlib](LICENSE-lodepng.txt) license.

View File

@ -0,0 +1,25 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
// The C++ wrapper is not compiled: callers use the C API from C and C++ alike
#define LODEPNG_NO_COMPILE_CPP
// Allocations go through the kernel's memory API (see lodepng_malloc() below)
#define LODEPNG_NO_COMPILE_ALLOCATORS
#ifdef __cplusplus
extern "C" {
#endif
#include <lodepng/lodepng_upstream.h>
/** Allocates memory, preferring external memory (PSRAM) */
void* lodepng_malloc(size_t size);
void* lodepng_realloc(void* ptr, size_t new_size);
/** Releases memory from lodepng_malloc(), including images returned by the decode and encode functions */
void lodepng_free(void* ptr);
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <tactility/module.h>
#ifdef __cplusplus
extern "C" {
#endif
extern struct Module lodepng_module;
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,22 @@
// SPDX-License-Identifier: Apache-2.0
#include <lodepng/lodepng.h>
#include <tactility/memory.h>
static const struct MemoryPolicy EXTERNAL_PREFERRED = {
.required = 0,
.desired = MEMORY_CAPABILITY_EXTERNAL,
.alignment = 0,
};
void* lodepng_malloc(size_t size) {
return memory_alloc_with_policy(size, &EXTERNAL_PREFERRED);
}
void* lodepng_realloc(void* ptr, size_t new_size) {
return memory_realloc_with_policy(ptr, new_size, &EXTERNAL_PREFERRED);
}
void lodepng_free(void* ptr) {
memory_free(ptr);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,37 @@
// SPDX-License-Identifier: Apache-2.0
#include <lodepng/lodepng.h>
#include <lodepng/module.h>
static const struct ModuleSymbol SYMBOLS[] = {
// decode
DEFINE_MODULE_SYMBOL(lodepng_decode_memory),
DEFINE_MODULE_SYMBOL(lodepng_decode32),
DEFINE_MODULE_SYMBOL(lodepng_decode24),
DEFINE_MODULE_SYMBOL(lodepng_decode_file),
DEFINE_MODULE_SYMBOL(lodepng_decode32_file),
DEFINE_MODULE_SYMBOL(lodepng_decode24_file),
// encode
DEFINE_MODULE_SYMBOL(lodepng_encode_memory),
DEFINE_MODULE_SYMBOL(lodepng_encode32),
DEFINE_MODULE_SYMBOL(lodepng_encode24),
DEFINE_MODULE_SYMBOL(lodepng_encode_file),
DEFINE_MODULE_SYMBOL(lodepng_encode32_file),
DEFINE_MODULE_SYMBOL(lodepng_encode24_file),
// utilities
DEFINE_MODULE_SYMBOL(lodepng_error_text),
DEFINE_MODULE_SYMBOL(lodepng_load_file),
DEFINE_MODULE_SYMBOL(lodepng_save_file),
DEFINE_MODULE_SYMBOL(lodepng_malloc),
DEFINE_MODULE_SYMBOL(lodepng_realloc),
DEFINE_MODULE_SYMBOL(lodepng_free),
MODULE_SYMBOL_TERMINATOR,
};
struct Module lodepng_module = {
.name = "lodepng",
.start = NULL,
.stop = NULL,
.drivers = NULL,
.symbols = SYMBOLS,
.internal = NULL,
};

View File

@ -0,0 +1,20 @@
project(LodePngModuleTests)
enable_language(C CXX ASM)
file(GLOB_RECURSE TEST_SOURCES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/source/*.cpp)
add_executable(LodePngModuleTests EXCLUDE_FROM_ALL ${TEST_SOURCES})
target_include_directories(LodePngModuleTests PRIVATE ${DOCTESTINC})
target_compile_definitions(LodePngModuleTests PRIVATE
"LODEPNG_TEST_LOGO=\"${CMAKE_SOURCE_DIR}/Data/system/app/Boot/assets/logo.png\""
)
add_test(NAME LodePngModuleTests COMMAND LodePngModuleTests)
target_link_libraries(LodePngModuleTests PUBLIC
lodepng-module
TactilityKernel
freertos_kernel
)

View File

@ -0,0 +1,47 @@
#include "doctest.h"
#include <lodepng/lodepng.h>
#include <cstring>
TEST_CASE("lodepng decodes a PNG file") {
unsigned char* image = nullptr;
unsigned width = 0;
unsigned height = 0;
REQUIRE_EQ(lodepng_decode32_file(&image, &width, &height, LODEPNG_TEST_LOGO), 0);
CHECK_EQ(width, 80);
CHECK_EQ(height, 103);
lodepng_free(image);
}
TEST_CASE("lodepng returns an error for a missing file") {
unsigned char* image = nullptr;
unsigned width = 0;
unsigned height = 0;
CHECK_NE(lodepng_decode32_file(&image, &width, &height, "missing.png"), 0);
lodepng_free(image);
}
TEST_CASE("lodepng encodes and decodes an image without changes") {
constexpr unsigned width = 3;
constexpr unsigned height = 2;
const unsigned char pixels[width * height * 4] = {
255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255,
0, 0, 0, 0, 255, 255, 255, 128, 10, 20, 30, 40,
};
unsigned char* png = nullptr;
size_t png_size = 0;
REQUIRE_EQ(lodepng_encode32(&png, &png_size, pixels, width, height), 0);
unsigned char* decoded = nullptr;
unsigned decoded_width = 0;
unsigned decoded_height = 0;
REQUIRE_EQ(lodepng_decode32(&decoded, &decoded_width, &decoded_height, png, png_size), 0);
CHECK_EQ(decoded_width, width);
CHECK_EQ(decoded_height, height);
CHECK_EQ(memcmp(decoded, pixels, sizeof(pixels)), 0);
lodepng_free(png);
lodepng_free(decoded);
}

View File

@ -0,0 +1,64 @@
#define DOCTEST_CONFIG_IMPLEMENT
#include "doctest.h"
#include <cstdio>
#include <cstdlib>
#include "FreeRTOS.h"
#include "task.h"
typedef struct {
int argc;
char** argv;
int result;
} TestTaskData;
void test_task(void* parameter) {
auto* data = (TestTaskData*)parameter;
doctest::Context context;
context.applyCommandLine(data->argc, data->argv);
// overrides
context.setOption("no-breaks", true); // don't break in the debugger when assertions fail
data->result = context.run();
vTaskEndScheduler();
vTaskDelete(nullptr);
}
int main(int argc, char** argv) {
TestTaskData data = {
.argc = argc,
.argv = argv,
.result = 0
};
BaseType_t task_result = xTaskCreate(
test_task,
"test_task",
8192,
&data,
1,
nullptr
);
if (task_result != pdPASS) {
return 1;
}
vTaskStartScheduler();
return data.result;
}
// NOTE: This is normally provided by the platform kernel module, but that's not loaded for lodepng-module
extern "C" {
// Required for FreeRTOS
void vAssertCalled(unsigned long line, const char* const file) {
std::fprintf(stderr, "assert failed at %s:%lu\n", file, line);
std::abort();
}
}

View File

@ -70,14 +70,11 @@ endif ()
# Regular source files
file(GLOB_RECURSE SOURCE_FILES "source/*.c*")
# Font source files
list(APPEND SOURCE_FILES "source-fonts/material_symbols_statusbar_${statusbar_symbol_size}.c")
list(APPEND SOURCE_FILES "source-fonts/material_symbols_launcher_${launcher_symbol_size}.c")
list(APPEND SOURCE_FILES "source-fonts/material_symbols_shared_${shared_symbol_size}.c")
list(APPEND SOURCE_FILES "source-fonts/material_symbols_shared_${shared_symbol_2x_size}.c")
list(APPEND REQUIRES_LIST
TactilityKernel
binfont-module
lodepng-module
lvgl
)
@ -118,13 +115,9 @@ target_compile_definitions(${MODULE_NAME} PUBLIC
"-DTT_LVGL_TEXT_FONT_LARGE_SYMBOL=lv_font_montserrat_${font_size_large}"
# Icon fonts
"-DTT_LVGL_STATUSBAR_FONT_ICON_SIZE=${statusbar_symbol_size}"
"-DTT_LVGL_STATUSBAR_FONT_ICON_SYMBOL=material_symbols_statusbar_${statusbar_symbol_size}"
"-DTT_LVGL_LAUNCHER_FONT_ICON_SIZE=${launcher_symbol_size}"
"-DTT_LVGL_LAUNCHER_FONT_ICON_SYMBOL=material_symbols_launcher_${launcher_symbol_size}"
"-DTT_LVGL_SHARED_FONT_ICON_SIZE=${shared_symbol_size}"
"-DTT_LVGL_SHARED_FONT_ICON_SYMBOL=material_symbols_shared_${shared_symbol_size}"
"-DTT_LVGL_SHARED_FONT_ICON_2X_SIZE=${shared_symbol_2x_size}"
"-DTT_LVGL_SHARED_FONT_ICON_2X_SYMBOL=material_symbols_shared_${shared_symbol_2x_size}"
# UiDensity
"-DTT_LVGL_UI_DENSITY=${ui_density_variable}"
)

View File

@ -35,7 +35,9 @@ Font sizes and symbols are configurable:
- **On ESP32 (IDF)**: Sizes can be updated via `menuconfig` or by editing `sdkconfig`. Look for `CONFIG_TT_LVGL_FONT_SIZE_*` and `CONFIG_TT_LVGL_*_ICON_SIZE` parameters.
- **On Simulator/POSIX**: Default sizes are defined in `Modules/lvgl-module/CMakeLists.txt`.
If you change an icon font size, ensure that a corresponding C file exists in `source-fonts/` (e.g., `material_symbols_shared_24.c`). These files are generated from TTF/OTF fonts using the LVGL font converter.
Icon fonts are rasterized on device at startup from `Data/system/fonts/MaterialSymbolsRounded.ttf` (a subset with only the used icons) and cached as `.bin` files in the data path, so any icon size works.
The icons per font are listed by name and resolved through `Data/system/fonts/MaterialSymbolsRounded.codepoints`.
To add an icon, add its name to `generate-icons.py` and run it (requires `pip install fonttools`). This regenerates the TTF subset, the codepoints file and the name lists.
## Custom memory allocator

View File

@ -1,6 +1,22 @@
#!/usr/bin/env python3
"""
Generates the Material Symbols icon resources:
- include/lvgl/icons/*.h: UTF-8 string defines per icon
- include/lvgl/icons/names.h and source/icon_names.c: icon name lists per icon font
- Data/system/fonts/MaterialSymbolsRounded.ttf: TTF subset with only the used icons
- Data/system/fonts/MaterialSymbolsRounded.codepoints: name to codepoint map of the used icons
The icon fonts are rasterized from the TTF subset on device at startup.
Requires the fonttools package: pip install fonttools
"""
import os
import urllib.request
import zlib
from fontTools import subset
from fontTools.ttLib import TTFont
from fontTools.varLib import instancer
def download_file(url: str, filename: str):
if not os.path.exists(filename):
@ -9,15 +25,6 @@ def download_file(url: str, filename: str):
else:
print(f"{filename} already exists, skipping download.")
def generate(bpp, size, font_file: str, symbols: list, output: str):
output_file_name = f"{output}_{size}.c"
output_path = os.path.join("source-fonts", output_file_name)
print(f"Generating {output_file_name}")
cmd = "lv_font_conv --no-compress --no-prefilter --bpp {} --size {} --font {} -r {} --format lvgl -o {} --force-fast-kern-format".format(bpp, size, font_file, ",".join(symbols), output_path)
ret = os.system(cmd)
if ret != 0:
raise RuntimeError(f"Font generation failed for {output_file_name} (exit code {ret})")
def read_code_points_map(file_path: str):
codepoints = {}
with open(file_path, 'r') as f:
@ -40,9 +47,62 @@ def get_code_points(codepoints, names: list) -> list:
result.append(f"0x{codepoints[safe_name].upper()}")
return result
def generate_icon_fonts(font_file, font_sizes, symbols, output):
for size in font_sizes:
generate(2, size, font_file, symbols, output)
def generate_subset_ttf(font_file: str, codepoints: list, output_path: str) -> bytes:
print(f"Generating {output_path}")
font = TTFont(font_file, recalcTimestamp=False)
if "fvar" in font:
# Pin all axes to their defaults, which are the outlines lv_font_conv used to render
font = instancer.instantiateVariableFont(font, {axis.axisTag: None for axis in font["fvar"].axes})
options = subset.Options()
options.layout_features = []
options.drop_tables += ["GSUB", "GPOS", "GDEF"]
options.hinting = False
options.notdef_outline = True
subsetter = subset.Subsetter(options)
subsetter.populate(unicodes=codepoints)
subsetter.subset(font)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
font.save(output_path)
with open(output_path, "rb") as f:
return f.read()
def generate_codepoints_file(codepoint_map: dict, names: list, output_path: str) -> bytes:
print(f"Generating {output_path}")
content = "".join(f"{name} {codepoint_map[name]}\n" for name in names)
with open(output_path, "w") as f:
f.write(content)
return content.encode("utf-8")
def generate_icon_name_lists(icon_sets: list, version_input: bytes):
version = zlib.crc32(version_input + repr(icon_sets).encode("utf-8")) & 0xFFFFFFFF
header_path = os.path.join("include", "lvgl", "icons", "names.h")
print(f"Generating {header_path}")
with open(header_path, "w") as f:
f.write("// SPDX-License-Identifier: Apache-2.0\n\n")
f.write("#pragma once\n\n")
f.write("#include <stddef.h>\n\n")
f.write("#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n")
f.write("/** Changes whenever the icon TTF subset, its codepoints file or the icon name lists change */\n")
f.write(f"#define LVGL_ICON_FONT_VERSION 0x{version:08X}u\n\n")
f.write("// Icon names per icon font, resolved through the .codepoints file next to the TTF\n")
for name, _ in icon_sets:
f.write(f"extern const char* const lvgl_icon_{name}_names[];\n")
f.write(f"extern const size_t lvgl_icon_{name}_name_count;\n\n")
f.write("#ifdef __cplusplus\n}\n#endif\n")
source_path = os.path.join("source", "icon_names.c")
print(f"Generating {source_path}")
with open(source_path, "w") as f:
f.write("// SPDX-License-Identifier: Apache-2.0\n")
f.write("// Generated by generate-icons.py\n\n")
f.write("#include <lvgl/icons/names.h>\n\n")
for name, names in icon_sets:
f.write(f"const char* const lvgl_icon_{name}_names[] = {{\n")
for icon_name in names:
f.write(f" \"{icon_name.lower()}\",\n")
f.write("};\n\n")
f.write(f"const size_t lvgl_icon_{name}_name_count = sizeof(lvgl_icon_{name}_names) / sizeof(lvgl_icon_{name}_names[0]);\n\n")
def generate_icon_names(codepoint_map: dict, codepoint_names: list, variable_name: str):
filename = f"{variable_name}.h"
@ -161,33 +221,6 @@ launcher_symbol_code_point_names = [
"settings"
]
shared_symbol_sizes = [
12,
16, # T-Deck reference, with montserrat 14 in lv_list as icon with text
20,
24,
32,
40,
48,
64
]
statusbar_symbol_sizes = [
12,
16, # T-Deck reference
20,
30
]
launcher_symbol_sizes = [
30,
36, # T-Deck reference
42,
48,
64,
72
]
# Resolve file path relative to this script so it can be executed from any CWD
base_dir = os.path.dirname(__file__)
if base_dir:
@ -198,6 +231,8 @@ ttf_url = "https://github.com/google/material-design-icons/raw/refs/heads/master
codepoints_filename = "MaterialSymbolsRounded.codepoints"
ttf_filename = "MaterialSymbolsRounded.ttf"
subset_ttf_path = os.path.join("..", "..", "Data", "system", "fonts", "MaterialSymbolsRounded.ttf")
subset_codepoints_path = os.path.join("..", "..", "Data", "system", "fonts", "MaterialSymbolsRounded.codepoints")
download_file(codepoints_url, codepoints_filename)
download_file(ttf_url, ttf_filename)
@ -205,18 +240,17 @@ download_file(ttf_url, ttf_filename)
codepoints_map_path = codepoints_filename
codepoints_map = read_code_points_map(codepoints_map_path)
# Shared symbols
shared_symbol_code_points = get_code_points(codepoints_map, shared_symbol_code_point_names)
generate_icon_fonts(ttf_filename, shared_symbol_sizes, shared_symbol_code_points, "material_symbols_shared")
generate_icon_names(codepoints_map, shared_symbol_code_point_names, "shared")
icon_sets = [
("shared", shared_symbol_code_point_names),
("statusbar", statusbar_symbol_code_point_names),
("launcher", launcher_symbol_code_point_names),
]
# Statusbar symbols
statusbar_symbol_code_points = get_code_points(codepoints_map, statusbar_symbol_code_point_names)
generate_icon_fonts(ttf_filename, statusbar_symbol_sizes, statusbar_symbol_code_points, "material_symbols_statusbar")
generate_icon_names(codepoints_map, statusbar_symbol_code_point_names, "statusbar")
# Launcher symbols
launcher_symbol_code_points = get_code_points(codepoints_map, launcher_symbol_code_point_names)
generate_icon_fonts(ttf_filename, launcher_symbol_sizes, launcher_symbol_code_points, "material_symbols_launcher")
generate_icon_names(codepoints_map, launcher_symbol_code_point_names, "launcher")
for variable_name, names in icon_sets:
generate_icon_names(codepoints_map, names, variable_name)
all_names = sorted({name.lower() for _, names in icon_sets for name in names})
all_codepoints = [int(cp, 16) for cp in get_code_points(codepoints_map, all_names)]
subset_data = generate_subset_ttf(ttf_filename, all_codepoints, subset_ttf_path)
codepoints_data = generate_codepoints_file(codepoints_map, all_names, subset_codepoints_path)
generate_icon_name_lists(icon_sets, subset_data + codepoints_data)

View File

@ -0,0 +1,24 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
struct BinFont;
/**
* @brief Creates an LVGL font that renders glyphs from a BinFont.
* @param[in] font the source font, which must outlive the returned font
* @return the LVGL font, or NULL when memory allocation failed
*/
lv_font_t* lvgl_binfont_create(struct BinFont* font);
/** Destroys a font from lvgl_binfont_create(). The BinFont is not closed. */
void lvgl_binfont_destroy(lv_font_t* font);
#ifdef __cplusplus
}
#endif

View File

@ -14,6 +14,19 @@ enum LvglFontSize {
FONT_SIZE_LARGE,
};
enum LvglIconFont {
LVGL_ICON_FONT_STATUSBAR,
LVGL_ICON_FONT_LAUNCHER,
LVGL_ICON_FONT_SHARED,
LVGL_ICON_FONT_SHARED_2X,
};
/**
* @brief Sets the font that is returned by the getter of an icon font.
* Until an icon font is set, its getter returns the default text font.
*/
void lvgl_set_icon_font(enum LvglIconFont icon_font, const lv_font_t* font);
const lv_font_t* lvgl_get_shared_icon_font(void);
uint32_t lvgl_get_shared_icon_font_height(void);

View File

@ -0,0 +1,26 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Changes whenever the icon TTF subset, its codepoints file or the icon name lists change */
#define LVGL_ICON_FONT_VERSION 0x977A6A66u
// Icon names per icon font, resolved through the .codepoints file next to the TTF
extern const char* const lvgl_icon_shared_names[];
extern const size_t lvgl_icon_shared_name_count;
extern const char* const lvgl_icon_statusbar_names[];
extern const size_t lvgl_icon_statusbar_name_count;
extern const char* const lvgl_icon_launcher_names[];
extern const size_t lvgl_icon_launcher_name_count;
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,5 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
/** Registers the PNG image decoder with LVGL. Must be called after lv_init(). */
void lvgl_png_decoder_init(void);

View File

@ -1,176 +0,0 @@
/*******************************************************************************
* Size: 30 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 30 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_30.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_30
#define MATERIAL_SYMBOLS_LAUNCHER_30 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_30
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x7e, 0xaa, 0xaf,
0xea, 0xaa, 0xa9, 0xb, 0xc0, 0x0, 0xbf, 0xff,
0xff, 0xfc, 0xbc, 0x0, 0x2, 0xff, 0xff, 0xff,
0xdb, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xbc,
0x0, 0x0, 0x0, 0x0, 0x3, 0xeb, 0xc0, 0x0,
0x0, 0x0, 0x0, 0x3e, 0xbc, 0x0, 0x0, 0x0,
0x0, 0x3, 0xeb, 0xc0, 0x0, 0x0, 0x0, 0x0,
0x3e, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xeb,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xbc, 0x0,
0x0, 0x0, 0x0, 0x3, 0xeb, 0xc0, 0x0, 0x0,
0x0, 0x0, 0x3e, 0xbc, 0x0, 0x0, 0x0, 0x0,
0x3, 0xeb, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e,
0xbc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe7, 0xea,
0xaa, 0xaa, 0xaa, 0xaa, 0xbd, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf4,
/* U+E5C3 "" */
0x2e, 0x0, 0xbd, 0x1, 0xf4, 0xbf, 0x81, 0xff,
0x3, 0xfd, 0xff, 0xc2, 0xff, 0x7, 0xfe, 0xbf,
0x81, 0xff, 0x3, 0xfd, 0x2e, 0x0, 0xbd, 0x1,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7f, 0x40, 0xfe, 0x2, 0xf8, 0xff, 0xc2, 0xff,
0x7, 0xfd, 0xff, 0xc2, 0xff, 0x7, 0xfd, 0xbf,
0x81, 0xff, 0x3, 0xfc, 0x19, 0x0, 0x68, 0x0,
0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2e, 0x0, 0xbd, 0x1, 0xf4,
0xbf, 0x81, 0xff, 0x3, 0xfd, 0xff, 0xc2, 0xff,
0x7, 0xfe, 0xbf, 0x81, 0xff, 0x3, 0xfd, 0x2e,
0x0, 0xbd, 0x1, 0xf4,
/* U+E8B8 "" */
0x0, 0x0, 0x1, 0xa4, 0x0, 0x0, 0x0, 0x0,
0x1, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f,
0xff, 0x80, 0x0, 0x0, 0x0, 0x3, 0xe0, 0xbc,
0x0, 0x0, 0x0, 0x90, 0x3e, 0xb, 0xc0, 0x60,
0x0, 0x3f, 0xff, 0xd0, 0x7f, 0xff, 0xc0, 0xb,
0xff, 0xf8, 0x2, 0xff, 0xfe, 0x1, 0xf8, 0xbc,
0x0, 0x3, 0xe2, 0xf4, 0x3f, 0x0, 0x0, 0x50,
0x0, 0xf, 0xc3, 0xf4, 0x0, 0xbf, 0xe0, 0x1,
0xfc, 0x1f, 0xe0, 0x2f, 0xff, 0x80, 0xbf, 0x40,
0x7f, 0x43, 0xff, 0xfc, 0x1f, 0xd0, 0x1, 0xf0,
0x7f, 0xff, 0xd0, 0xf4, 0x0, 0x1f, 0x7, 0xff,
0xfd, 0xf, 0x40, 0x7, 0xf4, 0x3f, 0xff, 0xc1,
0xfd, 0x1, 0xfe, 0x2, 0xff, 0xf8, 0xb, 0xf4,
0x3f, 0x40, 0xb, 0xfe, 0x0, 0x1f, 0xc3, 0xf0,
0x0, 0x5, 0x0, 0x0, 0xf8, 0x1f, 0x8b, 0xc0,
0x0, 0x3e, 0x2f, 0x40, 0xbf, 0xff, 0x80, 0x2f,
0xff, 0xe0, 0x3, 0xff, 0xfd, 0x7, 0xff, 0xfc,
0x0, 0x9, 0x3, 0xe0, 0xbc, 0xa, 0x0, 0x0,
0x0, 0x3e, 0xb, 0xc0, 0x0, 0x0, 0x0, 0x2,
0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff,
0x40, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0,
0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 480, .box_w = 26, .box_h = 20, .ofs_x = 2, .ofs_y = 5},
{.bitmap_index = 130, .adv_w = 480, .box_w = 20, .box_h = 20, .ofs_x = 5, .ofs_y = 5},
{.bitmap_index = 230, .adv_w = 480, .box_w = 26, .box_h = 26, .ofs_x = 2, .ofs_y = 2}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_30 = {
#else
lv_font_t material_symbols_launcher_30 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 26, /*The maximum line height required by the font*/
.base_line = -2, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_30*/

View File

@ -1,194 +0,0 @@
/*******************************************************************************
* Size: 36 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 36 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_36.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_36
#define MATERIAL_SYMBOLS_LAUNCHER_36 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_36
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xb,
0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xc0,
0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0x0,
0x0, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xc0, 0x0,
0x2, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3,
0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f,
0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8,
/* U+E5C3 "" */
0x2f, 0x80, 0xb, 0xe0, 0x2, 0xf8, 0xbf, 0xe0,
0x2f, 0xf8, 0xb, 0xfe, 0xff, 0xf0, 0x3f, 0xfc,
0xf, 0xff, 0xff, 0xf0, 0x3f, 0xfc, 0xf, 0xff,
0xbf, 0xe0, 0x2f, 0xf8, 0xb, 0xfe, 0x2f, 0x80,
0xb, 0xe0, 0x2, 0xf8, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x80,
0xb, 0xe0, 0x2, 0xf8, 0xbf, 0xe0, 0x2f, 0xf8,
0xb, 0xfe, 0xff, 0xf0, 0x3f, 0xfc, 0xf, 0xff,
0xff, 0xf0, 0x3f, 0xfc, 0xf, 0xff, 0xbf, 0xe0,
0x2f, 0xf8, 0xb, 0xfe, 0x2f, 0x80, 0xb, 0xe0,
0x2, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2f, 0x80, 0xb, 0xe0,
0x2, 0xf8, 0xbf, 0xe0, 0x2f, 0xf8, 0xb, 0xfe,
0xff, 0xf0, 0x3f, 0xfc, 0xf, 0xff, 0xff, 0xf0,
0x3f, 0xfc, 0xf, 0xff, 0xbf, 0xe0, 0x2f, 0xf8,
0xb, 0xfe, 0x2f, 0x80, 0xb, 0xe0, 0x2, 0xf8,
/* U+E8B8 "" */
0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0,
0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0,
0x0, 0xbd, 0x7, 0xe0, 0x0, 0x0, 0x0, 0x10,
0xb, 0xd0, 0x7e, 0x0, 0x40, 0x0, 0x2f, 0xe7,
0xfc, 0x3, 0xfd, 0xbf, 0x80, 0x7, 0xff, 0xff,
0xc0, 0x3f, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xe0,
0x0, 0xbf, 0xff, 0xf0, 0x2f, 0xc2, 0xf0, 0x0,
0x0, 0xf8, 0x3f, 0x83, 0xf4, 0x0, 0x0, 0x0,
0x0, 0x1, 0xfc, 0x3f, 0x40, 0x0, 0xbf, 0xe0,
0x0, 0xf, 0xc3, 0xfe, 0x0, 0x3f, 0xff, 0xc0,
0x7, 0xfc, 0xf, 0xfc, 0xb, 0xff, 0xfe, 0x2,
0xff, 0x0, 0x2f, 0xc0, 0xff, 0xff, 0xf0, 0x3f,
0xc0, 0x0, 0xfc, 0xf, 0xff, 0xff, 0x43, 0xf4,
0x0, 0xf, 0xc0, 0xff, 0xff, 0xf4, 0x3f, 0x0,
0x2, 0xfc, 0xf, 0xff, 0xff, 0x3, 0xf8, 0x0,
0xff, 0x80, 0xbf, 0xff, 0xe0, 0x2f, 0xf0, 0x3f,
0xd0, 0x3, 0xff, 0xfc, 0x0, 0x7f, 0xc3, 0xf4,
0x0, 0xb, 0xfe, 0x0, 0x0, 0xfc, 0x3f, 0x40,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xc2, 0xfc, 0x2f,
0x0, 0x0, 0xf, 0x83, 0xf8, 0xf, 0xff, 0xfe,
0x0, 0xb, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xfc,
0x3, 0xff, 0xff, 0xd0, 0x2, 0xfe, 0x7f, 0xc0,
0x3f, 0xdb, 0xf8, 0x0, 0x5, 0x0, 0xbd, 0x7,
0xe0, 0x4, 0x0, 0x0, 0x0, 0xb, 0xd0, 0x7e,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0,
0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 576, .box_w = 30, .box_h = 24, .ofs_x = 3, .ofs_y = 6},
{.bitmap_index = 180, .adv_w = 576, .box_w = 24, .box_h = 24, .ofs_x = 6, .ofs_y = 6},
{.bitmap_index = 324, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = 3}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_36 = {
#else
lv_font_t material_symbols_launcher_36 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 30, /*The maximum line height required by the font*/
.base_line = -3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_36*/

View File

@ -1,220 +0,0 @@
/*******************************************************************************
* Size: 42 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 42 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_42.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_42
#define MATERIAL_SYMBOLS_LAUNCHER_42 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_42
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0xb, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x0,
0x0, 0x0, 0x0, 0x7f, 0xaa, 0xaa, 0xbf, 0xfa,
0xaa, 0xaa, 0xaa, 0x40, 0xbf, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xf4, 0xbf, 0x0, 0x0,
0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0x0,
0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbf,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe,
0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe,
0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xbf,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe,
0x7f, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xfd, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfc, 0xb, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe0,
/* U+E5C3 "" */
0x1f, 0xd0, 0x0, 0xbe, 0x0, 0xb, 0xe0, 0x7f,
0xf4, 0x3, 0xff, 0x80, 0x3f, 0xfc, 0xff, 0xfc,
0xb, 0xff, 0xc0, 0x7f, 0xfd, 0xff, 0xfc, 0xb,
0xff, 0xd0, 0x7f, 0xfe, 0xff, 0xfc, 0xb, 0xff,
0xc0, 0x7f, 0xfd, 0x7f, 0xf4, 0x3, 0xff, 0x80,
0x3f, 0xfc, 0x1f, 0xd0, 0x0, 0xbe, 0x0, 0xb,
0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, 0x1,
0xff, 0x0, 0xf, 0xf4, 0xbf, 0xf8, 0x3, 0xff,
0xc0, 0x3f, 0xfc, 0xff, 0xfc, 0xb, 0xff, 0xc0,
0x7f, 0xfd, 0xff, 0xfc, 0xb, 0xff, 0xc0, 0x7f,
0xfe, 0xbf, 0xf8, 0x7, 0xff, 0xc0, 0x3f, 0xfd,
0x3f, 0xf0, 0x3, 0xff, 0x40, 0x2f, 0xf8, 0xa,
0x80, 0x0, 0x68, 0x0, 0x6, 0x90, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0xbe, 0x0,
0xb, 0xe0, 0x7f, 0xf4, 0x3, 0xff, 0x80, 0x3f,
0xfc, 0xff, 0xfc, 0xb, 0xff, 0xc0, 0x7f, 0xfd,
0xff, 0xfc, 0xb, 0xff, 0xd0, 0x7f, 0xfe, 0xff,
0xfc, 0xb, 0xff, 0xc0, 0x7f, 0xfd, 0x7f, 0xf4,
0x3, 0xff, 0x80, 0x3f, 0xfc, 0x1f, 0xd0, 0x0,
0xbe, 0x0, 0xb, 0xe0,
/* U+E8B8 "" */
0x0, 0x0, 0x0, 0x6, 0xa9, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xfc, 0x3, 0xf4,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x3f,
0x40, 0x0, 0x0, 0x1, 0xfe, 0x7, 0xfc, 0x3,
0xfd, 0xb, 0xf4, 0x0, 0x3f, 0xff, 0xff, 0xc0,
0x3f, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xf8,
0x2, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, 0xf8,
0x0, 0x2, 0xff, 0xff, 0xf4, 0x3f, 0xc1, 0xbc,
0x0, 0x0, 0x3, 0xe4, 0x3f, 0xc7, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2, 0xfd, 0xbf, 0x0,
0x0, 0xb, 0xfe, 0x0, 0x0, 0x1f, 0xe7, 0xfd,
0x0, 0x3, 0xff, 0xfd, 0x0, 0x7, 0xfd, 0x3f,
0xf8, 0x0, 0xff, 0xff, 0xf0, 0x2, 0xff, 0xc0,
0xbf, 0xe0, 0x1f, 0xff, 0xff, 0x80, 0xbf, 0xe0,
0x2, 0xfd, 0x3, 0xff, 0xff, 0xfc, 0xb, 0xf8,
0x0, 0xf, 0xd0, 0x3f, 0xff, 0xff, 0xc0, 0x7f,
0x0, 0x0, 0xfd, 0x3, 0xff, 0xff, 0xfc, 0x7,
0xf0, 0x0, 0x2f, 0xd0, 0x3f, 0xff, 0xff, 0xc0,
0xbf, 0x40, 0xb, 0xfe, 0x1, 0xff, 0xff, 0xf8,
0xb, 0xfe, 0x3, 0xff, 0x80, 0xf, 0xff, 0xff,
0x0, 0x2f, 0xfc, 0x7f, 0xd0, 0x0, 0x3f, 0xff,
0xd0, 0x0, 0x7f, 0xdb, 0xf0, 0x0, 0x0, 0xbf,
0xe0, 0x0, 0x1, 0xfe, 0x7f, 0x80, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2f, 0xd3, 0xfc, 0x1b, 0xc0,
0x0, 0x0, 0x3e, 0x43, 0xfc, 0x1f, 0xff, 0xff,
0x40, 0x0, 0x1f, 0xff, 0xff, 0x40, 0xff, 0xff,
0xff, 0x80, 0x2f, 0xff, 0xff, 0xe0, 0x3, 0xff,
0xff, 0xfc, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1f,
0xe0, 0x7f, 0xc0, 0x3f, 0xd0, 0xbf, 0x0, 0x0,
0x0, 0x1, 0xfc, 0x3, 0xf4, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1f, 0xc0, 0x3f, 0x40, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x90, 0x0,
0x0, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 672, .box_w = 36, .box_h = 28, .ofs_x = 3, .ofs_y = 7},
{.bitmap_index = 252, .adv_w = 672, .box_w = 28, .box_h = 28, .ofs_x = 7, .ofs_y = 7},
{.bitmap_index = 448, .adv_w = 672, .box_w = 34, .box_h = 36, .ofs_x = 4, .ofs_y = 3}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_42 = {
#else
lv_font_t material_symbols_launcher_42 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 36, /*The maximum line height required by the font*/
.base_line = -3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_42*/

View File

@ -1,246 +0,0 @@
/*******************************************************************************
* Size: 48 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 48 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_48.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_48
#define MATERIAL_SYMBOLS_LAUNCHER_48 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_48
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0xb, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0,
0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x0,
0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
/* U+E5C3 "" */
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff,
0xbf, 0xfe, 0x0, 0xbf, 0xfe, 0x0, 0xbf, 0xfe,
0x3f, 0xfc, 0x0, 0x3f, 0xfc, 0x0, 0x3f, 0xfc,
0xb, 0xe0, 0x0, 0xb, 0xe0, 0x0, 0xb, 0xe0,
/* U+E8B8 "" */
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb,
0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xf0, 0xf, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0xf,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x40, 0x2f,
0xe0, 0xb, 0xf8, 0x1, 0xb4, 0x0, 0x0, 0xff,
0xf9, 0xff, 0xe0, 0xb, 0xff, 0x6f, 0xff, 0x0,
0x2, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff,
0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0x80, 0x2,
0xff, 0xff, 0xff, 0xc0, 0xb, 0xfd, 0xff, 0xf4,
0x0, 0x0, 0x1f, 0xff, 0x7f, 0xe0, 0xf, 0xf4,
0x1b, 0xc0, 0x0, 0x0, 0x3, 0xe4, 0x1f, 0xf0,
0x2f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xf8, 0x3f, 0xd0, 0x0, 0x0, 0x2f, 0xf8,
0x0, 0x0, 0x7, 0xfc, 0x3f, 0xf4, 0x0, 0x1,
0xff, 0xff, 0x40, 0x0, 0x1f, 0xfc, 0x2f, 0xfe,
0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xf8,
0xb, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xf0, 0x3,
0xff, 0xe0, 0x1, 0xff, 0xd0, 0x1f, 0xff, 0xff,
0xf8, 0x7, 0xff, 0x40, 0x0, 0x7f, 0xc0, 0x2f,
0xff, 0xff, 0xfc, 0x3, 0xfd, 0x0, 0x0, 0x3f,
0xc0, 0x3f, 0xff, 0xff, 0xfc, 0x3, 0xfc, 0x0,
0x0, 0x3f, 0xc0, 0x3f, 0xff, 0xff, 0xfc, 0x3,
0xfc, 0x0, 0x0, 0x7f, 0xc0, 0x2f, 0xff, 0xff,
0xfc, 0x3, 0xfc, 0x0, 0x1, 0xff, 0xd0, 0x1f,
0xff, 0xff, 0xf8, 0x7, 0xff, 0x40, 0xb, 0xff,
0xc0, 0xf, 0xff, 0xff, 0xf0, 0x3, 0xff, 0xe0,
0x2f, 0xfe, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0,
0xbf, 0xf4, 0x3f, 0xf4, 0x0, 0x1, 0xff, 0xff,
0x40, 0x0, 0x1f, 0xfc, 0x3f, 0xd0, 0x0, 0x0,
0x2f, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x2f, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8,
0xf, 0xf4, 0x1b, 0xc0, 0x0, 0x0, 0x3, 0xe4,
0x1f, 0xf0, 0xb, 0xfd, 0xff, 0xf4, 0x0, 0x0,
0x1f, 0xff, 0x7f, 0xe0, 0x3, 0xff, 0xff, 0xff,
0x80, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff,
0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0x40,
0x0, 0xff, 0xf9, 0xff, 0xe0, 0xb, 0xff, 0x6f,
0xfe, 0x0, 0x0, 0x2e, 0x40, 0x2f, 0xe0, 0xb,
0xf8, 0x1, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf,
0xf0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xf0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff,
0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3,
0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 768, .box_w = 40, .box_h = 32, .ofs_x = 4, .ofs_y = 8},
{.bitmap_index = 320, .adv_w = 768, .box_w = 32, .box_h = 32, .ofs_x = 8, .ofs_y = 8},
{.bitmap_index = 576, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = 4}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_48 = {
#else
lv_font_t material_symbols_launcher_48 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 40, /*The maximum line height required by the font*/
.base_line = -4, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_48*/

View File

@ -1,348 +0,0 @@
/*******************************************************************************
* Size: 64 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 64 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_64.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_64
#define MATERIAL_SYMBOLS_LAUNCHER_64 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_64
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0x0, 0x15, 0x55, 0x55, 0x55, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff,
0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xfd,
0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe0, 0xff, 0xd0, 0x0, 0x0,
0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff,
0xd0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x0, 0x0,
0x0, 0x0, 0x1, 0x55, 0x55, 0x55, 0x55, 0x55,
0x5f, 0xfd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xdf,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd,
0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xdf, 0xfd, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xfd, 0xff, 0xd0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xdf, 0xfd, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xfd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xdf, 0xfd,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xf, 0xfd, 0xff, 0xd0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff,
0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xdf, 0xfd, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xfd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xdf,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xff, 0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd,
0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xdf, 0xfd, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xfd, 0xff, 0xd0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xdf, 0xfd, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x54, 0x0,
/* U+E5C3 "" */
0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0,
0x0, 0x55, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x3,
0xff, 0xd0, 0x0, 0x3, 0xff, 0xd0, 0xf, 0xff,
0xf4, 0x0, 0xf, 0xff, 0xf4, 0x0, 0xf, 0xff,
0xf4, 0x2f, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xfc,
0x0, 0x2f, 0xff, 0xfc, 0x3f, 0xff, 0xfc, 0x0,
0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc, 0x3f,
0xff, 0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x3f,
0xff, 0xfd, 0x3f, 0xff, 0xfd, 0x0, 0x3f, 0xff,
0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x3f, 0xff, 0xfc,
0x0, 0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc,
0x1f, 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xf8, 0x0,
0x1f, 0xff, 0xf8, 0xb, 0xff, 0xf0, 0x0, 0xb,
0xff, 0xf0, 0x0, 0xb, 0xff, 0xf0, 0x1, 0xff,
0x80, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, 0xff,
0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0,
0x0, 0x55, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x3,
0xff, 0xd0, 0x0, 0x3, 0xff, 0xd0, 0xf, 0xff,
0xf4, 0x0, 0xf, 0xff, 0xf4, 0x0, 0xf, 0xff,
0xf4, 0x2f, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xfc,
0x0, 0x2f, 0xff, 0xfc, 0x3f, 0xff, 0xfc, 0x0,
0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc, 0x3f,
0xff, 0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x3f,
0xff, 0xfd, 0x3f, 0xff, 0xfd, 0x0, 0x3f, 0xff,
0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x3f, 0xff, 0xfc,
0x0, 0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc,
0x1f, 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xf8, 0x0,
0x1f, 0xff, 0xf8, 0xb, 0xff, 0xf0, 0x0, 0xb,
0xff, 0xf0, 0x0, 0xb, 0xff, 0xf0, 0x1, 0xff,
0x80, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, 0xff,
0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0,
0x0, 0x55, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x3,
0xff, 0xd0, 0x0, 0x3, 0xff, 0xd0, 0xf, 0xff,
0xf4, 0x0, 0xf, 0xff, 0xf4, 0x0, 0xf, 0xff,
0xf4, 0x2f, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xfc,
0x0, 0x2f, 0xff, 0xfc, 0x3f, 0xff, 0xfc, 0x0,
0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc, 0x3f,
0xff, 0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x3f,
0xff, 0xfd, 0x3f, 0xff, 0xfd, 0x0, 0x3f, 0xff,
0xfd, 0x0, 0x3f, 0xff, 0xfd, 0x3f, 0xff, 0xfc,
0x0, 0x3f, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xfc,
0x1f, 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xf8, 0x0,
0x1f, 0xff, 0xf8, 0xb, 0xff, 0xf0, 0x0, 0xb,
0xff, 0xf0, 0x0, 0xb, 0xff, 0xf0, 0x1, 0xff,
0x80, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, 0xff,
0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
/* U+E8B8 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x55, 0x50,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff,
0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xb, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xf, 0xfd, 0x0, 0x7f, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xfc, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x3f,
0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd,
0x0, 0x7f, 0xfc, 0x0, 0x3f, 0xfd, 0x0, 0x7f,
0xe0, 0x0, 0x0, 0x3f, 0xff, 0xe3, 0xff, 0xfc,
0x0, 0x3f, 0xff, 0xcb, 0xff, 0xfc, 0x0, 0x0,
0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2f, 0xff,
0xff, 0xff, 0xff, 0x0, 0x1, 0xff, 0xff, 0xff,
0xff, 0xf8, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff,
0x40, 0x3, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0,
0x6, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xb, 0xff,
0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2f, 0xff,
0xfa, 0xff, 0xe0, 0xf, 0xff, 0x1, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x7, 0xff, 0x40, 0xff, 0xf0,
0x2f, 0xfe, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0,
0x0, 0xe4, 0x0, 0xbf, 0xf8, 0x3f, 0xfc, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3f, 0xfc, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x6,
0xff, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x7f,
0xfc, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0,
0x0, 0x0, 0x3f, 0xfd, 0x3f, 0xff, 0x40, 0x0,
0x1, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1, 0xff,
0xfc, 0x2f, 0xff, 0xe0, 0x0, 0x3, 0xff, 0xff,
0xff, 0xd0, 0x0, 0xb, 0xff, 0xf8, 0xb, 0xff,
0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0,
0x3f, 0xff, 0xe0, 0x1, 0xff, 0xff, 0x0, 0x1f,
0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0x40,
0x0, 0x7f, 0xfe, 0x0, 0x3f, 0xff, 0xff, 0xff,
0xfc, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0xf, 0xfd,
0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f,
0xf0, 0x0, 0x0, 0xf, 0xfd, 0x0, 0x3f, 0xff,
0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf0, 0x0, 0x0,
0xf, 0xfd, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd,
0x0, 0x7f, 0xf0, 0x0, 0x0, 0xf, 0xfd, 0x0,
0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf0,
0x0, 0x0, 0x2f, 0xfe, 0x0, 0x3f, 0xff, 0xff,
0xff, 0xfc, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0xff,
0xfe, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfc, 0x0,
0xbf, 0xfe, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xf,
0xff, 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xff, 0xc0,
0xf, 0xff, 0xf4, 0x0, 0xb, 0xff, 0xff, 0xff,
0xf0, 0x0, 0x1f, 0xff, 0xf0, 0x3f, 0xff, 0xc0,
0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3,
0xff, 0xfc, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xbf,
0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x7f,
0xf4, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, 0x0,
0x0, 0x0, 0x1f, 0xfd, 0x7f, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x2f,
0xfc, 0x3f, 0xfd, 0x0, 0x5, 0x0, 0x0, 0x0,
0x0, 0x0, 0x40, 0x0, 0x7f, 0xfc, 0x1f, 0xff,
0x0, 0x7f, 0x80, 0x0, 0x0, 0x0, 0x2, 0xfd,
0x0, 0xff, 0xf4, 0xf, 0xff, 0x4b, 0xff, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xe1, 0xff, 0xe0,
0x3, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0,
0xbf, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff, 0xff,
0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, 0xff, 0xff,
0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
0x7f, 0xff, 0xfb, 0xff, 0xf8, 0x0, 0x2f, 0xff,
0xef, 0xff, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x40,
0xff, 0xfc, 0x0, 0x3f, 0xff, 0x1, 0xff, 0xf4,
0x0, 0x0, 0x2, 0xa0, 0x0, 0x2f, 0xfc, 0x0,
0x3f, 0xf8, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1f, 0xfc, 0x0, 0x3f, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xfc, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x55, 0xbf,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff,
0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xc0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x0, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 1024, .box_w = 54, .box_h = 44, .ofs_x = 5, .ofs_y = 10},
{.bitmap_index = 594, .adv_w = 1024, .box_w = 44, .box_h = 44, .ofs_x = 10, .ofs_y = 10},
{.bitmap_index = 1078, .adv_w = 1024, .box_w = 52, .box_h = 54, .ofs_x = 6, .ofs_y = 5}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_64 = {
#else
lv_font_t material_symbols_launcher_64 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 54, /*The maximum line height required by the font*/
.base_line = -5, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_64*/

View File

@ -1,397 +0,0 @@
/*******************************************************************************
* Size: 72 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 72 --font MaterialSymbolsRounded.ttf -r 0xE5C3,0xE2C7,0xE8B8 --format lvgl -o source-fonts/material_symbols_launcher_72.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_LAUNCHER_72
#define MATERIAL_SYMBOLS_LAUNCHER_72 1
#endif
#if MATERIAL_SYMBOLS_LAUNCHER_72
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E2C7 "" */
0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x40, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40,
/* U+E5C3 "" */
0x1, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xf4, 0x0,
0x0, 0x1, 0xff, 0x40, 0xf, 0xff, 0xf0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xf0,
0x3f, 0xff, 0xfc, 0x0, 0x3, 0xff, 0xff, 0xc0,
0x0, 0x3f, 0xff, 0xfc, 0x7f, 0xff, 0xfd, 0x0,
0x7, 0xff, 0xff, 0xd0, 0x0, 0x7f, 0xff, 0xfd,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0x7f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, 0xd0,
0x0, 0x7f, 0xff, 0xfd, 0x3f, 0xff, 0xfc, 0x0,
0x3, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xff, 0xfc,
0xf, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0x40, 0x0,
0x0, 0x1f, 0xf4, 0x0, 0x0, 0x1, 0xff, 0x40,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xf4, 0x0,
0x0, 0x1, 0xff, 0x40, 0xf, 0xff, 0xf0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xf0,
0x3f, 0xff, 0xfc, 0x0, 0x3, 0xff, 0xff, 0xc0,
0x0, 0x3f, 0xff, 0xfc, 0x7f, 0xff, 0xfd, 0x0,
0x7, 0xff, 0xff, 0xd0, 0x0, 0x7f, 0xff, 0xfd,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0x7f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, 0xd0,
0x0, 0x7f, 0xff, 0xfd, 0x3f, 0xff, 0xfc, 0x0,
0x3, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xff, 0xfc,
0xf, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0x40, 0x0,
0x0, 0x1f, 0xf4, 0x0, 0x0, 0x1, 0xff, 0x40,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xf4, 0x0,
0x0, 0x1, 0xff, 0x40, 0xf, 0xff, 0xf0, 0x0,
0x0, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xf0,
0x3f, 0xff, 0xfc, 0x0, 0x3, 0xff, 0xff, 0xc0,
0x0, 0x3f, 0xff, 0xfc, 0x7f, 0xff, 0xfd, 0x0,
0x7, 0xff, 0xff, 0xd0, 0x0, 0x7f, 0xff, 0xfd,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xf0,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0x7f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, 0xd0,
0x0, 0x7f, 0xff, 0xfd, 0x3f, 0xff, 0xfc, 0x0,
0x3, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xff, 0xfc,
0xf, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0x0,
0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0x40, 0x0,
0x0, 0x1f, 0xf4, 0x0, 0x0, 0x1, 0xff, 0x40,
/* U+E8B8 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0,
0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0xf,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x3f, 0xfc,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8,
0x0, 0x3, 0xff, 0xd0, 0x0, 0xff, 0xf4, 0x0,
0x6, 0xe4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40,
0x7f, 0xff, 0x40, 0x2, 0xff, 0xfc, 0x2, 0xff,
0xf8, 0x0, 0x0, 0x3, 0xff, 0xff, 0xef, 0xff,
0xfc, 0x0, 0xb, 0xff, 0xfe, 0xbf, 0xff, 0xfc,
0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0,
0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0,
0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x2f,
0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xbf, 0xfe,
0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xff,
0xff, 0xef, 0xff, 0xc0, 0x3, 0xff, 0xf0, 0x6f,
0xff, 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8,
0x1f, 0xff, 0x80, 0x2f, 0xff, 0x40, 0xb, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x2f,
0xff, 0x41, 0xff, 0xf8, 0x0, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x3f, 0xff,
0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x15,
0x40, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x3f,
0xfe, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4,
0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0xbf, 0xfe,
0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfc, 0x0,
0x0, 0x0, 0x1f, 0xff, 0xc1, 0xff, 0xff, 0x0,
0x0, 0x0, 0x7f, 0xff, 0xff, 0xfd, 0x0, 0x0,
0x2, 0xff, 0xff, 0x3, 0xff, 0xff, 0x40, 0x0,
0x7, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x3f,
0xff, 0xf4, 0x3, 0xff, 0xff, 0x80, 0x0, 0x3f,
0xff, 0xff, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff,
0x80, 0x3, 0xff, 0xff, 0xc0, 0x2, 0xff, 0xff,
0xff, 0xff, 0xf4, 0x0, 0x3f, 0xff, 0xf4, 0x0,
0x2, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x1,
0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff,
0xd0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40,
0xf, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40,
0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3f,
0xfd, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x2f,
0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xf4,
0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, 0xc0, 0x0,
0x0, 0x7, 0xff, 0xd0, 0x1, 0xff, 0xff, 0xff,
0xff, 0xff, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0,
0xbf, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0xf, 0xff,
0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd0,
0x0, 0xff, 0xff, 0xd0, 0x0, 0xff, 0xff, 0xe0,
0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1,
0xff, 0xff, 0xe0, 0xf, 0xff, 0xfd, 0x0, 0x0,
0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff,
0xff, 0xd0, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x1f,
0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xff,
0xc2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf,
0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd,
0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x2f, 0xff,
0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0,
0x0, 0x0, 0x2, 0xff, 0xf0, 0x7f, 0xfe, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40,
0x0, 0xf, 0xff, 0x80, 0xbf, 0xfd, 0x0, 0x2f,
0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0,
0xbf, 0xfc, 0x0, 0xff, 0xfc, 0x1b, 0xff, 0xd0,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x7, 0xff,
0xe0, 0x2, 0xff, 0xfb, 0xff, 0xff, 0xe0, 0x0,
0x0, 0x0, 0x1f, 0xff, 0xff, 0xbf, 0xff, 0x0,
0x3, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0,
0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff,
0xff, 0xff, 0xfd, 0x0, 0x0, 0xf, 0xff, 0xff,
0xbf, 0xff, 0xf0, 0x0, 0x2f, 0xff, 0xfa, 0xff,
0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x1f,
0xff, 0xc0, 0x0, 0xbf, 0xff, 0x0, 0xbf, 0xfe,
0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0xf, 0xff,
0x40, 0x3, 0xff, 0xd0, 0x0, 0x1b, 0x90, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0,
0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x3f,
0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f,
0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff,
0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff,
0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x80,
0x0, 0x0, 0x0, 0x0, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 1152, .box_w = 60, .box_h = 48, .ofs_x = 6, .ofs_y = 12},
{.bitmap_index = 720, .adv_w = 1152, .box_w = 48, .box_h = 48, .ofs_x = 12, .ofs_y = 12},
{.bitmap_index = 1296, .adv_w = 1152, .box_w = 59, .box_h = 60, .ofs_x = 6, .ofs_y = 6}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x2fc, 0x5f1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 58055, .range_length = 1522, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 3, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 1,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_launcher_72 = {
#else
lv_font_t material_symbols_launcher_72 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 60, /*The maximum line height required by the font*/
.base_line = -6, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_LAUNCHER_72*/

View File

@ -1,415 +0,0 @@
/*******************************************************************************
* Size: 12 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 12 --font MaterialSymbolsRounded.ttf -r 0xE145,0xE5C3,0xE770,0xEF40,0xEBCC,0xEFE6,0xEF4A,0xE5CD,0xF15C,0xE668,0xE92E,0xE326,0xEB97,0xE745,0xEC1C,0xE2C7,0xF720,0xF090,0xE8AF,0xE30F,0xE8FD,0xE9F4,0xE3F4,0xE316,0xE90F,0xEA07,0xE9B9,0xE159,0xE5D2,0xE28D,0xE5D4,0xE405,0xE89C,0xF8C7,0xE5D5,0xEF7A,0xE8B8,0xE9F7,0xE55D,0xF028,0xE1E0,0xE63E,0xE1A7,0xEB8E,0xEAD6,0xE3AF,0xFFF75 --format lvgl -o source-fonts/material_symbols_shared_12.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_SHARED_12
#define MATERIAL_SYMBOLS_SHARED_12 1
#endif
#if MATERIAL_SYMBOLS_SHARED_12
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E145 "" */
0x0, 0x0, 0x2, 0x40, 0x2, 0x40, 0x17, 0x54,
0x6b, 0xe8, 0x2, 0x40, 0x2, 0x40, 0x1, 0x0,
/* U+E159 "" */
0xff, 0xff, 0xfe, 0x0, 0xb, 0xdd, 0x7, 0x7c,
0x2f, 0x83, 0xc0, 0x0, 0x3c, 0x0, 0x3, 0xc0,
0x0, 0x3f, 0xff, 0xff,
/* U+E1A7 "" */
0x1, 0x40, 0xb, 0x47, 0x2b, 0x7, 0xec, 0x7,
0xc0, 0x1f, 0x1, 0xfb, 0x1c, 0x9d, 0x2, 0xd0,
0x9, 0x0,
/* U+E1E0 "" */
0x2, 0x0, 0x7, 0x80, 0x3, 0x0, 0x73, 0x3c,
0xb3, 0x3c, 0x33, 0x18, 0x3f, 0xf4, 0x3, 0x0,
0x3, 0x40, 0x3, 0x40,
/* U+E28D "" */
0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0xc, 0xc0,
0x0, 0x33, 0x0, 0x0, 0xcc, 0x0, 0x1b, 0xba,
0x42, 0xaa, 0xab, 0x9, 0x55, 0x5c, 0x3a, 0xaa,
0xb4, 0xc4, 0x85, 0xa6, 0x67, 0x69, 0x8a, 0xaa,
0xa9,
/* U+E2C7 "" */
0xff, 0x40, 0xc, 0xf, 0xff, 0xc0, 0x0, 0x3c,
0x0, 0x3, 0xc0, 0x0, 0x3c, 0x0, 0x3, 0xc0,
0x0, 0x3f, 0xff, 0xff,
/* U+E30F "" */
0x2, 0xf0, 0x0, 0x26, 0x40, 0x2, 0x74, 0x1,
0xe, 0x4, 0xed, 0xb, 0xbd, 0xb0, 0xd7, 0xa8,
0xe2, 0xa0, 0x2b, 0x0, 0x2, 0x64, 0x0, 0x2f,
0x0,
/* U+E316 "" */
0x5, 0x1, 0xf8, 0x70, 0xd4, 0x1,
/* U+E326 "" */
0x7f, 0xff, 0xda, 0x0, 0x0, 0xa0, 0xf, 0xfa,
0x0, 0xc3, 0xa0, 0xc, 0x37, 0xa4, 0xc3, 0x1a,
0x4c, 0x3f, 0xfc, 0xff,
/* U+E3AF "" */
0x6, 0xf9, 0x2, 0xd2, 0x78, 0x74, 0x50, 0xd9,
0x8e, 0xaa, 0xc3, 0xf4, 0x3c, 0x1f, 0xc3, 0xaa,
0xb2, 0x67, 0x5, 0x1d, 0x2d, 0x87, 0x80, 0x6f,
0x90,
/* U+E3F4 "" */
0x15, 0x55, 0xb, 0xaa, 0xac, 0x90, 0x0, 0xc9,
0x0, 0xc, 0x90, 0x0, 0xc9, 0x1, 0xc, 0x97,
0x3c, 0xc9, 0xaa, 0x8c, 0x95, 0x55, 0xc6, 0xaa,
0xa8,
/* U+E405 "" */
0x0, 0x40, 0x3f, 0x3, 0xa0, 0x30, 0x3, 0x0,
0x30, 0xbf, 0xf, 0xf0, 0xff, 0x2, 0x80,
/* U+E55D "" */
0x0, 0x0, 0x2, 0x80, 0x3, 0xc0, 0xa, 0xa0,
0xc, 0x30, 0x18, 0x24, 0x30, 0xc, 0x77, 0xdd,
0xf8, 0x2f, 0x40, 0x1,
/* U+E5C3 "" */
0xf3, 0xcf, 0xf3, 0xcf, 0x0, 0x0, 0xf3, 0xcf,
0xf3, 0xcf, 0x0, 0x0, 0xf3, 0xcf, 0xf3, 0xcf,
/* U+E5CD "" */
0x10, 0x0, 0x34, 0x1c, 0xd, 0x70, 0x3, 0xc0,
0x7, 0xd0, 0x1c, 0x34, 0x30, 0xc, 0x0, 0x0,
/* U+E5D2 "" */
0xbf, 0xff, 0xc0, 0x0, 0x0, 0x15, 0x55, 0x46,
0xaa, 0xa8, 0x0, 0x0, 0xb, 0xff, 0xfc,
/* U+E5D4 "" */
0xff, 0xf, 0xf0, 0xff,
/* U+E5D5 "" */
0xb, 0xe3, 0x34, 0x2f, 0x90, 0x1b, 0xc0, 0x6a,
0xc0, 0x0, 0x90, 0x5, 0x34, 0x1c, 0xb, 0xe0,
/* U+E63E "" */
0x6, 0xff, 0x80, 0x2f, 0xaa, 0xf8, 0xb4, 0x0,
0x2d, 0x1, 0xfe, 0x40, 0xb, 0xeb, 0xd0, 0x0,
0x0, 0x40, 0x0, 0x3c, 0x0, 0x0, 0x7c, 0x0,
0x0, 0x14, 0x0,
/* U+E668 "" */
0x0, 0x2, 0x0, 0xd, 0x0, 0x34, 0xa0, 0xd0,
0x2b, 0x40, 0x9, 0x0,
/* U+E745 "" */
0xff, 0xc0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0,
0x4, 0xfd, 0xb, 0xc0, 0xa, 0xd0, 0x9, 0x90,
0x2, 0xd0,
/* U+E770 "" */
0x0, 0xa0, 0x0, 0x2a, 0xd0, 0x57, 0x6, 0xcb,
0xd0, 0xc, 0x94, 0x90, 0xc9, 0x1f, 0x8c, 0xbb,
0xff, 0xcb, 0xff, 0xfc, 0x0, 0x0, 0x0,
/* U+E89C "" */
0xff, 0xd0, 0xc0, 0xb8, 0xc0, 0xbd, 0xc0, 0x2b,
0xc1, 0x43, 0xc6, 0x93, 0xc6, 0x93, 0xc1, 0x43,
0xc0, 0x3, 0xff, 0xff,
/* U+E8AF "" */
0xff, 0xfc, 0xc, 0x0, 0x90, 0xc0, 0x9, 0x6c,
0x0, 0x9b, 0xc5, 0x5d, 0xbf, 0xaa, 0x8b, 0x8a,
0xaa, 0xf0, 0xff, 0xff, 0x0, 0x0, 0xb0, 0x0,
0x0,
/* U+E8B8 "" */
0x1, 0xf4, 0x1, 0x25, 0x84, 0x7e, 0xb, 0xda,
0xa, 0xa, 0x36, 0xf9, 0xc3, 0x2f, 0x9c, 0xa0,
0xa0, 0xa7, 0xe0, 0xbd, 0x12, 0x58, 0x40, 0x1f,
0x40,
/* U+E8FD "" */
0x6, 0xf9, 0x2, 0xd0, 0x78, 0x70, 0xf4, 0xd9,
0x1, 0x86, 0xc0, 0x24, 0x3c, 0x6, 0x3, 0x90,
0x0, 0x67, 0x9, 0xd, 0x2d, 0x7, 0x80, 0x6f,
0x90,
/* U+E90F "" */
0xb, 0xe0, 0x34, 0x1c, 0xa0, 0xa, 0x90, 0x6,
0x90, 0x6, 0x70, 0xd, 0x1f, 0xf4, 0x6, 0x90,
0x6, 0x90, 0x3, 0xc0,
/* U+E92E "" */
0x2, 0x80, 0xff, 0xff, 0xa0, 0xa, 0xa5, 0x5a,
0xa5, 0x5a, 0xa5, 0x5a, 0xa5, 0x5a, 0xa5, 0x5a,
0x65, 0x59, 0x2a, 0xa8,
/* U+E9B9 "" */
0xf3, 0xff, 0xff, 0x3f, 0xff, 0x0, 0x0, 0xf,
0x3f, 0xff, 0xf3, 0xff, 0xf0, 0x0, 0x0, 0xf3,
0xff, 0xff, 0x3f, 0xff,
/* U+E9F4 "" */
0x0, 0x7c, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x38,
0x0, 0x74, 0x20, 0x1d, 0xdc, 0xbd, 0x37, 0xbb,
0xc3, 0xae, 0x1, 0x83, 0x0, 0x0, 0xea, 0x0,
0x1, 0xab, 0x40, 0x1f, 0x2, 0xf4, 0x1b, 0x2,
0xa4, 0xa, 0x0, 0xa0,
/* U+E9F7 "" */
0x15, 0x55, 0x7, 0xaa, 0xac, 0xa0, 0x0, 0x9b,
0xff, 0xfd, 0xa0, 0x0, 0x9a, 0x0, 0x9, 0xa0,
0x0, 0x9a, 0x0, 0x9, 0x65, 0x55, 0xd2, 0xaa,
0xa8,
/* U+EA07 "" */
0x6, 0xf9, 0x2, 0xea, 0xb8, 0x73, 0x1c, 0xdb,
0xff, 0xfe, 0xc3, 0xc, 0x3c, 0x30, 0xc3, 0xbf,
0xff, 0xe7, 0x31, 0xcd, 0x2e, 0xab, 0x80, 0x6f,
0x90,
/* U+EAD6 "" */
0x15, 0x55, 0x7, 0xaa, 0xac, 0xa0, 0x0, 0x9a,
0x4, 0x9, 0xa6, 0x86, 0x9a, 0x68, 0xd9, 0xa9,
0x94, 0x9a, 0x0, 0x9, 0x65, 0x55, 0xd2, 0xaa,
0xa8,
/* U+EB8E "" */
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3c,
0xa0, 0x3, 0xc3, 0x40, 0x3c, 0xa1, 0x93, 0xc0,
0x19, 0x3f, 0xff, 0xff,
/* U+EB97 "" */
0x15, 0x55, 0x4e, 0xaa, 0xab, 0xc0, 0x0, 0x3c,
0xaa, 0x63, 0xc1, 0x0, 0x3c, 0xdf, 0xf3, 0xc1,
0x0, 0x3d, 0x55, 0x57, 0x6b, 0xfe, 0x90, 0x2a,
0x80,
/* U+EBCC "" */
0x8, 0x2, 0x7, 0xff, 0xfc, 0x90, 0x0, 0xcb,
0xff, 0xfc, 0x90, 0x0, 0xc9, 0x88, 0x8c, 0x90,
0x0, 0xc9, 0x88, 0x8c, 0x90, 0x0, 0xc7, 0xff,
0xfc,
/* U+EC1C "" */
0x0, 0x30, 0x0, 0xe0, 0x3, 0xc0, 0xf, 0xc0,
0x36, 0xfe, 0xbf, 0x9c, 0x3, 0xf0, 0x3, 0xc0,
0xb, 0x0, 0xc, 0x0,
/* U+EF40 "" */
0xf3, 0xcf, 0x3c, 0xf3, 0xc0, 0x0, 0x3, 0xcf,
0x4, 0xf3, 0xcb, 0xc0, 0xa, 0xef, 0x6, 0xa3,
0xc1, 0xe0,
/* U+EF4A "" */
0x6, 0xf9, 0x2, 0xd0, 0x78, 0x70, 0x0, 0xd9,
0x0, 0x6, 0xc0, 0x0, 0x3c, 0x0, 0x3, 0x90,
0x0, 0x67, 0x0, 0xd, 0x2d, 0x7, 0x80, 0x6f,
0x90,
/* U+EF7A "" */
0x0, 0x0, 0x2, 0xfe, 0x0, 0x70, 0x34, 0x9,
0x1, 0x80, 0x90, 0x18, 0x3, 0x47, 0x40, 0x1f,
0xec, 0x0, 0x0, 0x70, 0x0, 0x1, 0xc0, 0x0,
0x0,
/* U+EFE6 "" */
0x0, 0x1, 0x1, 0xf8, 0x78, 0x24, 0xcf, 0xc2,
0x4c, 0xfc, 0x24, 0xc3, 0x2, 0x4c, 0x30, 0x7c,
0xc3, 0xb, 0xdc, 0x30, 0x7c, 0xa7, 0x2, 0x42,
0x80,
/* U+F028 "" */
0x7f, 0xff, 0xfc, 0x90, 0x0, 0xc, 0x98, 0x88,
0x8c, 0x90, 0x0, 0xc, 0x98, 0x88, 0x8c, 0x90,
0x54, 0xc, 0x90, 0x54, 0xc, 0x7f, 0xff, 0xfc,
/* U+F090 "" */
0x2, 0x0, 0x2, 0x40, 0x2, 0x40, 0x1a, 0x70,
0xb, 0xd0, 0x42, 0x41, 0xc0, 0x3, 0xff, 0xff,
/* U+F15C "" */
0x0, 0xbd, 0x0, 0x3, 0x43, 0x40, 0x9, 0x0,
0xc0, 0x38, 0x0, 0xd0, 0xa0, 0x0, 0x68, 0x90,
0x0, 0xc, 0x70, 0x0, 0xc, 0x1f, 0xff, 0xf4,
/* U+F720 "" */
0x1, 0xe0, 0x7, 0x8b, 0x47, 0x40, 0x3a, 0xf0,
0x2f, 0x97, 0xb4, 0xe4, 0x30, 0x39, 0xc, 0xd,
0xd3, 0xe, 0x1e, 0xed, 0x0, 0xb8, 0x0,
/* U+F8C7 "" */
0x0, 0x80, 0x0, 0x9, 0x0, 0x70, 0x91, 0xcd,
0x9, 0xd, 0xc0, 0x90, 0xac, 0x4, 0x6, 0xd0,
0x0, 0x97, 0x0, 0x1c, 0x2c, 0x7, 0x0, 0x7f,
0x80,
/* U+FFF75 "󿽵" */
0xff, 0xff, 0xec, 0x41, 0x13, 0xd5, 0x55, 0x7a,
0xaf, 0xef, 0xb, 0xd1, 0x3b, 0x81, 0x2e, 0xd5,
0x7f, 0x5e, 0xaa, 0xab, 0xc4, 0x11, 0x3b, 0xff,
0xff
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 16, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 36, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 54, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 74, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 107, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 127, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 152, .adv_w = 192, .box_w = 6, .box_h = 4, .ofs_x = 3, .ofs_y = 4},
{.bitmap_index = 158, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 178, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 203, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 228, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 243, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 263, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 279, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 295, .adv_w = 192, .box_w = 10, .box_h = 6, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 310, .adv_w = 192, .box_w = 2, .box_h = 8, .ofs_x = 5, .ofs_y = 2},
{.bitmap_index = 314, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 330, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 357, .adv_w = 192, .box_w = 8, .box_h = 6, .ofs_x = 2, .ofs_y = 3},
{.bitmap_index = 369, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 387, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 410, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 430, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 455, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 480, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 505, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 525, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 545, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 565, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 601, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 626, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 651, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 676, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 696, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 721, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 746, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 766, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 784, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 809, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 834, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 859, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 883, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 899, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 923, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 946, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 971, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x14, 0x62, 0x9b, 0x148, 0x182, 0x1ca, 0x1d1,
0x1e1, 0x26a, 0x2af, 0x2c0, 0x418, 0x47e, 0x488, 0x48d,
0x48f, 0x490, 0x4f9, 0x523, 0x600, 0x62b, 0x757, 0x76a,
0x773, 0x7b8, 0x7ca, 0x7e9, 0x874, 0x8af, 0x8b2, 0x8c2,
0x991, 0xa49, 0xa52, 0xa87, 0xad7, 0xdfb, 0xe05, 0xe35,
0xea1, 0xee3, 0xf4b, 0x1017, 0x15db, 0x1782
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 57669, .range_length = 6019, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
},
{
.range_start = 1048437, .range_length = 1, .glyph_id_start = 47,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 2,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_shared_12 = {
#else
lv_font_t material_symbols_shared_12 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 12, /*The maximum line height required by the font*/
.base_line = 0, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_SHARED_12*/

View File

@ -1,521 +0,0 @@
/*******************************************************************************
* Size: 16 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 16 --font MaterialSymbolsRounded.ttf -r 0xE145,0xE5C3,0xE770,0xEF40,0xEBCC,0xEFE6,0xEF4A,0xE5CD,0xF15C,0xE668,0xE92E,0xE326,0xEB97,0xE745,0xEC1C,0xE2C7,0xF720,0xF090,0xE8AF,0xE30F,0xE8FD,0xE9F4,0xE3F4,0xE316,0xE90F,0xEA07,0xE9B9,0xE159,0xE5D2,0xE28D,0xE5D4,0xE405,0xE89C,0xF8C7,0xE5D5,0xEF7A,0xE8B8,0xE9F7,0xE55D,0xF028,0xE1E0,0xE63E,0xE1A7,0xEB8E,0xEAD6,0xE3AF,0xFFF75 --format lvgl -o source-fonts/material_symbols_shared_16.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_SHARED_16
#define MATERIAL_SYMBOLS_SHARED_16 1
#endif
#if MATERIAL_SYMBOLS_SHARED_16
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E145 "" */
0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0,
0xe, 0x0, 0x15, 0xf5, 0x4b, 0xff, 0xfd, 0x0,
0xe0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x9,
0x0,
/* U+E159 "" */
0x15, 0x55, 0x55, 0xb, 0xff, 0xff, 0xfd, 0xf4,
0x0, 0x2, 0xde, 0xe0, 0x1, 0xed, 0xd2, 0xd0,
0xf4, 0xdd, 0x7, 0xf8, 0xd, 0xd0, 0x4, 0x0,
0xdd, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0xdd,
0x0, 0x0, 0xd, 0xbf, 0xff, 0xff, 0xd1, 0x55,
0x55, 0x50,
/* U+E1A7 "" */
0x0, 0x40, 0x0, 0x3c, 0x1, 0xf, 0xc1, 0xd3,
0x6c, 0x1d, 0xef, 0x1, 0xff, 0x0, 0x1f, 0x0,
0xf, 0xd0, 0xf, 0xfd, 0xf, 0x36, 0xcb, 0xe,
0xe0, 0x3, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0,
/* U+E1E0 "" */
0x0, 0x0, 0x0, 0xe, 0x0, 0x2, 0xf0, 0x0,
0xe, 0x0, 0x10, 0xd1, 0x5b, 0xcd, 0x3e, 0x78,
0xd3, 0xe3, 0x4d, 0x1c, 0x39, 0xe6, 0xc2, 0xff,
0xf4, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x1, 0xf0,
0x0, 0xe, 0x0,
/* U+E28D "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, 0x0,
0x0, 0xd, 0x70, 0x0, 0x0, 0xd, 0x70, 0x0,
0x0, 0xd, 0x70, 0x0, 0x0, 0xd, 0x70, 0x0,
0x0, 0xd, 0x70, 0x0, 0x6, 0xaf, 0xfa, 0x90,
0xf, 0xaa, 0xaa, 0xf0, 0xd, 0x0, 0x0, 0x70,
0xf, 0xff, 0xff, 0xf0, 0x1d, 0x55, 0x55, 0x74,
0x28, 0xc2, 0x83, 0x28, 0x34, 0xd2, 0x87, 0x1c,
0x3f, 0xff, 0xff, 0xfc, 0x5, 0x55, 0x55, 0x50,
/* U+E2C7 "" */
0x15, 0x40, 0x0, 0xb, 0xff, 0x40, 0x0, 0xd0,
0x2f, 0xff, 0xcd, 0x0, 0x55, 0x5d, 0xd0, 0x0,
0x0, 0xdd, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0,
0xdd, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0xdd,
0x0, 0x0, 0xd, 0xbf, 0xff, 0xff, 0xd1, 0x55,
0x55, 0x50,
/* U+E30F "" */
0x0, 0x15, 0x40, 0x0, 0x3, 0xfc, 0x0, 0x0,
0x31, 0xc0, 0x0, 0x3, 0x2c, 0x0, 0x0, 0x3f,
0x80, 0xf, 0xf4, 0xe2, 0xfd, 0xe6, 0xd0, 0xb5,
0xde, 0x6d, 0xb, 0x5d, 0xff, 0x44, 0x2f, 0xd0,
0x2, 0xf0, 0x0, 0x0, 0x36, 0xc0, 0x0, 0x3,
0x1c, 0x0, 0x0, 0x3a, 0xc0, 0x0, 0x3, 0xf8,
0x0,
/* U+E316 "" */
0x0, 0x0, 0x7, 0xc0, 0x1e, 0xb0, 0x78, 0x2c,
0xa0, 0xa,
/* U+E326 "" */
0x5, 0x55, 0x55, 0x3, 0xff, 0xff, 0xfc, 0x34,
0x0, 0x0, 0x3, 0x40, 0x1, 0x54, 0x34, 0x0,
0xff, 0xd3, 0x40, 0xd, 0x4d, 0x34, 0x0, 0xd0,
0xd3, 0x40, 0xd, 0xd, 0x3f, 0xfc, 0xd0, 0xd0,
0x55, 0xd, 0xd, 0xbf, 0xfc, 0xff, 0xd1, 0x55,
0x1, 0x54,
/* U+E3AF "" */
0x0, 0x15, 0x40, 0x0, 0x1f, 0xff, 0x40, 0xb,
0x42, 0x2e, 0x2, 0xd0, 0x50, 0x34, 0x36, 0xc,
0x1, 0xcb, 0x1a, 0xfe, 0xad, 0xa0, 0xbf, 0xc0,
0xea, 0x3, 0xfd, 0xe, 0xba, 0xbf, 0x60, 0xd7,
0x0, 0x30, 0x9c, 0x3c, 0x9, 0xb, 0x80, 0xf4,
0x80, 0xf0, 0x3, 0xfa, 0xfc, 0x0, 0x6, 0xf9,
0x0,
/* U+E3F4 "" */
0xbf, 0xff, 0xfe, 0xe5, 0x55, 0x5b, 0xd0, 0x0,
0x7, 0xd0, 0x0, 0x7, 0xd0, 0x0, 0x7, 0xd0,
0x0, 0x7, 0xd0, 0x2, 0x7, 0xd2, 0x8b, 0x87,
0xd7, 0xef, 0xd7, 0xd1, 0x55, 0x47, 0xe5, 0x55,
0x5b, 0xbf, 0xff, 0xfe,
/* U+E405 "" */
0x0, 0xff, 0x0, 0xff, 0x0, 0xfa, 0x0, 0xd0,
0x0, 0xd0, 0x0, 0xd0, 0x4, 0xd0, 0x3f, 0xd0,
0xff, 0xd0, 0xff, 0xd0, 0xbf, 0xc0, 0x2f, 0x0,
/* U+E55D "" */
0x0, 0x14, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x7d,
0x0, 0x0, 0xeb, 0x0, 0x1, 0xc3, 0x40, 0x2,
0x82, 0x80, 0x3, 0x41, 0xc0, 0xb, 0x0, 0xe0,
0xd, 0x14, 0x70, 0x2d, 0xff, 0x78, 0x3f, 0x82,
0xfc, 0x34, 0x0, 0x1c,
/* U+E5C3 "" */
0x14, 0x14, 0x14, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
0x3c, 0x0, 0x0, 0x0, 0x14, 0x14, 0x14, 0x3d,
0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x0, 0x0, 0x0,
0x14, 0x14, 0x14, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
0x3c, 0x0, 0x0, 0x0,
/* U+E5CD "" */
0x20, 0x0, 0x43, 0xc0, 0x1d, 0xf, 0x7, 0x40,
0x3e, 0xd0, 0x0, 0xf4, 0x0, 0x1f, 0xc0, 0x7,
0x4f, 0x1, 0xd0, 0x3c, 0x34, 0x0, 0xd0, 0x0,
0x0,
/* U+E5D2 "" */
0xff, 0xff, 0xff, 0x15, 0x55, 0x54, 0x0, 0x0,
0x0, 0x55, 0x55, 0x55, 0xff, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x15, 0x55, 0x54, 0xff, 0xff, 0xff,
/* U+E5D4 "" */
0x14, 0x3d, 0x3c, 0x0, 0x14, 0x3d, 0x3c, 0x0,
0x14, 0x3d, 0x3c, 0x0,
/* U+E5D5 "" */
0x0, 0x14, 0x0, 0x2, 0xff, 0x8d, 0xf, 0x41,
0xfd, 0x2c, 0x0, 0x3d, 0x34, 0x3, 0xfd, 0x70,
0x1, 0x54, 0x70, 0x0, 0x0, 0x34, 0x0, 0x4,
0x2c, 0x0, 0x38, 0xf, 0x41, 0xf0, 0x2, 0xff,
0x80, 0x0, 0x14, 0x0,
/* U+E63E "" */
0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xfe, 0x0,
0xf, 0xff, 0xff, 0xe0, 0x7f, 0x40, 0x6, 0xfc,
0xb8, 0x0, 0x0, 0x3d, 0x0, 0x7f, 0xf8, 0x0,
0x2, 0xff, 0xff, 0x40, 0x2, 0xd0, 0xb, 0x40,
0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0xc0, 0x0,
0x0, 0xf, 0xd0, 0x0, 0x0, 0x7, 0xc0, 0x0,
/* U+E668 "" */
0x0, 0x0, 0x8, 0x0, 0x0, 0x3c, 0x0, 0x0,
0xf0, 0x10, 0x3, 0xc0, 0x38, 0xf, 0x0, 0xe,
0x3c, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x80, 0x0,
/* U+E745 "" */
0x15, 0x55, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0,
0x0, 0x0, 0x55, 0x54, 0x0, 0x3f, 0xff, 0x0,
0x0, 0x0, 0x1, 0x43, 0xfd, 0x1, 0xf8, 0x55,
0x1, 0xfe, 0x0, 0x1, 0xce, 0x0, 0x0, 0xce,
0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0,
/* U+E770 "" */
0x0, 0x4, 0x0, 0x0, 0x3f, 0x0, 0x0, 0xf3,
0xd4, 0x82, 0xc0, 0xbf, 0xfb, 0x40, 0x7, 0xee,
0x0, 0x7, 0xd0, 0x2c, 0x7, 0xd0, 0x7f, 0x47,
0xf4, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x55, 0x55, 0x55,
/* U+E89C "" */
0x15, 0x54, 0x0, 0x3f, 0xff, 0x40, 0x70, 0x7,
0xd0, 0x70, 0x7, 0xf4, 0x70, 0x7, 0xfc, 0x70,
0x0, 0xd, 0x70, 0x28, 0xd, 0x70, 0x28, 0xd,
0x72, 0xff, 0x8d, 0x70, 0x28, 0xd, 0x70, 0x28,
0xd, 0x70, 0x0, 0xd, 0x75, 0x55, 0x5d, 0x2f,
0xff, 0xf8,
/* U+E8AF "" */
0x15, 0x55, 0x40, 0xf, 0xff, 0xff, 0x0, 0xd0,
0x0, 0x30, 0xd, 0x0, 0x3, 0x28, 0xd0, 0x0,
0x33, 0xcd, 0x0, 0x3, 0x3c, 0xd5, 0x55, 0xb3,
0xcf, 0xff, 0xfe, 0x3c, 0xf0, 0x0, 0x3, 0xc0,
0x7f, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xc0, 0x0,
0x0, 0x3c, 0x0, 0x0, 0x0, 0x80,
/* U+E8B8 "" */
0x0, 0x5, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x4,
0x35, 0xc1, 0x2, 0xff, 0xf, 0xf8, 0x35, 0x40,
0x15, 0xc3, 0x81, 0xf4, 0x2c, 0x1d, 0x3f, 0xc7,
0x40, 0xd3, 0xfd, 0x70, 0x3c, 0x3f, 0xc3, 0xc7,
0x0, 0x50, 0xd, 0x3f, 0xd0, 0x7f, 0xc0, 0xeb,
0xe, 0xb0, 0x0, 0x3a, 0xc0, 0x0, 0x2, 0xf8,
0x0,
/* U+E8FD "" */
0x0, 0x15, 0x40, 0x0, 0x2f, 0xff, 0x40, 0xb,
0x40, 0x2e, 0x2, 0xc1, 0xa4, 0x74, 0x34, 0x20,
0xc1, 0xcb, 0x0, 0x1c, 0xd, 0xa0, 0x3, 0x40,
0xea, 0x0, 0xa0, 0xe, 0xa0, 0x0, 0x0, 0xd7,
0x0, 0x90, 0x1c, 0x38, 0xe, 0x3, 0x80, 0xe0,
0x0, 0xf0, 0x3, 0xea, 0xbc, 0x0, 0x6, 0xf9,
0x0,
/* U+E90F "" */
0x0, 0x50, 0x0, 0xff, 0xf0, 0x3c, 0x3, 0xcb,
0x0, 0xe, 0xd0, 0x0, 0x7d, 0x0, 0x7, 0xd0,
0x0, 0x7b, 0x0, 0xe, 0x39, 0x57, 0xc0, 0xff,
0xf0, 0x1, 0x54, 0x0, 0xbf, 0xd0, 0x0, 0x50,
0x0, 0xe, 0x0,
/* U+E92E "" */
0x15, 0xff, 0x54, 0x3f, 0xff, 0xfd, 0x28, 0x0,
0x28, 0x28, 0x82, 0x28, 0x28, 0xd7, 0x28, 0x28,
0xd7, 0x28, 0x28, 0xd7, 0x28, 0x28, 0xd7, 0x28,
0x28, 0xd7, 0x28, 0x28, 0x0, 0x28, 0x2d, 0x55,
0x68, 0x1f, 0xff, 0xf4,
/* U+E9B9 "" */
0x10, 0x1a, 0xaa, 0x4b, 0xcb, 0xff, 0xfd, 0x78,
0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x10, 0x1a,
0xaa, 0x4b, 0xcb, 0xff, 0xfd, 0x78, 0x7f, 0xff,
0xd0, 0x0, 0x0, 0x0, 0x10, 0x1a, 0xaa, 0x4b,
0xcb, 0xff, 0xfd, 0x78, 0x7f, 0xff, 0xd0, 0x0,
0x0, 0x0,
/* U+E9F4 "" */
0x0, 0x7, 0xd0, 0x0, 0x0, 0xe, 0xb0, 0x0,
0x0, 0xe, 0xb0, 0x0, 0x0, 0x7, 0xd0, 0x0,
0x28, 0x2, 0x80, 0x28, 0xff, 0x3, 0xc0, 0xff,
0xd7, 0x5f, 0xf5, 0xd7, 0xbe, 0xb8, 0x2e, 0xbe,
0x0, 0x34, 0x1c, 0x0, 0x0, 0x3c, 0x3c, 0x0,
0x0, 0x1f, 0xf4, 0x0, 0x1, 0x75, 0x5d, 0x40,
0xb, 0xf0, 0xf, 0xe0, 0xd, 0x70, 0xd, 0x70,
0xb, 0xe0, 0xb, 0xe0, 0x0, 0x0, 0x0, 0x0,
/* U+E9F7 "" */
0xbf, 0xff, 0xfe, 0xe5, 0x55, 0x5b, 0xd0, 0x0,
0x7, 0xe5, 0x55, 0x5b, 0xff, 0xff, 0xff, 0xd0,
0x0, 0x7, 0xd0, 0x0, 0x7, 0xd0, 0x0, 0x7,
0xd0, 0x0, 0x7, 0xd0, 0x0, 0x7, 0xe5, 0x55,
0x5b, 0xbf, 0xff, 0xfe,
/* U+EA07 "" */
0x0, 0x15, 0x0, 0x0, 0x1f, 0xff, 0x40, 0xb,
0xba, 0xee, 0x2, 0xc7, 0xc, 0x74, 0x39, 0xf5,
0xe7, 0xcb, 0xff, 0xff, 0xfd, 0xa0, 0xd0, 0x70,
0xea, 0xc, 0x7, 0xe, 0xb5, 0xe5, 0xb5, 0xd7,
0xff, 0xff, 0xfc, 0x3c, 0xb0, 0xd3, 0x80, 0xe7,
0x5c, 0xf0, 0x3, 0xff, 0xfc, 0x0, 0x6, 0xf9,
0x0,
/* U+EAD6 "" */
0xbf, 0xff, 0xfe, 0xe5, 0x55, 0x5b, 0xd0, 0x0,
0x7, 0xd0, 0x0, 0x7, 0xdf, 0x7a, 0x27, 0xdc,
0xa1, 0x77, 0xdc, 0xa0, 0xe7, 0xdf, 0x78, 0xc7,
0xd0, 0x0, 0x7, 0xd0, 0x0, 0x7, 0xe5, 0x55,
0x5b, 0xbf, 0xff, 0xfe,
/* U+EB8E "" */
0x2a, 0xaa, 0xaa, 0x4f, 0xff, 0xff, 0xfd, 0xff,
0xff, 0xff, 0xde, 0x0, 0x0, 0xd, 0xd2, 0x40,
0x0, 0xdd, 0x1d, 0x0, 0xd, 0xd0, 0xb0, 0x0,
0xdd, 0x1e, 0x0, 0xd, 0xd2, 0x83, 0xf8, 0xdd,
0x0, 0x15, 0xd, 0xbf, 0xff, 0xff, 0xd1, 0x55,
0x55, 0x50,
/* U+EB97 "" */
0x7f, 0xff, 0xff, 0xce, 0x55, 0x55, 0x5d, 0xd0,
0x0, 0x0, 0xdd, 0x15, 0x53, 0x4d, 0xd1, 0x55,
0x30, 0xdd, 0x8, 0x0, 0xd, 0xd3, 0xdf, 0xf8,
0xdd, 0x1c, 0x55, 0xd, 0xd0, 0x0, 0x0, 0xde,
0x55, 0x55, 0x5d, 0x7f, 0xff, 0xff, 0xc0, 0xf,
0xfd, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+EBCC "" */
0x8, 0x0, 0x20, 0x1e, 0x55, 0xb4, 0xff, 0xff,
0xff, 0xd0, 0x0, 0x7, 0xe5, 0x55, 0x5b, 0xff,
0xff, 0xff, 0xd0, 0x0, 0x7, 0xd3, 0x24, 0xc7,
0xd0, 0x0, 0x7, 0xd0, 0x0, 0x7, 0xd3, 0x24,
0xc7, 0xd0, 0x0, 0x7, 0xe5, 0x55, 0x5b, 0xbf,
0xff, 0xfe,
/* U+EC1C "" */
0x0, 0x0, 0x80, 0x0, 0x7, 0x80, 0x0, 0x1f,
0x0, 0x0, 0x7e, 0x0, 0x1, 0xfc, 0x0, 0x7,
0xbe, 0x50, 0x1e, 0x2b, 0xfc, 0x3f, 0xe8, 0x74,
0x5, 0xbe, 0xd0, 0x0, 0x3f, 0x40, 0x0, 0xbd,
0x0, 0x0, 0xf4, 0x0, 0x2, 0xd0, 0x0, 0x2,
0x0, 0x0,
/* U+EF40 "" */
0x14, 0x14, 0x14, 0xf, 0x4f, 0x4f, 0x43, 0xc3,
0xc3, 0xc0, 0x0, 0x0, 0x0, 0x14, 0x14, 0x0,
0xf, 0x4f, 0x42, 0x83, 0xc3, 0xc2, 0xf8, 0x0,
0x2, 0xfd, 0x14, 0x2, 0x8d, 0xf, 0x40, 0xcd,
0x3, 0xc0, 0x3d, 0x0, 0x0, 0x0, 0x0,
/* U+EF4A "" */
0x0, 0x15, 0x40, 0x0, 0x2f, 0xff, 0x40, 0xb,
0x40, 0x2e, 0x2, 0xc0, 0x0, 0x74, 0x34, 0x0,
0x1, 0xcb, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0,
0xea, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0xd7,
0x0, 0x0, 0x1c, 0x38, 0x0, 0x3, 0x80, 0xe0,
0x0, 0xf0, 0x3, 0xea, 0xbc, 0x0, 0x6, 0xf9,
0x0,
/* U+EF7A "" */
0xb, 0xf4, 0x0, 0x3d, 0x6d, 0x0, 0xb0, 0x7,
0x0, 0xe0, 0x3, 0x40, 0xd0, 0x3, 0x80, 0xe0,
0x3, 0x40, 0xb0, 0xb, 0x0, 0x3e, 0xbf, 0x0,
0x7, 0xe2, 0xc0, 0x0, 0x0, 0xb0, 0x0, 0x0,
0x2c, 0x0, 0x0, 0x9,
/* U+EFE6 "" */
0xb, 0xd0, 0x3c, 0x1d, 0xb0, 0xbe, 0x28, 0x34,
0xff, 0x28, 0x34, 0xff, 0x28, 0x34, 0xbe, 0x28,
0x34, 0x28, 0x28, 0x34, 0x28, 0xbe, 0x34, 0x28,
0xff, 0x34, 0x28, 0xff, 0x38, 0x28, 0xbe, 0x2d,
0xb4, 0x3c, 0xb, 0xd0,
/* U+F028 "" */
0x5, 0x55, 0x55, 0x50, 0x3f, 0xff, 0xff, 0xfc,
0x70, 0x0, 0x0, 0xd, 0x71, 0x48, 0x11, 0x4d,
0x71, 0x48, 0x21, 0x4d, 0x70, 0x0, 0x0, 0xd,
0x72, 0x8c, 0x72, 0x8d, 0x70, 0x0, 0x0, 0xd,
0x70, 0x2f, 0xf8, 0xd, 0x70, 0x5, 0x50, 0xd,
0x3f, 0xff, 0xff, 0xfc, 0x5, 0x55, 0x55, 0x50,
/* U+F090 "" */
0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x34,
0x0, 0x0, 0x34, 0x0, 0x0, 0x34, 0x0, 0x3,
0xbb, 0x80, 0x1, 0xff, 0x0, 0x0, 0xbc, 0x0,
0x30, 0x10, 0xc, 0x70, 0x0, 0xd, 0x3f, 0xff,
0xfc, 0x5, 0x55, 0x50,
/* U+F15C "" */
0x0, 0x1, 0x40, 0x0, 0x0, 0x2f, 0xf4, 0x0,
0x0, 0xb4, 0x2d, 0x0, 0x1, 0xc0, 0xb, 0x0,
0x7, 0xc0, 0x3, 0x40, 0x2e, 0x0, 0x3, 0xd0,
0x34, 0x0, 0x2, 0xb8, 0x70, 0x0, 0x0, 0x1c,
0x30, 0x0, 0x0, 0xd, 0x3c, 0x0, 0x0, 0x2c,
0xf, 0xff, 0xff, 0xf4, 0x0, 0x55, 0x55, 0x40,
/* U+F720 "" */
0x0, 0x10, 0x0, 0x1, 0xfe, 0x0, 0xb, 0x87,
0xd0, 0x7c, 0x0, 0xbc, 0xf8, 0x0, 0x3e, 0xef,
0x42, 0xee, 0xd2, 0xff, 0x4e, 0xd0, 0x38, 0xe,
0xd0, 0x34, 0xe, 0xd0, 0x34, 0xe, 0xb4, 0x34,
0x2d, 0x2f, 0x36, 0xf0, 0x2, 0xff, 0x40, 0x0,
0x78, 0x0,
/* U+F8C7 "" */
0x0, 0x4, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0,
0xd, 0x0, 0x2, 0xc0, 0xd0, 0x70, 0x34, 0xd,
0x3, 0x8b, 0x0, 0xd0, 0x1c, 0xa0, 0xd, 0x0,
0xca, 0x0, 0x80, 0xc, 0xa0, 0x0, 0x0, 0xc7,
0x0, 0x0, 0x2c, 0x38, 0x0, 0x3, 0x40, 0xe0,
0x1, 0xe0, 0x3, 0xea, 0xf8, 0x0, 0x6, 0xf8,
0x0,
/* U+FFF75 "󿽵" */
0x55, 0x55, 0x55, 0xf, 0xff, 0xff, 0xfc, 0xd1,
0x4, 0x4, 0xde, 0x55, 0x55, 0x5d, 0xff, 0xff,
0xff, 0xd0, 0x7, 0xf4, 0xd, 0x1b, 0xe0, 0x21,
0xd7, 0x90, 0x82, 0xf8, 0xe1, 0x7, 0xf8, 0xf,
0xff, 0xff, 0xfd, 0xe5, 0x55, 0x55, 0xdd, 0x20,
0x80, 0x8d, 0xb5, 0x55, 0x55, 0xd2, 0xff, 0xff,
0xfd
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 25, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 67, .adv_w = 256, .box_w = 9, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 99, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 134, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 198, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 240, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 289, .adv_w = 256, .box_w = 8, .box_h = 5, .ofs_x = 4, .ofs_y = 6},
{.bitmap_index = 299, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 341, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 390, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 426, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 2},
{.bitmap_index = 450, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 486, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 522, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 547, .adv_w = 256, .box_w = 12, .box_h = 8, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 571, .adv_w = 256, .box_w = 4, .box_h = 12, .ofs_x = 6, .ofs_y = 2},
{.bitmap_index = 583, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 619, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 667, .adv_w = 256, .box_w = 12, .box_h = 8, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 691, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 730, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 766, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 808, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 854, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 903, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 952, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 987, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1023, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 1065, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1129, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1165, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1214, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1250, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 1292, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1338, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 1380, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 1422, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1461, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1510, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1546, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1582, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 1630, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1666, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 1714, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 1756, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1805, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 1}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x14, 0x62, 0x9b, 0x148, 0x182, 0x1ca, 0x1d1,
0x1e1, 0x26a, 0x2af, 0x2c0, 0x418, 0x47e, 0x488, 0x48d,
0x48f, 0x490, 0x4f9, 0x523, 0x600, 0x62b, 0x757, 0x76a,
0x773, 0x7b8, 0x7ca, 0x7e9, 0x874, 0x8af, 0x8b2, 0x8c2,
0x991, 0xa49, 0xa52, 0xa87, 0xad7, 0xdfb, 0xe05, 0xe35,
0xea1, 0xee3, 0xf4b, 0x1017, 0x15db, 0x1782
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 57669, .range_length = 6019, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
},
{
.range_start = 1048437, .range_length = 1, .glyph_id_start = 47,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 2,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_shared_16 = {
#else
lv_font_t material_symbols_shared_16 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 16, /*The maximum line height required by the font*/
.base_line = 0, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_SHARED_16*/

View File

@ -1,644 +0,0 @@
/*******************************************************************************
* Size: 20 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 20 --font MaterialSymbolsRounded.ttf -r 0xE145,0xE5C3,0xE770,0xEF40,0xEBCC,0xEFE6,0xEF4A,0xE5CD,0xF15C,0xE668,0xE92E,0xE326,0xEB97,0xE745,0xEC1C,0xE2C7,0xF720,0xF090,0xE8AF,0xE30F,0xE8FD,0xE9F4,0xE3F4,0xE316,0xE90F,0xEA07,0xE9B9,0xE159,0xE5D2,0xE28D,0xE5D4,0xE405,0xE89C,0xF8C7,0xE5D5,0xEF7A,0xE8B8,0xE9F7,0xE55D,0xF028,0xE1E0,0xE63E,0xE1A7,0xEB8E,0xEAD6,0xE3AF,0xFFF75 --format lvgl -o source-fonts/material_symbols_shared_20.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_SHARED_20
#define MATERIAL_SYMBOLS_SHARED_20 1
#endif
#if MATERIAL_SYMBOLS_SHARED_20
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E145 "" */
0x0, 0x14, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x3c,
0x0, 0x0, 0x3c, 0x0, 0x0, 0x3c, 0x0, 0x7f,
0xff, 0xfd, 0xbf, 0xff, 0xfe, 0x0, 0x3c, 0x0,
0x0, 0x3c, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x3c,
0x0, 0x0, 0x28, 0x0,
/* U+E159 "" */
0x1a, 0xaa, 0xaa, 0xaa, 0x83, 0xff, 0xff, 0xff,
0xfd, 0x3d, 0x0, 0x0, 0x2, 0xe3, 0xfc, 0x0,
0x1, 0xfe, 0x39, 0xf8, 0x0, 0xf8, 0xe3, 0x82,
0xf4, 0xbc, 0xe, 0x38, 0x3, 0xfd, 0x0, 0xe3,
0x80, 0x6, 0x0, 0xe, 0x38, 0x0, 0x0, 0x0,
0xe3, 0x80, 0x0, 0x0, 0xe, 0x38, 0x0, 0x0,
0x0, 0xe3, 0x80, 0x0, 0x0, 0xe, 0x3f, 0xff,
0xff, 0xff, 0xd1, 0xaa, 0xaa, 0xaa, 0xa8,
/* U+E1A7 "" */
0x0, 0x28, 0x0, 0x0, 0xf8, 0x1, 0x3, 0xf8,
0x1e, 0xe, 0xb8, 0x2e, 0x38, 0xf0, 0x2e, 0xfb,
0x80, 0x2f, 0xf8, 0x0, 0x2f, 0x80, 0x0, 0xbe,
0x0, 0xb, 0xfe, 0x0, 0xbb, 0xee, 0xb, 0x8e,
0x3c, 0x78, 0x3a, 0xe0, 0x40, 0xfe, 0x0, 0x3,
0xe0, 0x0, 0xa, 0x0,
/* U+E1E0 "" */
0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x7d,
0x0, 0x0, 0xff, 0x0, 0x0, 0x38, 0x0, 0x10,
0x38, 0x14, 0xbc, 0x38, 0x7f, 0xfd, 0x38, 0x7f,
0x7c, 0x38, 0x7f, 0x38, 0x38, 0x2c, 0x3d, 0x7d,
0x6c, 0x2f, 0xff, 0xfc, 0x5, 0x7d, 0x50, 0x0,
0x38, 0x0, 0x0, 0x3c, 0x0, 0x0, 0xbe, 0x0,
0x0, 0x7d, 0x0, 0x0, 0x0, 0x0,
/* U+E28D "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0,
0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x2,
0xc3, 0x80, 0x0, 0x0, 0xb, 0xe, 0x0, 0x0,
0x0, 0x2c, 0x38, 0x0, 0x0, 0x0, 0xb0, 0xe0,
0x0, 0x0, 0x2, 0xc3, 0x80, 0x0, 0x0, 0xb,
0xe, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf8, 0x2,
0xff, 0xff, 0xff, 0xf8, 0xb, 0x0, 0x0, 0x0,
0xe0, 0x2e, 0xaa, 0xaa, 0xab, 0x80, 0xff, 0xff,
0xff, 0xff, 0x3, 0x80, 0x0, 0x0, 0x2c, 0x1d,
0x34, 0x3c, 0x1c, 0x74, 0xb0, 0xe0, 0xf0, 0xb0,
0xe2, 0xeb, 0xeb, 0xeb, 0xeb, 0xc7, 0xff, 0xff,
0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+E2C7 "" */
0x1a, 0xa9, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0,
0x0, 0x38, 0x2, 0xff, 0xff, 0xc3, 0x80, 0xa,
0xaa, 0xae, 0x38, 0x0, 0x0, 0x0, 0xe3, 0x80,
0x0, 0x0, 0xe, 0x38, 0x0, 0x0, 0x0, 0xe3,
0x80, 0x0, 0x0, 0xe, 0x38, 0x0, 0x0, 0x0,
0xe3, 0x80, 0x0, 0x0, 0xe, 0x38, 0x0, 0x0,
0x0, 0xe3, 0x80, 0x0, 0x0, 0xe, 0x3f, 0xff,
0xff, 0xff, 0xd1, 0xaa, 0xaa, 0xaa, 0xa8,
/* U+E30F "" */
0x0, 0x1, 0xa8, 0x0, 0x0, 0x0, 0x3f, 0xe0,
0x0, 0x0, 0x3, 0x8e, 0x0, 0x0, 0x0, 0x38,
0xe0, 0x0, 0x0, 0x3, 0xce, 0x0, 0x0, 0x0,
0x2f, 0xd0, 0x0, 0x2a, 0xa0, 0xb4, 0x2a, 0x83,
0xff, 0x80, 0xf, 0xfe, 0x38, 0x2d, 0x3, 0xd0,
0xe3, 0x82, 0xd0, 0x3d, 0xe, 0x3f, 0xf8, 0x20,
0xff, 0xe1, 0xa9, 0xf, 0x82, 0xa8, 0x0, 0x3,
0xfe, 0x0, 0x0, 0x0, 0x38, 0xe0, 0x0, 0x0,
0x3, 0x8e, 0x0, 0x0, 0x0, 0x3e, 0xe0, 0x0,
0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+E316 "" */
0x0, 0xe0, 0x0, 0x3f, 0x80, 0xf, 0x6e, 0x3,
0xd0, 0xb8, 0xb4, 0x2, 0xd1, 0x0, 0x4,
/* U+E326 "" */
0x6, 0xaa, 0xaa, 0xaa, 0x1, 0xff, 0xff, 0xff,
0xf4, 0x2c, 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0,
0x1a, 0xa4, 0x2c, 0x0, 0x3, 0xff, 0xd2, 0xc0,
0x0, 0x38, 0xe, 0x2c, 0x0, 0x3, 0x98, 0xe2,
0xc0, 0x0, 0x38, 0xe, 0x2c, 0x0, 0x3, 0x80,
0xe1, 0xea, 0xa4, 0x38, 0xe, 0xf, 0xff, 0xc3,
0x80, 0xe0, 0x0, 0x0, 0x38, 0xe, 0x3f, 0xff,
0xc3, 0xff, 0xe2, 0xaa, 0xa4, 0x1a, 0xa8,
/* U+E3AF "" */
0x0, 0x1, 0x54, 0x0, 0x0, 0x2, 0xff, 0xfc,
0x0, 0x1, 0xf9, 0x1e, 0xf4, 0x0, 0x7c, 0x2,
0x3, 0xd0, 0xf, 0x80, 0x20, 0xf, 0x2, 0xd8,
0x8, 0x0, 0x38, 0x3c, 0x21, 0xea, 0xab, 0xc3,
0x82, 0x7f, 0xd0, 0x1d, 0x34, 0xf, 0xff, 0x1,
0xd3, 0x40, 0xbf, 0xf4, 0x1d, 0x38, 0x7, 0xfc,
0xc1, 0xc3, 0xea, 0xab, 0x46, 0x3c, 0x1d, 0x0,
0x20, 0x3b, 0x80, 0xb0, 0x5, 0x1, 0xf0, 0x3,
0xc0, 0x80, 0x7c, 0x0, 0xb, 0xaa, 0xbf, 0x0,
0x0, 0x1b, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+E3F4 "" */
0x1a, 0xaa, 0xaa, 0xa4, 0x7f, 0xff, 0xff, 0xfd,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x24, 0xe, 0xb0, 0x30, 0x7c, 0xe,
0xb0, 0xf8, 0xfe, 0xe, 0xb1, 0xff, 0xff, 0x4e,
0xb0, 0x55, 0x55, 0xe, 0xb0, 0x0, 0x0, 0xe,
0x7f, 0xff, 0xff, 0xfd, 0x1a, 0xaa, 0xaa, 0xa4,
/* U+E405 "" */
0x0, 0x5, 0x40, 0x3, 0xff, 0x0, 0x3f, 0xf0,
0x3, 0xff, 0x0, 0x38, 0x0, 0x3, 0x80, 0x0,
0x38, 0x0, 0x3, 0x80, 0x0, 0x38, 0x2, 0xff,
0x80, 0x7f, 0xf8, 0xf, 0xff, 0x80, 0xff, 0xf8,
0xb, 0xff, 0x40, 0x3f, 0xe0, 0x0, 0x54, 0x0,
/* U+E55D "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0,
0x1f, 0x40, 0x0, 0x2, 0xf8, 0x0, 0x0, 0x3a,
0xc0, 0x0, 0xb, 0xe, 0x0, 0x0, 0xf0, 0xf0,
0x0, 0x1d, 0x7, 0x40, 0x3, 0xc0, 0x3c, 0x0,
0x74, 0x1, 0xd0, 0xf, 0x0, 0xf, 0x1, 0xe0,
0xa0, 0xb4, 0x2d, 0xff, 0xf7, 0x83, 0xfe, 0xb,
0xfc, 0x7d, 0x0, 0x7, 0xd1, 0x0, 0x0, 0x4,
/* U+E5C3 "" */
0x14, 0x5, 0x1, 0x4b, 0xd2, 0xf4, 0xbd, 0xbe,
0x2f, 0x8b, 0xe3, 0x80, 0xe0, 0x38, 0x0, 0x0,
0x0, 0x1, 0x40, 0x50, 0x14, 0xbd, 0x2f, 0x4b,
0xdb, 0xe2, 0xf8, 0xbe, 0x38, 0xe, 0x3, 0x80,
0x0, 0x0, 0x0, 0x14, 0x5, 0x1, 0x4b, 0xd2,
0xf4, 0xbd, 0xbe, 0x2f, 0x8b, 0xe3, 0x80, 0xe0,
0x38,
/* U+E5CD "" */
0x20, 0x0, 0x9, 0x3c, 0x0, 0x2e, 0x1f, 0x0,
0xb8, 0x7, 0xc2, 0xe0, 0x1, 0xfb, 0x80, 0x0,
0x7e, 0x0, 0x0, 0xbf, 0x0, 0x2, 0xe7, 0xc0,
0xb, 0x81, 0xf0, 0x2e, 0x0, 0x7c, 0x38, 0x0,
0x1e, 0x0, 0x0, 0x0,
/* U+E5D2 "" */
0xbf, 0xff, 0xff, 0xfc, 0x6a, 0xaa, 0xaa, 0xa8,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6a, 0xaa, 0xaa, 0xa8, 0x7f, 0xff, 0xff, 0xfc,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6a, 0xaa, 0xaa, 0xa8, 0xbf, 0xff, 0xff, 0xfc,
/* U+E5D4 "" */
0x14, 0xbd, 0xbe, 0x38, 0x0, 0x14, 0xbd, 0xbe,
0x38, 0x0, 0x14, 0xbd, 0xbe, 0x38,
/* U+E5D5 "" */
0x0, 0x1a, 0x40, 0x50, 0x2f, 0xff, 0x8e, 0xf,
0x80, 0x6f, 0xe2, 0xd0, 0x0, 0x7e, 0x38, 0x0,
0xab, 0xe7, 0x0, 0xf, 0xfe, 0xb0, 0x0, 0x0,
0xb, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x3,
0x80, 0x0, 0x2c, 0x2d, 0x0, 0x7, 0x80, 0xf8,
0x6, 0xf0, 0x2, 0xff, 0xf8, 0x0, 0x1, 0xa4,
0x0,
/* U+E63E "" */
0x0, 0x1, 0x6a, 0x40, 0x0, 0x0, 0x7f, 0xff,
0xfe, 0x0, 0x7, 0xff, 0xff, 0xff, 0xe0, 0x2f,
0xf4, 0x0, 0x1b, 0xfc, 0x3f, 0x40, 0x0, 0x0,
0xbe, 0x28, 0x0, 0x6a, 0x40, 0x18, 0x0, 0x1f,
0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0,
0x0, 0xbd, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0,
0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0,
0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0,
0x4, 0x0, 0x0,
/* U+E668 "" */
0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x3d, 0x0,
0x0, 0xf, 0x40, 0x0, 0x3, 0xd0, 0x10, 0x0,
0xf4, 0x7, 0xc0, 0x3d, 0x0, 0x2f, 0xf, 0x40,
0x0, 0xbf, 0xd0, 0x0, 0x2, 0xf4, 0x0, 0x0,
0x5, 0x0, 0x0,
/* U+E745 "" */
0x6a, 0xaa, 0x80, 0x0, 0x7f, 0xff, 0xd0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2a, 0xaa, 0x80, 0x0,
0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xb4, 0x7f, 0xf0, 0x2, 0xfc,
0x6a, 0xa0, 0xb, 0xfc, 0x0, 0x0, 0x2d, 0xf8,
0x0, 0x0, 0x74, 0xe0, 0x0, 0x0, 0xd3, 0x80,
0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0xf8, 0x0,
/* U+E770 "" */
0x0, 0x1, 0x80, 0x0, 0x0, 0x7, 0xf4, 0x0,
0x0, 0xf, 0x7e, 0x0, 0x0, 0x3d, 0xb, 0xfc,
0xb4, 0xb8, 0x1, 0xae, 0xbf, 0xf0, 0x0, 0xe,
0xbb, 0xc0, 0x0, 0xe, 0xb1, 0x42, 0xc0, 0xe,
0xb0, 0x7, 0xf4, 0xe, 0xb4, 0xf, 0xfe, 0xe,
0xbe, 0x3f, 0xff, 0xce, 0xbf, 0xff, 0xff, 0xfe,
0xbf, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfd,
/* U+E89C "" */
0x1a, 0xaa, 0x40, 0xb, 0xff, 0xfe, 0x0, 0xb0,
0x1, 0xf8, 0xb, 0x0, 0xf, 0xe0, 0xb0, 0x0,
0xff, 0x8b, 0x0, 0xf, 0xfd, 0xb0, 0x0, 0x15,
0xeb, 0x0, 0xa0, 0xe, 0xb0, 0xf, 0x0, 0xeb,
0x5, 0xf5, 0xe, 0xb0, 0xff, 0xf0, 0xeb, 0x1,
0xf4, 0xe, 0xb0, 0xf, 0x0, 0xeb, 0x0, 0x50,
0xe, 0xb0, 0x0, 0x0, 0xeb, 0xaa, 0xaa, 0xae,
0x7f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0,
/* U+E8AF "" */
0xa, 0xaa, 0xaa, 0x40, 0x3, 0xff, 0xff, 0xfd,
0x0, 0x38, 0x0, 0x0, 0xe0, 0x3, 0x80, 0x0,
0xe, 0x0, 0x38, 0x0, 0x0, 0xe3, 0xc3, 0x80,
0x0, 0xe, 0x3e, 0x38, 0x0, 0x0, 0xe3, 0xe3,
0x80, 0x0, 0xe, 0x3e, 0x3a, 0xaa, 0xaa, 0xe3,
0xe3, 0xff, 0xff, 0xfc, 0x3e, 0x3e, 0x0, 0x0,
0x3, 0xe3, 0x86, 0xaa, 0xaa, 0xfe, 0x0, 0xbf,
0xff, 0xff, 0xe0, 0x7, 0xff, 0xff, 0xfe, 0x0,
0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x1d,
0x0, 0x0, 0x0, 0x0, 0x0,
/* U+E8B8 "" */
0x0, 0x6, 0x90, 0x0, 0x0, 0x7, 0xfd, 0x0,
0x0, 0x2, 0xc3, 0x80, 0x0, 0x79, 0xf0, 0xf6,
0xd0, 0x3f, 0xf4, 0x1f, 0xfc, 0x2c, 0x10, 0x0,
0x43, 0x8f, 0x40, 0xbe, 0x1, 0xf0, 0xf4, 0xbf,
0xe1, 0xf0, 0x1d, 0x3f, 0xfc, 0x74, 0xb, 0x8b,
0xff, 0x2d, 0xb, 0xc1, 0xff, 0x43, 0xe3, 0xc0,
0xa, 0x40, 0x3c, 0x7a, 0xd0, 0x7, 0xad, 0xf,
0xff, 0xf, 0xff, 0x0, 0x92, 0xc3, 0x86, 0x0,
0x0, 0x7a, 0xd0, 0x0, 0x0, 0xf, 0xf0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0,
/* U+E8FD "" */
0x0, 0x1, 0x54, 0x0, 0x0, 0x2, 0xff, 0xfc,
0x0, 0x1, 0xf9, 0x6, 0xf4, 0x0, 0x7c, 0x0,
0x3, 0xd0, 0xf, 0x2, 0xfc, 0xf, 0x2, 0xd0,
0x7a, 0xf0, 0x38, 0x3c, 0x1, 0xb, 0x2, 0xc3,
0x80, 0x0, 0xe0, 0x1d, 0x34, 0x0, 0x3c, 0x1,
0xd3, 0x40, 0xb, 0x0, 0x1d, 0x38, 0x0, 0x60,
0x1, 0xc3, 0xc0, 0x0, 0x0, 0x3c, 0x1e, 0x0,
0xf0, 0x7, 0x80, 0xf4, 0xa, 0x0, 0xf0, 0x3,
0xe0, 0x0, 0x7c, 0x0, 0xb, 0xea, 0xbf, 0x0,
0x0, 0x1b, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+E90F "" */
0x0, 0x15, 0x40, 0x0, 0x1f, 0xff, 0x40, 0xb,
0xd0, 0x7e, 0x1, 0xe0, 0x0, 0xb4, 0x3c, 0x0,
0x3, 0xc3, 0x80, 0x0, 0x2c, 0x34, 0x0, 0x1,
0xc3, 0x80, 0x0, 0x2c, 0x3c, 0x0, 0x3, 0xc2,
0xd0, 0x0, 0x78, 0xf, 0xaa, 0xaf, 0x0, 0x2f,
0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0x40, 0x0, 0xaa, 0xa0, 0x0, 0x1, 0xa4, 0x0,
0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0,
/* U+E92E "" */
0x0, 0x1a, 0x40, 0x6, 0xaf, 0xff, 0xa8, 0xbf,
0xff, 0xff, 0xd3, 0xc0, 0x0, 0x3c, 0x3c, 0x0,
0x3, 0xc3, 0xc7, 0xd, 0x3c, 0x3c, 0x70, 0xd3,
0xc3, 0xc7, 0xd, 0x3c, 0x3c, 0x70, 0xd3, 0xc3,
0xc7, 0xd, 0x3c, 0x3c, 0x70, 0xd3, 0xc3, 0xc7,
0xd, 0x3c, 0x3c, 0x0, 0x3, 0xc3, 0xc0, 0x0,
0x3c, 0x2f, 0xff, 0xff, 0x80, 0xaa, 0xaa, 0xa0,
/* U+E9B9 "" */
0x4, 0x1, 0x55, 0x55, 0x43, 0xf0, 0xff, 0xff,
0xfc, 0x7f, 0xf, 0xff, 0xff, 0xd2, 0xd0, 0xbf,
0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40,
0x15, 0x55, 0x54, 0x3f, 0xf, 0xff, 0xff, 0xc7,
0xf0, 0xff, 0xff, 0xfd, 0x2d, 0xb, 0xff, 0xff,
0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0x55,
0x55, 0x43, 0xf0, 0xff, 0xff, 0xfc, 0x7f, 0xf,
0xff, 0xff, 0xd2, 0xd0, 0xbf, 0xff, 0xf8,
/* U+E9F4 "" */
0x0, 0x0, 0x7d, 0x0, 0x0, 0x0, 0x0, 0xff,
0x0, 0x0, 0x0, 0x1, 0xd7, 0x40, 0x0, 0x0,
0x1, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7d, 0x0,
0x0, 0x15, 0x0, 0x28, 0x0, 0x54, 0x7f, 0x40,
0x28, 0x1, 0xfd, 0xf7, 0xc1, 0xff, 0x3, 0xdf,
0xf3, 0xe7, 0xeb, 0xdb, 0xcf, 0x7f, 0xaf, 0x0,
0xfa, 0xfd, 0x15, 0xb, 0x0, 0xe0, 0x54, 0x0,
0xb, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xeb, 0xc0,
0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x1, 0xae,
0x0, 0xba, 0x40, 0x3, 0xfc, 0x0, 0x3f, 0xc0,
0x7, 0x5d, 0x0, 0x75, 0xd0, 0x7, 0xfd, 0x0,
0x7f, 0xd0, 0x2, 0xf8, 0x0, 0x2f, 0x80, 0x0,
0x0, 0x0, 0x0, 0x0,
/* U+E9F7 "" */
0x1a, 0xaa, 0xaa, 0xa4, 0x7f, 0xff, 0xff, 0xfd,
0x70, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xba, 0xaa, 0xaa, 0xae, 0xbf, 0xff, 0xff, 0xfe,
0xb4, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, 0xe,
0x7f, 0xff, 0xff, 0xfd, 0x1a, 0xaa, 0xaa, 0xa4,
/* U+EA07 "" */
0x0, 0x1, 0x64, 0x0, 0x0, 0x2, 0xff, 0xfc,
0x0, 0x1, 0xff, 0xef, 0xf4, 0x0, 0x7c, 0xb4,
0xe3, 0xd0, 0xf, 0xf, 0xb, 0xf, 0x2, 0xfa,
0xfa, 0xba, 0xb8, 0x3f, 0xff, 0xff, 0xff, 0xc3,
0x82, 0xc0, 0x3c, 0x1d, 0x34, 0x2c, 0x3, 0xc1,
0xd3, 0x42, 0xc0, 0x3c, 0x1d, 0x3e, 0xbe, 0xab,
0xea, 0xc2, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0xe,
0xb, 0x4b, 0x80, 0xb4, 0xf0, 0xf1, 0xf0, 0x3,
0xe7, 0x9e, 0xbc, 0x0, 0xb, 0xff, 0xff, 0x0,
0x0, 0x1b, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+EAD6 "" */
0x1a, 0xaa, 0xaa, 0xa4, 0x7f, 0xff, 0xff, 0xfd,
0x70, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb2, 0x92, 0x84, 0x4e,
0xb3, 0xbb, 0x8c, 0xce, 0xb3, 0x3a, 0xc, 0xce,
0xb3, 0x3b, 0x4a, 0x8e, 0xb3, 0x3a, 0x7, 0x4e,
0xb2, 0x92, 0x82, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, 0xe,
0x7f, 0xff, 0xff, 0xfd, 0x1a, 0xaa, 0xaa, 0xa4,
/* U+EB8E "" */
0x5, 0x55, 0x55, 0x55, 0x43, 0xff, 0xff, 0xff,
0xfd, 0x3f, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff,
0xff, 0xfe, 0x38, 0x0, 0x0, 0x0, 0xe3, 0x87,
0x40, 0x0, 0xe, 0x38, 0x3d, 0x0, 0x0, 0xe3,
0x80, 0xf4, 0x0, 0xe, 0x38, 0xf, 0x0, 0x0,
0xe3, 0x83, 0xc0, 0x69, 0xe, 0x38, 0x20, 0x2f,
0xf0, 0xe3, 0x80, 0x0, 0x0, 0xe, 0x3f, 0xff,
0xff, 0xff, 0xd1, 0xaa, 0xaa, 0xaa, 0xa8,
/* U+EB97 "" */
0xa, 0xaa, 0xaa, 0xaa, 0x43, 0xff, 0xff, 0xff,
0xfd, 0x38, 0x0, 0x0, 0x0, 0xe3, 0x80, 0x0,
0x0, 0xe, 0x38, 0x0, 0x1, 0xc0, 0xe3, 0x8b,
0xff, 0xdf, 0xe, 0x38, 0x0, 0x0, 0xc0, 0xe3,
0x81, 0x40, 0x0, 0xe, 0x38, 0xb8, 0xff, 0xf0,
0xe3, 0x87, 0x8a, 0xaa, 0xe, 0x38, 0x4, 0x0,
0x0, 0xe3, 0x80, 0x0, 0x0, 0xe, 0x3e, 0xaa,
0xaa, 0xaa, 0xe1, 0xff, 0xff, 0xff, 0xfc, 0x0,
0xf, 0xff, 0x80, 0x0, 0x0, 0xaa, 0xa0, 0x0,
/* U+EBCC "" */
0x0, 0x0, 0x0, 0x0, 0x3, 0x80, 0x2, 0xc0,
0x2b, 0xea, 0xab, 0xe8, 0x7f, 0xff, 0xff, 0xfd,
0xb0, 0x0, 0x0, 0xe, 0xba, 0xaa, 0xaa, 0xae,
0xbf, 0xff, 0xff, 0xfe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xb0, 0xd2, 0x87, 0xe,
0xb0, 0x81, 0x42, 0xe, 0xb0, 0x0, 0x0, 0xe,
0xb0, 0x81, 0x42, 0xe, 0xb0, 0xd2, 0x87, 0xe,
0xb0, 0x0, 0x0, 0xe, 0xba, 0xaa, 0xaa, 0xae,
0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0,
/* U+EC1C "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x0,
0x1, 0xf0, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x1f,
0xc0, 0x0, 0xb, 0xf8, 0x0, 0x2, 0xff, 0x0,
0x0, 0xb9, 0xff, 0xa4, 0x2e, 0x6, 0xbf, 0xd7,
0xfe, 0x90, 0xb8, 0x1a, 0xff, 0x6e, 0x0, 0x0,
0xff, 0x80, 0x0, 0x2f, 0xe0, 0x0, 0x3, 0xf4,
0x0, 0x0, 0xbd, 0x0, 0x0, 0xf, 0x40, 0x0,
0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+EF40 "" */
0x14, 0x5, 0x1, 0x40, 0xbd, 0x2f, 0x4b, 0xd0,
0xbe, 0x2f, 0x8b, 0xe0, 0x38, 0xe, 0x3, 0x80,
0x0, 0x0, 0x0, 0x0, 0x14, 0x5, 0x0, 0x0,
0xbd, 0x2f, 0x40, 0x60, 0xbe, 0x2f, 0x81, 0xfc,
0x38, 0xe, 0x7, 0xfc, 0x0, 0x0, 0x1e, 0xf8,
0x14, 0x0, 0x74, 0xe0, 0xbd, 0x0, 0xd3, 0x80,
0xbe, 0x1, 0xde, 0x0, 0x38, 0x0, 0xf8, 0x0,
/* U+EF4A "" */
0x0, 0x1, 0x54, 0x0, 0x0, 0x2, 0xff, 0xfc,
0x0, 0x1, 0xf9, 0x6, 0xf4, 0x0, 0x7c, 0x0,
0x3, 0xd0, 0xf, 0x0, 0x0, 0xf, 0x2, 0xd0,
0x0, 0x0, 0x38, 0x3c, 0x0, 0x0, 0x2, 0xc3,
0x80, 0x0, 0x0, 0x1d, 0x34, 0x0, 0x0, 0x1,
0xd3, 0x40, 0x0, 0x0, 0x1d, 0x38, 0x0, 0x0,
0x1, 0xc3, 0xc0, 0x0, 0x0, 0x3c, 0x1e, 0x0,
0x0, 0x7, 0x80, 0xf4, 0x0, 0x0, 0xf0, 0x3,
0xe0, 0x0, 0x7c, 0x0, 0xb, 0xea, 0xbf, 0x0,
0x0, 0x1b, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+EF7A "" */
0x0, 0x55, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0,
0x1f, 0x41, 0xf4, 0x0, 0x3c, 0x0, 0x3c, 0x0,
0x74, 0x0, 0x2c, 0x0, 0x70, 0x0, 0x1d, 0x0,
0x74, 0x0, 0x1d, 0x0, 0x38, 0x0, 0x2c, 0x0,
0x3d, 0x0, 0x78, 0x0, 0xf, 0xeb, 0xfc, 0x0,
0x2, 0xff, 0x5f, 0x0, 0x0, 0x0, 0x7, 0xc0,
0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x7c,
0x0, 0x0, 0x0, 0x1c,
/* U+EFE6 "" */
0x0, 0x54, 0x1, 0x90, 0x3, 0xfe, 0x3, 0xf0,
0xb, 0x8b, 0x4b, 0xf8, 0xf, 0x3, 0x8f, 0xfc,
0xf, 0x3, 0x8f, 0xfc, 0xf, 0x3, 0x8f, 0xfc,
0xf, 0x3, 0x81, 0xe0, 0xf, 0x3, 0x81, 0xd0,
0xf, 0x3, 0x81, 0xd0, 0x1f, 0x43, 0x81, 0xd0,
0xbf, 0xc3, 0x81, 0xd0, 0xbf, 0xd3, 0x81, 0xd0,
0xbf, 0xd3, 0x81, 0xd0, 0x7f, 0xc2, 0xd3, 0xc0,
0x2f, 0x80, 0xff, 0x40, 0xa, 0x0, 0x14, 0x0,
/* U+F028 "" */
0xa, 0xaa, 0xaa, 0xaa, 0xa0, 0x3f, 0xff, 0xff,
0xff, 0xfc, 0x38, 0x0, 0x0, 0x0, 0x2c, 0x38,
0x0, 0x0, 0x0, 0x2c, 0x38, 0xb1, 0xc3, 0x4a,
0x2c, 0x38, 0x0, 0x0, 0x0, 0x2c, 0x38, 0x50,
0x81, 0x5, 0x2c, 0x38, 0xb1, 0xc3, 0x4a, 0x2c,
0x38, 0x0, 0x0, 0x0, 0x2c, 0x38, 0x2, 0xaa,
0x80, 0x2c, 0x38, 0x3, 0xff, 0xc0, 0x2c, 0x38,
0x0, 0x0, 0x0, 0x2c, 0x3f, 0xff, 0xff, 0xff,
0xfc, 0xa, 0xaa, 0xaa, 0xaa, 0xa0,
/* U+F090 "" */
0x0, 0x5, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0,
0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe,
0x0, 0x0, 0x14, 0xe2, 0x40, 0x3, 0xde, 0xb8,
0x0, 0xf, 0xfe, 0x0, 0x0, 0x3f, 0x80, 0x1,
0x0, 0xe0, 0x4, 0xb0, 0x0, 0x0, 0xeb, 0x0,
0x0, 0xe, 0xbf, 0xff, 0xff, 0xe2, 0xaa, 0xaa,
0xa8,
/* U+F15C "" */
0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xb, 0xff,
0xd0, 0x0, 0x0, 0x2f, 0x41, 0xf4, 0x0, 0x0,
0x3c, 0x0, 0x3c, 0x0, 0x0, 0xb0, 0x0, 0x1d,
0x0, 0x7, 0xf0, 0x0, 0xe, 0x0, 0x1f, 0x40,
0x0, 0xf, 0x80, 0x3c, 0x0, 0x0, 0xf, 0xf0,
0x38, 0x0, 0x0, 0x0, 0x3c, 0x38, 0x0, 0x0,
0x0, 0x2c, 0x3c, 0x0, 0x0, 0x0, 0x2c, 0x1e,
0x0, 0x0, 0x0, 0x7c, 0xb, 0xff, 0xff, 0xff,
0xf0, 0x0, 0xaa, 0xaa, 0xaa, 0x80,
/* U+F720 "" */
0x0, 0x1, 0x40, 0x0, 0x0, 0x1f, 0xf4, 0x0,
0x0, 0xfd, 0xbe, 0x0, 0xb, 0xe0, 0xb, 0xe0,
0x3e, 0x0, 0x0, 0xfc, 0xbe, 0x0, 0x0, 0xfd,
0xbb, 0xe0, 0xb, 0xed, 0xb0, 0xfd, 0x7e, 0x1d,
0xb0, 0x1f, 0xf4, 0x1d, 0xb0, 0x3, 0xc0, 0x1d,
0xb0, 0x3, 0x80, 0x1d, 0xb0, 0x3, 0x80, 0x1d,
0x78, 0x3, 0x80, 0x3d, 0x2f, 0x43, 0x82, 0xf8,
0x7, 0xf7, 0xdf, 0xc0, 0x0, 0x7f, 0xfd, 0x0,
0x0, 0xb, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0,
/* U+F8C7 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0,
0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x10, 0xb,
0x0, 0x50, 0xf, 0x0, 0xb0, 0xf, 0x1, 0xd0,
0xb, 0x0, 0x78, 0x3c, 0x0, 0xb0, 0x2, 0xc3,
0x80, 0xb, 0x0, 0x1d, 0x34, 0x0, 0xb0, 0x1,
0xd3, 0x40, 0x6, 0x0, 0x1d, 0x38, 0x0, 0x0,
0x1, 0xc3, 0xc0, 0x0, 0x0, 0x3c, 0x1d, 0x0,
0x0, 0x7, 0x80, 0xf4, 0x0, 0x0, 0xf0, 0x3,
0xe0, 0x0, 0x7c, 0x0, 0xb, 0xea, 0xbf, 0x0,
0x0, 0x1b, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0,
0x0,
/* U+FFF75 "󿽵" */
0x2a, 0xaa, 0xaa, 0xa9, 0x3, 0xff, 0xff, 0xff,
0xfc, 0x38, 0x0, 0x0, 0x1, 0xd3, 0x89, 0x7,
0x3, 0xe, 0x38, 0x0, 0x0, 0x0, 0xe3, 0xff,
0xff, 0xff, 0xfe, 0x2a, 0xab, 0xff, 0xab, 0xe0,
0x1, 0xff, 0x44, 0xe, 0x6, 0xfe, 0x0, 0x82,
0xd2, 0xf9, 0x2, 0x6, 0xf8, 0x38, 0x30, 0x1b,
0xf8, 0x3, 0xea, 0xaf, 0xfe, 0xa9, 0x3f, 0xff,
0xff, 0xff, 0xe3, 0x80, 0x0, 0x1, 0xe, 0x38,
0x90, 0x20, 0x20, 0xe3, 0xea, 0xaa, 0xaa, 0xae,
0x1f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0,
0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 36, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 99, .adv_w = 320, .box_w = 11, .box_h = 16, .ofs_x = 4, .ofs_y = 2},
{.bitmap_index = 143, .adv_w = 320, .box_w = 12, .box_h = 18, .ofs_x = 4, .ofs_y = 1},
{.bitmap_index = 197, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 292, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 355, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 436, .adv_w = 320, .box_w = 10, .box_h = 6, .ofs_x = 5, .ofs_y = 7},
{.bitmap_index = 451, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 514, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 595, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 659, .adv_w = 320, .box_w = 10, .box_h = 16, .ofs_x = 5, .ofs_y = 2},
{.bitmap_index = 699, .adv_w = 320, .box_w = 14, .box_h = 16, .ofs_x = 3, .ofs_y = 2},
{.bitmap_index = 755, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 804, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 840, .adv_w = 320, .box_w = 16, .box_h = 10, .ofs_x = 2, .ofs_y = 5},
{.bitmap_index = 880, .adv_w = 320, .box_w = 4, .box_h = 14, .ofs_x = 8, .ofs_y = 3},
{.bitmap_index = 894, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 943, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 1018, .adv_w = 320, .box_w = 14, .box_h = 10, .ofs_x = 3, .ofs_y = 5},
{.bitmap_index = 1053, .adv_w = 320, .box_w = 16, .box_h = 14, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 1109, .adv_w = 320, .box_w = 16, .box_h = 14, .ofs_x = 2, .ofs_y = 3},
{.bitmap_index = 1165, .adv_w = 320, .box_w = 14, .box_h = 18, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 1228, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 1305, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 1382, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1463, .adv_w = 320, .box_w = 14, .box_h = 18, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 1526, .adv_w = 320, .box_w = 14, .box_h = 16, .ofs_x = 3, .ofs_y = 2},
{.bitmap_index = 1582, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 1645, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1745, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1809, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 1890, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1954, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 2017, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 2},
{.bitmap_index = 2089, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 2161, .adv_w = 320, .box_w = 14, .box_h = 18, .ofs_x = 3, .ofs_y = 1},
{.bitmap_index = 2224, .adv_w = 320, .box_w = 16, .box_h = 14, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 2280, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 2361, .adv_w = 320, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 3},
{.bitmap_index = 2421, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 2485, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = 3},
{.bitmap_index = 2555, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 2604, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = 3},
{.bitmap_index = 2674, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 1},
{.bitmap_index = 2746, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 2827, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 1}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x14, 0x62, 0x9b, 0x148, 0x182, 0x1ca, 0x1d1,
0x1e1, 0x26a, 0x2af, 0x2c0, 0x418, 0x47e, 0x488, 0x48d,
0x48f, 0x490, 0x4f9, 0x523, 0x600, 0x62b, 0x757, 0x76a,
0x773, 0x7b8, 0x7ca, 0x7e9, 0x874, 0x8af, 0x8b2, 0x8c2,
0x991, 0xa49, 0xa52, 0xa87, 0xad7, 0xdfb, 0xe05, 0xe35,
0xea1, 0xee3, 0xf4b, 0x1017, 0x15db, 0x1782
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 57669, .range_length = 6019, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
},
{
.range_start = 1048437, .range_length = 1, .glyph_id_start = 47,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 2,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_shared_20 = {
#else
lv_font_t material_symbols_shared_20 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 20, /*The maximum line height required by the font*/
.base_line = 0, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_SHARED_20*/

View File

@ -1,748 +0,0 @@
/*******************************************************************************
* Size: 24 px
* Bpp: 2
* Opts: --no-compress --no-prefilter --bpp 2 --size 24 --font MaterialSymbolsRounded.ttf -r 0xE145,0xE5C3,0xE770,0xEF40,0xEBCC,0xEFE6,0xEF4A,0xE5CD,0xF15C,0xE668,0xE92E,0xE326,0xEB97,0xE745,0xEC1C,0xE2C7,0xF720,0xF090,0xE8AF,0xE30F,0xE8FD,0xE9F4,0xE3F4,0xE316,0xE90F,0xEA07,0xE9B9,0xE159,0xE5D2,0xE28D,0xE5D4,0xE405,0xE89C,0xF8C7,0xE5D5,0xEF7A,0xE8B8,0xE9F7,0xE55D,0xF028,0xE1E0,0xE63E,0xE1A7,0xEB8E,0xEAD6,0xE3AF,0xFFF75 --format lvgl -o source-fonts/material_symbols_shared_24.c --force-fast-kern-format
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef MATERIAL_SYMBOLS_SHARED_24
#define MATERIAL_SYMBOLS_SHARED_24 1
#endif
#if MATERIAL_SYMBOLS_SHARED_24
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+E145 "" */
0x0, 0xf, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0,
0xf, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf,
0x0, 0x0, 0x0, 0xf0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0x0, 0x0,
0x0, 0xf0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0,
0xf0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0xf0,
0x0,
/* U+E159 "" */
0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2f, 0xff,
0x40, 0x0, 0x1, 0xff, 0xf7, 0xf0, 0x0, 0xf,
0xdf, 0xf0, 0xbe, 0x0, 0xbe, 0xf, 0xf0, 0xf,
0xd7, 0xf0, 0xf, 0xf0, 0x1, 0xff, 0x40, 0xf,
0xf0, 0x0, 0x28, 0x0, 0xf, 0xf0, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd,
/* U+E1A7 "" */
0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0,
0xfd, 0x0, 0x40, 0x3f, 0xd0, 0xb8, 0xf, 0xbd,
0xf, 0x83, 0xcb, 0xc0, 0xf8, 0xf2, 0xf0, 0xf,
0xbe, 0xf0, 0x0, 0xff, 0xf0, 0x0, 0xf, 0xf0,
0x0, 0x2, 0xf8, 0x0, 0x2, 0xff, 0x80, 0x2,
0xff, 0xf8, 0x2, 0xf3, 0xcf, 0x82, 0xf0, 0xf1,
0xf1, 0xf0, 0x3c, 0xf8, 0x60, 0xf, 0xf8, 0x0,
0x3, 0xf8, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x28,
0x0,
/* U+E1E0 "" */
0x0, 0x5, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0,
0x3f, 0xc0, 0x0, 0x7, 0xfd, 0x0, 0x0, 0xf,
0x0, 0x0, 0x0, 0xf0, 0x0, 0x7d, 0xf, 0xf,
0xff, 0xf0, 0xf0, 0xff, 0xff, 0xf, 0xf, 0xf7,
0xd0, 0xf0, 0xff, 0x3c, 0xf, 0x3, 0xc3, 0xc0,
0xf0, 0x3c, 0x3f, 0xff, 0xff, 0xc1, 0xff, 0xff,
0xf4, 0x0, 0xf, 0x0, 0x0, 0x0, 0xf0, 0x0,
0x0, 0xf, 0x40, 0x0, 0x3, 0xfc, 0x0, 0x0,
0x3f, 0xc0, 0x0, 0x1, 0xf4, 0x0,
/* U+E28D "" */
0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, 0xb,
0xfe, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf0, 0x0,
0x0, 0x0, 0xf, 0xf, 0x0, 0x0, 0x0, 0x0,
0xf0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf, 0x0,
0x0, 0x0, 0x0, 0xf0, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xf, 0x0, 0x0, 0x7,
0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff,
0xff, 0xf0, 0xf, 0x0, 0x0, 0x0, 0xf, 0x0,
0xf0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0xff, 0xff,
0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf4,
0x2d, 0x0, 0x0, 0x0, 0x7, 0x83, 0xc3, 0xc0,
0xf0, 0x3c, 0x3c, 0x3c, 0x3c, 0xf, 0x3, 0xc3,
0xc7, 0x83, 0xc0, 0xf0, 0x3c, 0x2d, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, 0xff,
0xf8,
/* U+E2C7 "" */
0x7f, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xe0,
0x0, 0x0, 0xf0, 0x1, 0xff, 0xff, 0xfd, 0xf0,
0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0,
0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xf,
0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd,
/* U+E30F "" */
0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff,
0xc0, 0x0, 0x0, 0x3, 0xc3, 0xc0, 0x0, 0x0,
0x3, 0xc3, 0xc0, 0x0, 0x0, 0x3, 0xc3, 0xc0,
0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0xff, 0xf0, 0x3c, 0xf, 0xff,
0xff, 0xfc, 0x0, 0x3f, 0xff, 0xf0, 0x3f, 0x0,
0xfc, 0xf, 0xf0, 0x3f, 0x0, 0xfc, 0xf, 0xff,
0xfc, 0x0, 0x3f, 0xff, 0xff, 0xf0, 0x3c, 0xf,
0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x3,
0xff, 0xc0, 0x0, 0x0, 0x3, 0xc3, 0xc0, 0x0,
0x0, 0x3, 0xc3, 0xc0, 0x0, 0x0, 0x3, 0xc3,
0xc0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0,
0x3, 0xff, 0xc0, 0x0,
/* U+E316 "" */
0x0, 0x14, 0x0, 0x0, 0xbd, 0x0, 0x2, 0xff,
0x40, 0xb, 0xc7, 0xd0, 0x2f, 0x1, 0xf4, 0xbc,
0x0, 0x7c, 0xb0, 0x0, 0x1c,
/* U+E326 "" */
0x1f, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff,
0xff, 0xfc, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x3c,
0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0xbf,
0xfe, 0x3c, 0x0, 0x0, 0xff, 0xff, 0x3c, 0x0,
0x0, 0xf0, 0xf, 0x3c, 0x0, 0x0, 0xf2, 0x8f,
0x3c, 0x0, 0x0, 0xf0, 0xf, 0x3c, 0x0, 0x0,
0xf0, 0xf, 0x3c, 0x0, 0x0, 0xf0, 0xf, 0x3f,
0xff, 0xf0, 0xf0, 0xf, 0x1f, 0xff, 0xf0, 0xf0,
0xf, 0x0, 0x0, 0x0, 0xf0, 0xf, 0xff, 0xff,
0xf0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xfe,
/* U+E3AF "" */
0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff,
0xfd, 0x0, 0x2, 0xfd, 0x3, 0x7f, 0x80, 0xb,
0xd0, 0x9, 0x7, 0xe0, 0x1f, 0x80, 0x1c, 0x1,
0xf4, 0x3e, 0xc0, 0x34, 0x0, 0x7c, 0x7c, 0x60,
0x70, 0x0, 0x3d, 0xb4, 0x30, 0xff, 0xff, 0xfe,
0xf0, 0x1f, 0xff, 0xc0, 0xf, 0xf0, 0xb, 0xff,
0xc0, 0xf, 0xf0, 0x3, 0xff, 0xe0, 0xf, 0xf0,
0x3, 0xff, 0xf4, 0xf, 0xbf, 0xff, 0xff, 0xc,
0x1e, 0x7c, 0x0, 0xd, 0x9, 0x3d, 0x3d, 0x0,
0x1c, 0x3, 0xbc, 0x1f, 0x40, 0x34, 0x2, 0xf4,
0xb, 0xd0, 0x60, 0x7, 0xe0, 0x2, 0xfd, 0xc0,
0x7f, 0x80, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0,
0x6, 0xff, 0x90, 0x0,
/* U+E3F4 "" */
0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0,
0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xff,
0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0x10, 0xf, 0xf0, 0x14, 0xf,
0x40, 0xff, 0x3, 0xc2, 0xfc, 0xf, 0xf0, 0xff,
0x7f, 0xf0, 0xff, 0x1f, 0xff, 0xff, 0x4f, 0xf0,
0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
0xfd,
/* U+E405 "" */
0x0, 0xf, 0xff, 0x0, 0xf, 0xff, 0x0, 0xf,
0xff, 0x0, 0xf, 0xff, 0x0, 0xf, 0x0, 0x0,
0xf, 0x0, 0x0, 0xf, 0x0, 0x0, 0xf, 0x0,
0x0, 0xf, 0x0, 0x0, 0xf, 0x0, 0xb, 0xef,
0x0, 0x3f, 0xff, 0x0, 0xbf, 0xff, 0x0, 0xff,
0xff, 0x0, 0xff, 0xff, 0x0, 0xbf, 0xfe, 0x0,
0x3f, 0xfc, 0x0, 0xb, 0xe0, 0x0,
/* U+E55D "" */
0x0, 0x1, 0x40, 0x0, 0x0, 0x3, 0xc0, 0x0,
0x0, 0xb, 0xe0, 0x0, 0x0, 0xf, 0xf0, 0x0,
0x0, 0x1e, 0xb4, 0x0, 0x0, 0x3d, 0x7c, 0x0,
0x0, 0x7c, 0x3d, 0x0, 0x0, 0xf4, 0x1f, 0x0,
0x0, 0xf0, 0xf, 0x0, 0x2, 0xe0, 0xb, 0x80,
0x3, 0xc0, 0x3, 0xc0, 0xb, 0x80, 0x2, 0xe0,
0xf, 0x0, 0x0, 0xf0, 0x1e, 0xb, 0xe0, 0xb4,
0x3e, 0xbf, 0xfe, 0xbc, 0x7f, 0xf8, 0x2f, 0xfd,
0xbf, 0x40, 0x1, 0xfe, 0x64, 0x0, 0x0, 0x19,
/* U+E5C3 "" */
0x7d, 0x7, 0xd0, 0x7d, 0xff, 0xf, 0xf0, 0xff,
0xff, 0xf, 0xf0, 0xff, 0x7d, 0x7, 0xd0, 0x7d,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7d, 0x7, 0xd0, 0x7d, 0xff, 0xf, 0xf0, 0xff,
0xff, 0xf, 0xf0, 0xff, 0x7d, 0x7, 0xd0, 0x7d,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7d, 0x7, 0xd0, 0x7d, 0xff, 0xf, 0xf0, 0xff,
0xff, 0xf, 0xf0, 0xff, 0x7d, 0x7, 0xd0, 0x7d,
/* U+E5CD "" */
0x10, 0x0, 0x0, 0x4b, 0x40, 0x0, 0x3d, 0x7d,
0x0, 0xf, 0xc1, 0xf4, 0x3, 0xf0, 0x7, 0xd0,
0xfc, 0x0, 0x1f, 0xbf, 0x0, 0x0, 0x7f, 0xc0,
0x0, 0x3, 0xf8, 0x0, 0x0, 0xff, 0xd0, 0x0,
0x3f, 0x1f, 0x40, 0xf, 0xc0, 0x7d, 0x3, 0xf0,
0x1, 0xf4, 0xbc, 0x0, 0x7, 0xd6, 0x0, 0x0,
0x18,
/* U+E5D2 "" */
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* U+E5D4 "" */
0x7d, 0xff, 0xff, 0x7d, 0x0, 0x0, 0x7d, 0xff,
0xff, 0x7d, 0x0, 0x0, 0x7d, 0xff, 0xff, 0x7d,
/* U+E5D5 "" */
0x0, 0x2f, 0xf8, 0xf, 0x2, 0xff, 0xff, 0x8f,
0xf, 0xe0, 0xb, 0xef, 0x2f, 0x0, 0x0, 0xff,
0x3c, 0x0, 0x0, 0x3f, 0xb8, 0x0, 0x3f, 0xff,
0xf0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0,
0xf0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0,
0xb8, 0x0, 0x0, 0x18, 0x3c, 0x0, 0x0, 0x3c,
0x2f, 0x0, 0x0, 0xf8, 0xf, 0xe0, 0xb, 0xe0,
0x2, 0xff, 0xff, 0x80, 0x0, 0x2f, 0xf8, 0x0,
/* U+E63E "" */
0x0, 0x1, 0xbf, 0xfe, 0x40, 0x0, 0x0, 0x2f,
0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff,
0xff, 0xc0, 0xf, 0xff, 0x90, 0x1, 0xbf, 0xf4,
0x3f, 0xe0, 0x0, 0x0, 0xb, 0xfd, 0x3f, 0x40,
0x0, 0x0, 0x0, 0xfd, 0x4, 0x0, 0x6f, 0xf9,
0x0, 0x14, 0x0, 0x7, 0xff, 0xff, 0xe0, 0x0,
0x0, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x3f,
0xd0, 0x7, 0xfc, 0x0, 0x0, 0x19, 0x0, 0x0,
0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0,
0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8,
0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0,
0x0, 0x0, 0x7, 0xe0, 0x0, 0x0,
/* U+E668 "" */
0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x3e,
0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x3, 0xf0,
0x0, 0x0, 0xf, 0xc0, 0x60, 0x0, 0x3f, 0x0,
0xbc, 0x0, 0xfc, 0x0, 0x3f, 0x3, 0xf0, 0x0,
0xf, 0xcf, 0xc0, 0x0, 0x3, 0xff, 0x0, 0x0,
0x0, 0xfc, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0,
/* U+E745 "" */
0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xc0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff,
0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xb8, 0xff, 0xfc, 0x0, 0x2f,
0xef, 0xff, 0xc0, 0xb, 0xff, 0x0, 0x0, 0x2,
0xff, 0xe0, 0x0, 0x0, 0xb8, 0xf8, 0x0, 0x0,
0x2e, 0x2e, 0x0, 0x0, 0x3, 0x8b, 0x80, 0x0,
0x0, 0x3e, 0xe0, 0x0, 0x0, 0x3, 0xf8, 0x0,
/* U+E770 "" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x80,
0x0, 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x7c,
0xbd, 0x0, 0x0, 0xf, 0x42, 0xff, 0xdf, 0x3,
0xe0, 0x7, 0xff, 0xfd, 0xbc, 0x0, 0x0, 0xff,
0xff, 0x0, 0x0, 0xf, 0xf7, 0xd0, 0x0, 0x0,
0xff, 0x8, 0xb, 0x40, 0xf, 0xf0, 0x1, 0xfe,
0x0, 0xff, 0x0, 0x3f, 0xfc, 0xf, 0xfc, 0xf,
0xff, 0xf0, 0xff, 0xf6, 0xff, 0xff, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0,
/* U+E89C "" */
0x7f, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xfe, 0x0,
0xf0, 0x0, 0x3f, 0x80, 0xf0, 0x0, 0x3f, 0xe0,
0xf0, 0x0, 0x3f, 0xf8, 0xf0, 0x0, 0x3f, 0xfd,
0xf0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0xf,
0xf0, 0x3, 0xc0, 0xf, 0xf0, 0x3, 0xc0, 0xf,
0xf0, 0x3, 0xc0, 0xf, 0xf0, 0xff, 0xff, 0xf,
0xf0, 0xff, 0xff, 0xf, 0xf0, 0x3, 0xc0, 0xf,
0xf0, 0x3, 0xc0, 0xf, 0xf0, 0x3, 0xc0, 0xf,
0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd,
/* U+E8AF "" */
0x7f, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff,
0xfc, 0x0, 0xf0, 0x0, 0x0, 0x3c, 0x0, 0xf0,
0x0, 0x0, 0x3c, 0x0, 0xf0, 0x0, 0x0, 0x3c,
0x3d, 0xf0, 0x0, 0x0, 0x3c, 0x3f, 0xf0, 0x0,
0x0, 0x3c, 0x3f, 0xf0, 0x0, 0x0, 0x3c, 0x3f,
0xf0, 0x0, 0x0, 0x3c, 0x3f, 0xf7, 0xff, 0xff,
0xfc, 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x3f, 0xfd,
0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x0, 0x0,
0xbf, 0x50, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff,
0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff,
0x0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0,
0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x5,
/* U+E8B8 "" */
0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff,
0x80, 0x0, 0x0, 0x7, 0x83, 0xc0, 0x0, 0xb,
0x9f, 0x83, 0xd6, 0xd0, 0x2f, 0xff, 0x43, 0xff,
0xf0, 0x3d, 0xb8, 0x0, 0x7d, 0xb8, 0xb8, 0x0,
0x14, 0x0, 0x3c, 0xbd, 0x2, 0xff, 0x40, 0xbc,
0x2f, 0x47, 0xff, 0xc3, 0xf4, 0xf, 0x4b, 0xff,
0xd3, 0xd0, 0xf, 0x4b, 0xff, 0xd3, 0xd0, 0x2f,
0x47, 0xff, 0xc3, 0xf4, 0xbd, 0x2, 0xff, 0x40,
0xbc, 0xb8, 0x0, 0x14, 0x0, 0x3c, 0x3d, 0xb8,
0x0, 0x7d, 0xb8, 0x2f, 0xff, 0x43, 0xff, 0xf0,
0xb, 0x9f, 0x83, 0xd6, 0xd0, 0x0, 0x7, 0x83,
0xc0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0,
0x2, 0xff, 0x0, 0x0,
/* U+E8FD "" */
0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff,
0xfd, 0x0, 0x2, 0xfd, 0x0, 0x7f, 0x80, 0xb,
0xd0, 0x0, 0x7, 0xe0, 0x1f, 0x0, 0xbe, 0x0,
0xf4, 0x3d, 0x3, 0xff, 0xc0, 0x7c, 0x7c, 0x3,
0x42, 0xd0, 0x3d, 0xb4, 0x0, 0x1, 0xd0, 0x1e,
0xf0, 0x0, 0x3, 0xc0, 0xf, 0xf0, 0x0, 0xf,
0x0, 0xf, 0xf0, 0x0, 0x2d, 0x0, 0xf, 0xf0,
0x0, 0x3c, 0x0, 0xf, 0xb4, 0x0, 0x0, 0x0,
0x1e, 0x7c, 0x0, 0x14, 0x0, 0x3d, 0x3d, 0x0,
0x3c, 0x0, 0x7c, 0x1f, 0x0, 0x3c, 0x0, 0xf4,
0xb, 0xd0, 0x0, 0x7, 0xe0, 0x2, 0xfd, 0x0,
0x7f, 0x80, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0,
0x6, 0xff, 0x90, 0x0,
/* U+E90F "" */
0x0, 0x6f, 0xf4, 0x0, 0x2, 0xff, 0xff, 0x40,
0xf, 0xd0, 0x1b, 0xd0, 0x2f, 0x0, 0x2, 0xf0,
0x3c, 0x0, 0x0, 0xb8, 0x78, 0x0, 0x0, 0x3c,
0xb4, 0x0, 0x0, 0x3c, 0xb4, 0x0, 0x0, 0x3c,
0xb4, 0x0, 0x0, 0x3c, 0x78, 0x0, 0x0, 0x3c,
0x3c, 0x0, 0x0, 0xb8, 0x2f, 0x0, 0x2, 0xf0,
0xb, 0xff, 0xff, 0xd0, 0x2, 0xff, 0xff, 0x40,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0,
0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0xe0, 0x0, 0x0, 0x7, 0xc0, 0x0,
/* U+E92E "" */
0x0, 0x3f, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x3c, 0x0, 0x0, 0x3c,
0x3c, 0x0, 0x0, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x0, 0x0, 0x3c, 0x3c, 0x0, 0x0, 0x3c,
0x3f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xf4,
/* U+E9B9 "" */
0x7d, 0x7, 0xff, 0xff, 0xfd, 0xff, 0xf, 0xff,
0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x7d,
0x7, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x7,
0xff, 0xff, 0xfd, 0xff, 0xf, 0xff, 0xff, 0xff,
0xff, 0xf, 0xff, 0xff, 0xff, 0x7d, 0x7, 0xff,
0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7d, 0x7, 0xff, 0xff,
0xfd, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf,
0xff, 0xff, 0xff, 0x7d, 0x7, 0xff, 0xff, 0xfd,
/* U+E9F4 "" */
0x0, 0x0, 0xb, 0xe0, 0x0, 0x0, 0x0, 0x0,
0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x7c,
0x0, 0x0, 0x0, 0x0, 0x3c, 0x7c, 0x0, 0x0,
0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0,
0xb, 0xe0, 0x0, 0x0, 0x5, 0x0, 0x3, 0x80,
0x0, 0x50, 0x3f, 0xc0, 0x3, 0x80, 0x3, 0xfc,
0xbf, 0xe0, 0xb, 0xd0, 0xb, 0xfe, 0xf0, 0xf0,
0x3f, 0xfc, 0xf, 0xf, 0xfa, 0xfe, 0xf9, 0x7f,
0xbf, 0xaf, 0x7f, 0xeb, 0xf0, 0xf, 0xeb, 0xfd,
0x1a, 0x41, 0xe0, 0xb, 0x41, 0xa4, 0x0, 0x1,
0xe0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xf4, 0x1f,
0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0,
0x0, 0x0, 0xfb, 0xef, 0x0, 0x0, 0x0, 0xbf,
0xc0, 0x3, 0xfe, 0x0, 0x2, 0xff, 0x80, 0x2,
0xff, 0x80, 0x3, 0xc3, 0xc0, 0x3, 0xc3, 0xc0,
0x3, 0xc3, 0xc0, 0x3, 0xc3, 0xc0, 0x2, 0xff,
0x80, 0x2, 0xff, 0x80, 0x0, 0xbe, 0x0, 0x0,
0xbe, 0x0,
/* U+E9F7 "" */
0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0,
0x0, 0xff, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0,
0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
0xfd,
/* U+EA07 "" */
0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff,
0xfd, 0x0, 0x2, 0xff, 0xef, 0xff, 0x80, 0xb,
0xd7, 0xc7, 0xcb, 0xe0, 0x1f, 0xb, 0x43, 0xd1,
0xf4, 0x3d, 0xf, 0x2, 0xe0, 0xbc, 0x7f, 0xff,
0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xfe,
0xf0, 0x2d, 0x0, 0xf0, 0xf, 0xf0, 0x2d, 0x0,
0xb4, 0xf, 0xf0, 0x2d, 0x0, 0xb4, 0xf, 0xf0,
0x2d, 0x0, 0xf0, 0xf, 0xbf, 0xff, 0xff, 0xff,
0xfe, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xf,
0x2, 0xe0, 0xbc, 0x1f, 0xb, 0x43, 0xd1, 0xf4,
0xb, 0xd7, 0xc7, 0xcb, 0xe0, 0x2, 0xff, 0xef,
0xff, 0x80, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0,
0x6, 0xff, 0x90, 0x0,
/* U+EAD6 "" */
0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0,
0x0, 0x0, 0xf, 0xf3, 0xf3, 0xf3, 0xc, 0xff,
0x32, 0x74, 0x35, 0xcf, 0xf3, 0x27, 0x82, 0xa8,
0xff, 0x32, 0x78, 0x1f, 0x4f, 0xf3, 0x27, 0x40,
0xf0, 0xff, 0x3f, 0x3f, 0xa, 0xf, 0xf0, 0x0,
0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
0xfd,
/* U+EB8E "" */
0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf0, 0x20, 0x0, 0x0, 0xf, 0xf0, 0x7c,
0x0, 0x0, 0xf, 0xf0, 0x3f, 0x0, 0x0, 0xf,
0xf0, 0xf, 0xc0, 0x0, 0xf, 0xf0, 0xf, 0xc0,
0x0, 0xf, 0xf0, 0x3f, 0x0, 0x0, 0xf, 0xf0,
0x7c, 0xf, 0xff, 0xf, 0xf0, 0x20, 0xf, 0xff,
0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd,
/* U+EB97 "" */
0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x34,
0xf, 0xf0, 0xaa, 0xaa, 0x3e, 0xf, 0xf0, 0xaa,
0xaa, 0x3e, 0xf, 0xf0, 0x0, 0x0, 0x34, 0xf,
0xf0, 0x1c, 0x0, 0x0, 0xf, 0xf0, 0xbc, 0xaa,
0xaa, 0xf, 0xf0, 0xbc, 0xaa, 0xaa, 0xf, 0xf0,
0x1c, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff,
0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd,
0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff,
0xf0, 0x0,
/* U+EBCC "" */
0x3, 0xc0, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x3,
0xc0, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0,
0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0x0, 0xf, 0xf0, 0xf0, 0xf0,
0xf0, 0xff, 0xf, 0xf, 0xf, 0xf, 0xf0, 0x0,
0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xf, 0xf0,
0xf0, 0xf0, 0xf0, 0xff, 0xf, 0xf, 0xf, 0xf,
0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
0xff, 0xfd,
/* U+EC1C "" */
0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x2f, 0x0,
0x0, 0x0, 0xbe, 0x0, 0x0, 0x2, 0xfc, 0x0,
0x0, 0xb, 0xf8, 0x0, 0x0, 0x2f, 0xf0, 0x0,
0x0, 0xbf, 0xe0, 0x0, 0x3, 0xf7, 0xe4, 0x0,
0xf, 0xcf, 0xff, 0xfd, 0x3f, 0x1, 0x6b, 0xfe,
0xbf, 0xe9, 0x40, 0xfc, 0x7f, 0xff, 0xf3, 0xf0,
0x0, 0x1b, 0xdf, 0xc0, 0x0, 0xb, 0xfe, 0x0,
0x0, 0xf, 0xf8, 0x0, 0x0, 0x2f, 0xe0, 0x0,
0x0, 0x3f, 0x80, 0x0, 0x0, 0xbe, 0x0, 0x0,
0x0, 0xf8, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0,
/* U+EF40 "" */
0x7d, 0x7, 0xd0, 0x7d, 0xf, 0xf0, 0xff, 0xf,
0xf0, 0xff, 0xf, 0xf0, 0xff, 0x7, 0xd0, 0x7d,
0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7d, 0x7, 0xd0, 0x0, 0xf,
0xf0, 0xff, 0x0, 0xb8, 0xff, 0xf, 0xf0, 0x2f,
0xe7, 0xd0, 0x7d, 0xb, 0xff, 0x0, 0x0, 0x2,
0xff, 0xe0, 0x0, 0x0, 0xb8, 0xf8, 0x7d, 0x0,
0x2e, 0x2e, 0xf, 0xf0, 0x3, 0x8b, 0x80, 0xff,
0x0, 0x3e, 0xe0, 0x7, 0xd0, 0x3, 0xf8, 0x0,
/* U+EF4A "" */
0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff,
0xfd, 0x0, 0x2, 0xfd, 0x0, 0x7f, 0x80, 0xb,
0xd0, 0x0, 0x7, 0xe0, 0x1f, 0x0, 0x0, 0x0,
0xf4, 0x3d, 0x0, 0x0, 0x0, 0x7c, 0x7c, 0x0,
0x0, 0x0, 0x3d, 0xb4, 0x0, 0x0, 0x0, 0x1e,
0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0,
0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xb4, 0x0, 0x0, 0x0,
0x1e, 0x7c, 0x0, 0x0, 0x0, 0x3d, 0x3d, 0x0,
0x0, 0x0, 0x7c, 0x1f, 0x0, 0x0, 0x0, 0xf4,
0xb, 0xd0, 0x0, 0x7, 0xe0, 0x2, 0xfd, 0x0,
0x7f, 0x80, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0,
0x6, 0xff, 0x90, 0x0,
/* U+EF7A "" */
0x1, 0xbf, 0x90, 0x0, 0x0, 0xbf, 0xff, 0x80,
0x0, 0x2f, 0x40, 0x7e, 0x0, 0x7, 0xc0, 0x0,
0xf4, 0x0, 0xb4, 0x0, 0x7, 0x80, 0xf, 0x0,
0x0, 0x3c, 0x0, 0xf0, 0x0, 0x3, 0xc0, 0xf,
0x0, 0x0, 0x3c, 0x0, 0xb4, 0x0, 0x7, 0x80,
0x7, 0xc0, 0x0, 0xf0, 0x0, 0x2f, 0x40, 0x7f,
0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x1, 0xbf,
0x83, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0,
0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xfc,
0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0,
0x8,
/* U+EFE6 "" */
0x0, 0xbe, 0x0, 0x3f, 0xc0, 0x3f, 0xfc, 0x3,
0xfc, 0xb, 0x82, 0xe0, 0xbf, 0xe0, 0xf0, 0xf,
0xf, 0xff, 0xf, 0x0, 0xf0, 0xff, 0xf0, 0xf0,
0xf, 0xf, 0xff, 0xf, 0x0, 0xf0, 0xff, 0xf0,
0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf,
0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0,
0xf, 0xf, 0xff, 0xf, 0x0, 0xf0, 0xff, 0xf0,
0xf0, 0xf, 0xf, 0xff, 0xf, 0x0, 0xf0, 0xff,
0xf0, 0xf0, 0xf, 0xb, 0xfe, 0xb, 0x82, 0xe0,
0x3f, 0xc0, 0x3f, 0xfc, 0x3, 0xfc, 0x0, 0xbe,
0x0,
/* U+F028 "" */
0x7f, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0,
0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xff, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x5,
0x5, 0x5, 0x5, 0xf, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xff, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf0,
0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0xff,
0xc0, 0xf, 0xf0, 0x3, 0xff, 0xfc, 0x0, 0xff,
0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfd,
/* U+F090 "" */
0x0, 0x3, 0xc0, 0x0, 0x0, 0x3, 0xc0, 0x0,
0x0, 0x3, 0xc0, 0x0, 0x0, 0x3, 0xc0, 0x0,
0x0, 0x3, 0xc0, 0x0, 0x0, 0x3, 0xc0, 0x0,
0x1, 0xd3, 0xc7, 0x40, 0x1, 0xf7, 0xdf, 0x40,
0x0, 0xbf, 0xfd, 0x0, 0x0, 0x2f, 0xf4, 0x0,
0x0, 0xb, 0xd0, 0x0, 0xf0, 0x1, 0x40, 0xf,
0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf,
0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd,
/* U+F15C "" */
0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x7f,
0xff, 0xd0, 0x0, 0x0, 0x1f, 0x80, 0x2f, 0x40,
0x0, 0x3, 0xd0, 0x0, 0x7c, 0x0, 0x0, 0xb8,
0x0, 0x2, 0xe0, 0x0, 0x2f, 0x0, 0x0, 0xf,
0x0, 0x1f, 0xf0, 0x0, 0x0, 0xf0, 0x3, 0xe0,
0x0, 0x0, 0xf, 0xe0, 0xb8, 0x0, 0x0, 0x0,
0xff, 0xcf, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xf0,
0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0,
0x0, 0xf, 0xb8, 0x0, 0x0, 0x0, 0x1, 0xf3,
0xe0, 0x0, 0x0, 0x0, 0x7e, 0x1f, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x2f, 0xff, 0xff, 0xff, 0xe0,
/* U+F720 "" */
0x0, 0x1, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xf4,
0x0, 0x0, 0xbf, 0x5f, 0xe0, 0x0, 0xbf, 0x40,
0x1f, 0xe0, 0x3f, 0x80, 0x0, 0x2f, 0xcf, 0xe0,
0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x3f, 0xff,
0x7f, 0x80, 0x2f, 0xdf, 0xf0, 0xbf, 0x5f, 0xe0,
0xff, 0x0, 0xbf, 0xe0, 0xf, 0xf0, 0x1, 0xf4,
0x0, 0xff, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x0,
0xf0, 0x0, 0xff, 0x0, 0xf, 0x0, 0xf, 0xfc,
0x0, 0xf0, 0x3, 0xf7, 0xf8, 0xf, 0x2, 0xfd,
0xb, 0xf4, 0xf1, 0xfe, 0x0, 0xb, 0xff, 0xfe,
0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x1f,
0x40, 0x0,
/* U+F8C7 "" */
0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x3c,
0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x5,
0x0, 0x3c, 0x0, 0x50, 0x1f, 0x0, 0x3c, 0x0,
0xf4, 0x3d, 0x0, 0x3c, 0x0, 0x7c, 0x7c, 0x0,
0x3c, 0x0, 0x3d, 0xb4, 0x0, 0x3c, 0x0, 0x1e,
0xf0, 0x0, 0x3c, 0x0, 0xf, 0xf0, 0x0, 0x3c,
0x0, 0xf, 0xf0, 0x0, 0x3c, 0x0, 0xf, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xb4, 0x0, 0x0, 0x0,
0x1e, 0x7c, 0x0, 0x0, 0x0, 0x3d, 0x3d, 0x0,
0x0, 0x0, 0x7c, 0x1f, 0x0, 0x0, 0x0, 0xf4,
0xb, 0xd0, 0x0, 0x7, 0xe0, 0x2, 0xfd, 0x0,
0x7f, 0x80, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0,
0x6, 0xff, 0x90, 0x0,
/* U+FFF75 "󿽵" */
0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff,
0xff, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf0,
0xd0, 0x28, 0x7, 0xf, 0xf0, 0x0, 0x0, 0x0,
0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x0, 0x2, 0xff, 0x80, 0xf,
0x0, 0x7f, 0xf4, 0x28, 0xf, 0xb, 0xfe, 0x0,
0x0, 0x2f, 0x7f, 0x90, 0x28, 0x7, 0xfd, 0xf8,
0x34, 0x1, 0xbf, 0xe0, 0xf0, 0x10, 0x6f, 0xf9,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf,
0xf0, 0xd0, 0x28, 0x7, 0xf, 0xf0, 0x0, 0x0,
0x0, 0xf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x2f,
0xff, 0xff, 0xff, 0xff
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 5},
{.bitmap_index = 49, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 129, .adv_w = 384, .box_w = 13, .box_h = 20, .ofs_x = 5, .ofs_y = 2},
{.bitmap_index = 194, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = 2},
{.bitmap_index = 264, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 385, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 465, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 565, .adv_w = 384, .box_w = 12, .box_h = 7, .ofs_x = 6, .ofs_y = 9},
{.bitmap_index = 586, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 666, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 766, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 847, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 3},
{.bitmap_index = 901, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 4, .ofs_y = 3},
{.bitmap_index = 973, .adv_w = 384, .box_w = 16, .box_h = 16, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 1037, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 5},
{.bitmap_index = 1086, .adv_w = 384, .box_w = 18, .box_h = 12, .ofs_x = 3, .ofs_y = 6},
{.bitmap_index = 1140, .adv_w = 384, .box_w = 4, .box_h = 16, .ofs_x = 10, .ofs_y = 4},
{.bitmap_index = 1156, .adv_w = 384, .box_w = 16, .box_h = 16, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 1220, .adv_w = 384, .box_w = 24, .box_h = 17, .ofs_x = 0, .ofs_y = 3},
{.bitmap_index = 1322, .adv_w = 384, .box_w = 16, .box_h = 12, .ofs_x = 4, .ofs_y = 6},
{.bitmap_index = 1370, .adv_w = 384, .box_w = 18, .box_h = 16, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 1442, .adv_w = 384, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 4},
{.bitmap_index = 1519, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 2},
{.bitmap_index = 1599, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 3},
{.bitmap_index = 1694, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1794, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 1894, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 2},
{.bitmap_index = 1974, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 4, .ofs_y = 3},
{.bitmap_index = 2046, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 2126, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 2264, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 2345, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 2445, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 2526, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 4},
{.bitmap_index = 2606, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 3},
{.bitmap_index = 2696, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = 2},
{.bitmap_index = 2786, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 2},
{.bitmap_index = 2866, .adv_w = 384, .box_w = 18, .box_h = 16, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 2938, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 3038, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 3119, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 3},
{.bitmap_index = 3200, .adv_w = 384, .box_w = 22, .box_h = 16, .ofs_x = 1, .ofs_y = 4},
{.bitmap_index = 3288, .adv_w = 384, .box_w = 16, .box_h = 16, .ofs_x = 4, .ofs_y = 4},
{.bitmap_index = 3352, .adv_w = 384, .box_w = 22, .box_h = 16, .ofs_x = 1, .ofs_y = 4},
{.bitmap_index = 3440, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = 2},
{.bitmap_index = 3530, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2},
{.bitmap_index = 3630, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 2}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_0[] = {
0x0, 0x14, 0x62, 0x9b, 0x148, 0x182, 0x1ca, 0x1d1,
0x1e1, 0x26a, 0x2af, 0x2c0, 0x418, 0x47e, 0x488, 0x48d,
0x48f, 0x490, 0x4f9, 0x523, 0x600, 0x62b, 0x757, 0x76a,
0x773, 0x7b8, 0x7ca, 0x7e9, 0x874, 0x8af, 0x8b2, 0x8c2,
0x991, 0xa49, 0xa52, 0xa87, 0xad7, 0xdfb, 0xe05, 0xe35,
0xea1, 0xee3, 0xf4b, 0x1017, 0x15db, 0x1782
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 57669, .range_length = 6019, .glyph_id_start = 1,
.unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 46, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
},
{
.range_start = 1048437, .range_length = 1, .glyph_id_start = 47,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 2,
.bpp = 2,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t material_symbols_shared_24 = {
#else
lv_font_t material_symbols_shared_24 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 23, /*The maximum line height required by the font*/
.base_line = -1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0,
.underline_thickness = 0,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MATERIAL_SYMBOLS_SHARED_24*/

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More